import tensorflow.compat.v1 as tf
from tensorflow.python.framework import ops
import numpy as np
from sklearn.datasets import load_iris
ops.reset_default_graph()
def regulRegresor(y, X, RegType, Rconst):
regression_type = RegType # LASSO, Ridge
num_cols = X.shape[1]
x_data = tf.placeholder(shape=[None, num_cols], dtype=tf.float32)
y_target = tf.placeholder(shape=[None,1],dtype=tf.float32)
A = tf.Variable(tf.random_normal(shape=[num_cols,1])) # Weight Vector
b = tf.Variable(tf.random_normal(shape=[1, 1])) # bias Vector
with tf.Session() as sess:
fomula = tf.add(tf.matmul(x_data,A), b)
if regression_type == 'LASSO':
lasso_params = tf.constant(0.9, dtype=tf.float32) # limit slope
heavyside_step = tf.truediv(1., tf.add(tf.exp(tf.multiply(tf.subtract(A, lasso_params), -50)), 1))
regularization = tf.multiply(99., heavyside_step)
loss = tf.add(tf.reduce_mean(tf.square(y_target-fomula)), regularization)
elif regression_type == 'Ridge':
ridge_params = tf.constant(Rconst, dtype=tf.float32)
ridge_loss = tf.reduce_mean(tf.square(A))
loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target-fomula)), tf.multiply(ridge_params, ridge_loss)), 0)
opt = tf.train.GradientDescentOptimizer(learning_rate=0.0001)
train_step = opt.minimize(loss) #optimizer를 이용해 loss값을 최소화 시키는 A, b를 찾는다.
init = tf.global_variables_initializer()
init.run()
loss_vec = []
preloss =0
for i in range(100):
rnd_idx = np.random.choice(len(X), size = 2500000)
rnd_x = X.iloc[rnd_idx].values.reshape(-1,num_cols)
rnd_y = y_return.iloc[rnd_idx].values.reshape(-1,1)
my_dict = {x_data:rnd_x, y_target:rnd_y}
sess.run(train_step, feed_dict=my_dict)
temp_loss = sess.run(loss, feed_dict=my_dict)
loss_vec.append(temp_loss[0])
if i % 50 == 0:
print('step={}: A={}, b={}, Loss={}'.format(i+1, A.eval(), b.eval(), temp_loss))
if abs(preloss - temp_loss[0]) <= 0.001:break
else:
preloss = temp_loss[0]
slope = A.eval()
cept = b.eval()
return slope, cept, loss_vec
코드 설명:위 코드는 텐서플로우로 구현한 Lasso와 Ridge의 Regularization code이다.
문제 : 가중치 벡터와 loss 값이 발산하는 문제를 겪었다. 가중치값이 일정한 값까지 표기되다가 지속적으로 nan이 뜨는 문제
해결방법: 이는 learning rate가 지나치게 커서 발생하는 현상으로 learning rate를 더 작게 줄여 해결할 수 있다.
'Data Analysis and ML, DL > Tensorflow' 카테고리의 다른 글
[Tensorflow] 가중치 값이 NaN값으로 표시 될 때 (0) | 2020.11.22 |
---|---|
[sklearn] 사이킷런으로 대용량 데이터 분석하기 (0) | 2020.11.20 |
Colab에서 Tensorboard 실행 (0) | 2020.11.15 |
Colab에서 Tensorboard 사용하기 (0) | 2020.11.15 |
Tensorflow로 구현한 Lasso, Ridge (0) | 2020.11.12 |