본문 바로가기
AI/Experiment

03. 다중선형회귀( Multiple Linear Regression )

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

선형회귀란 ? 

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

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

 

 

다중선형회귀란?

행렬식으로 나타내보면 다음과 같다.

tensorflow를 이용할 때 placeholder 생성 시 shape을 잘 맞춰주어야 한다. 그래야 matmul 함수를 사용했을 때 식이 성립되기 때문이다. 예를 들어 위의 식은 [ 3, 1 ] * [ 1 * 3 ] = [ 1 * 1 ] 이므로 성립 가능하다. 이 과정을 수식으로 나타내 가설을 세우면 다음과 같다.

 

독립 변수가 3개일 때
독립변수가 n개일 때

단순선형회귀에서 사용하던 가설에 x값을 여러개 추가하여 위의 식으로 가설을 세운다. 독립변수가 추가되어 변경된 가설을 사용하면 cost function식 또한 아래와 같이 변경된다.

 

 

code

1 ) sklearn module로 Solar.R, Wind, Temp가 170, 7.4, 67일 때의 Ozone 수치를 예측해보자.

# module import
from sklearn import linear_model
import numpy as np
import pandas as pd

# data load
df = pd.read_csv('/machine-deep-learning/machine learning/data/ozone.csv')
df = df[['Ozone','Solar.R','Wind','Temp']]

 

결측치를 확인해보자

df.isnull().sum()
Ozone      37
Solar.R     7
Wind        0
Temp        0
dtype: int64

 

결측치를 제거해주자

df = df.dropna(how='any', inplace=False)

 

이상치를 확인해보자

# 다음의 코드를 하나씩 실행한다
plt.boxplot(df["Solar.R"])
plt.boxplot(df["Temp"])
plt.boxplot(df["Ozone"])
plt.boxplot(df["Wind"])

 

Solar.R
Temp
Ozone
Wind

 

Ozone과 Wind에 이상치가 있으므로 제거해주자

## ozone
q1, q3 = np.percentile(df['Ozone'],[25,75])
irq = q3 - q1
upper = q3 + irq * 1.5
mask = df['Ozone'] > upper
df = df.loc[~mask]

## wind
q_1, q_3 = np.percentile(df['Wind'],[25,75])
irq = q_3 - q_1
up = q_3 + irq * 1.5
mask2 = df['Wind'] > up
df = df.loc[~mask2]

 

학습시킨 뒤 예측하면?

# learning data
X = df[['Solar.R','Wind','Temp']]
Y = df['Ozone']

# learning
lm = linear_model.LinearRegression()
lm.fit(X,Y)

# prediction
prediction = lm.predict([[170, 7.4, 67]])
print('예측값은 : {}'.format(prediction))
[27.97594664]

 

 

2 ) tensorflow로 점수가 80, 90, 50일 때의 출력값을 예측해보자.

import tensorflow as tf
import numpy as np
import pandas as pd

# 사용할 데이터
x_data = [[73,80,75],
          [93,88,93],
          [89,91,90],
          [96,98,100],
          [73,66,70]]
y_data = [[152],[185],[180],[196],[142]]
# plceholder
# 행이 몇개 입력될지 모르기 때문에 None으로 설정
# 열은 3개로 고정이기 때문에 X의 열은 3
# 학습시키는 종속 변수의 열은 1개이므로 Y의 열은 1
X = tf.placeholder(shape = [None,3], dtype = tf.float32)
Y = tf.placeholder(shape = [None,1], dtype = tf.float32)

# weight, bias
# x가 3열이기 때문에 [3,1]
W = tf.Variable(tf.random_normal([3,1]),name="Weight")
b = tf.Variable(tf.random_normal([1]), name="bias")

# Hypothesis
# matmul : 행렬계산
H = tf.matmul(X,W) + b

# cost function
cost = tf.reduce_mean(tf.square(H-Y))

# train node 생성
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.00000001)
train = optimizer.minimize(cost)

# runner session 필요
sess = tf.Session()
sess.run(tf.global_variables_initializer()) # 그래프 초기화

# learning
for step in range(30000):
    _,cost_val = sess.run([train,cost],
                         feed_dict={
                             X : x_data,
                             Y : y_data
                         })
    if step % 3000 == 0:
        print("cost값은 : {}".format(cost_val))
        
# prediction
print(sess.run(H, feed_dict = {X : [[80,90,50], ] }))
# 학습 중 cost값의 변화
cost값은 : 1362.474853515625
cost값은 : 113.27144622802734
cost값은 : 24.22825050354004
cost값은 : 17.8582763671875
cost값은 : 17.380420684814453
cost값은 : 17.322494506835938
cost값은 : 17.292247772216797
cost값은 : 17.266658782958984
cost값은 : 17.241649627685547
cost값은 : 17.216651916503906

# 결과는
[[113.24003]]

 

 

더보기

 

728x90
반응형