본문 바로가기
AI/Experiment

02. 단순선형회귀( Simple Linear Regression )

by _S0_H2_ 2020. 5. 11.
728x90
반응형

선형회귀란 ? 

선형 회귀(Linear Regression)는 회귀 문제를 예측할 때 사용하는 알고리즘 중 하나이다.

'독립 변수가 커질 때 종속 변수가 크거나 작게 변하는' 관계를 모델링 하는 것이다. 선형회귀는 보통 하나 이상의 독립 변수를 사용하여 모델링한다. 이 때, 독립 변수가 하나면 '단순선형회귀(simple linear regression)'라고 한다.

 

단순선형회귀란?

이 식에서 모델이 기울기(w1,w)절편(w0,b)을 바꿔가면서 최적의 기울기, 절편을 찾는다.

이 때, '최적이 되는 기준'은 평균제곱오차(MSE)의 값이 최소가 될 때이다. 

 

 

code

1 ) sklearn module

from sklearn.linear_model import LinearRegression

X = [[10.0], [8.0], [13.0], [9.0], [11.0], [14.0], [6.0], [4.0], [12.0], [7.0], [5.0]]
y = [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]

# 모델 생성 및 학습
model = LinearRegression()
model.fit(X, y)

# 기울기
print('기울기 : ', model.coef_)
# 절편
print('절편 : ', model.intercept_)

#  x=0, y=1일 때 모델의 출력 결과 예측
y_pred = model.predict([[0], [1]])
print('예측값 : ', y_pred)

 

기울기 :  [0.50009091]
절편 :  3.0000909090909094
예측값 :  [3.00009091 3.50018182]

 

데이터와 평균제곱오차 값이 최소일 때의 직선을 그려보자.

 

import matplotlib.pyplot as plt

plt.plot(X, y, 'o')
plt.plot(X,model.predict(X))
plt.show()

 

cf ) 최소제곱법, 리지 회귀, 라소 회귀 방법이 있다.

 

 

 

 

 

2 ) tensorlow module

 

tensorflow module로 간단한 데이터를 학습하고, 반복 학습해보자 !

 

# data set 설정
x_data = [1,2,3]
y_data = [1,2,3]

# placeholder
x = tf.placeholder(dtype = tf.float32)
y = tf.placeholder(dtype = tf.float32)

# weight, bias
# 한 개의 값만 예측하기 때문에 random_normal(한개!)
# random_normal : 랜덤으로 변수 한 개를 지정해준다
W = tf.Variable(tf.random_normal([1]), name = 'weight')
b = tf.Variable(tf.random_normal([1]), name = 'bias')

# hypothesis
# 모델에 적용할 수식을 설정한다
# 단순선형회귀이므로 다음의 수식을 사용한다.
H = W * x + b

# cost function
# H에서 y값을 뺀 뒤, 그 값을 제곱하여 평균을 구하자
cost = tf.reduce_mean(tf.square(H-y))

# train node 생성
# GradientDescentOptimizer : 경사하강법을 이용해 좋은 w값으로 이동한다
# 하강 시, 0.01의 값을 곱하면서 !
# 좋은 w값은 어떻게 구할까 ? cost가 최소값일 때 좋은 w값이구나 !
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01)
train = optimizer.minimize(cost)

# runner session
# global_variables_initializer() : 학습 전에 항상 초기화를 해주자!
sess = tf.Session()
sess.run(tf.global_variables_initializer())

# learning
# 3000번 학습하자
for step in range(3000):
    _,w_val,cost_val,b_val = sess.run([train,W,cost,b],
                            # 내가 학습시킬 데이터
                            feed_dict={
                                   x : x_data,
                                   y : y_data
                               })
    # 학습이 잘 되는지 확인용으로 print를 해주었다.
    if step % 300 == 0:
        print("w값 : {}, b값 : {}, cost값{}".format(w_val, b_val, cost_val))
        
# prediction
# 200 값을 넣으면 어떤 결과가 출력될까?
print(sess.run(H, feed_dict={ x : 200 }))
[200.03963]

cf ) GradientDescentOptimizer

 

728x90
반응형