'단순회귀분석'에 해당되는 글 1건

  1. 2019.11.21 :: [파이썬, 텐서플로우] 단순회귀분석 (Simple Regression Analysis) 2
Python 파이썬/머신러닝 2019. 11. 21. 21:43

단순회귀분석(Simple Regression Analysis)

회귀분석이란 변수 사이의 인과관계를 증명하는 방법으로 단순회귀분석, 다중회귀분석, 로지스틱 회귀분석 등과 같이 종류가 다양합니다.

 

그 중에서 단순회귀분석은 하나의 독립변수(설명변수)와 하나의 종속변수(반응변수)에 대한 회귀분석을 말합니다.

 

이 블로그에서는 statsmodels 패키지를 사용하여 회귀분석한 것과, 텐서플로우를 사용하여 회귀분석한 것을 둘 다 해보겠습니다.

 

 

우선 statsmodels를 사용하여, 단순회귀분석을 구현해보겠습니다.

 

필요패키지를 가져옵니다.

import pandas as pd
import statsmodels.formula.api as sm

 

그 다음 데이터를 불러옵니다. 저는 가상의 데이터를 불러오겠습니다.

simpledata.csv
0.00MB

df = pd.read_csv('simpledata.csv')

 

이제 회귀 분석을 합니다.

model = sm.ols(formula = 'v2 ~ v1', data = df).fit()
model.summary()

과정에 따라 다르게 적용되지만 적용 기준이 없을 경우, 일반적으로 p값(P>|t| , 유의확률)이 0.05가 넘으면 무의미한 변수라고 하며 단순회귀분석을 할 수 없습니다. Adj.R-squared 는 조정 결정 계수로 0과 1사이에 있으며, 종속 변수와 독립변수 사이에 상관관계(인과관계가 아닙니다)가 높을수록 1에 가까워집니다. 

 

예시로 만든 그림을 보면 회귀식은 y(hat)=0.0991*v1+0.5051 으로 나오며, 만약 v1의 값이 1이라면 v2의 값은 0.6042라고 예측합니다.

 

 

이제 텐서플로우에서 단순회귀분석을 구현해보겠습니다.

 

필요패키지를 불러옵니다.

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

 

그 다음 데이터를 불러옵니다. 위에서 사용한 데이터를 다시 불러오겠습니다.

df = pd.read_csv('simpledata.csv')

 

그 후, 두 변수를 다루기 편하도록, 넘파이 행렬로 변환합니다.

data_y = np.array(df.v2)
data_x = np.array(df.v1)

 

이제 본격적으로 텐서플로우를 사용하겠습니다.

 

우선, simplesimple_regresstion 이라는 이름을 가진 그래프를 그립니다.

그 후, 외부데이터를 받아서 저장하는 변수인 placeholder를 그래프에 2개 추가합니다.

다음으로 상수를 정의하는 constant를 그래프에 추가합니다.

학습 중에 계속 변하는 변수인 get_variable을 두 개 추가시킵니다.

여기까지가 선형회귀에 필요한 변수입니다.

 

그 다음으로는 오차를 지정해주며, 이 오차를 줄이기위해 저는 경사하강법(GradientDescent Algorithm)을 사용하였습니다.

with tf.Graph().as_default() as simple_regresstion:
    X = tf.placeholder(tf.float32, [None], name='X')
    Y = tf.placeholder(tf.float32, [None], name='Y')
    lr = tf.constant(1e-3,tf.float32)
    W = tf.get_variable("W",dtype=tf.float32,initializer=tf.constant(1.,tf.float32))
    b = tf.get_variable("b",dtype=tf.float32,initializer=tf.constant(1.,tf.float32))
    
    h = W*X + b
    cost = tf.reduce_mean(tf.square(tf.subtract(h,Y)))
    train = tf.train.GradientDescentOptimizer(lr).minimize(cost)

 

여기까지가 그래프를 그리는 과정입니다.

 

이제 Session을 사용하여 방금 만든 그래프를 불러와 학습을 시킵니다.

with tf.Session(graph = simple_regresstion) as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(2000):
        _,l = sess.run([train,cost],feed_dict={X:data_x,Y:data_y})
        print("cost",l)
    weight, bias = sess.run([W,b])
print(weight, bias)

range에 있는 숫자를 변화시켜 학습횟수를 변경시킬 수 있습니다.

 

print("cost",1) 를 통해 오차가 줄어드는 것을 확인할 수 있으며, print(weight, bias)를 통해 회귀계수를 확인할 수 있습니다.

print(weight*1+bias)

 

예시 데이터로 v1에 1을 넣었을 때, v2는 0.7041902616620064가 나왔습니다.

 

 

이제 텐서플로우로 만든 회귀식을 그래프로 그려보겠습니다.

필요패키지입니다.

import matplotlib.pyplot as plt

 

그래프를 그리는 코드입니다.

plt.scatter(data_x,data_y) 
plt.plot(data_x,data_x*weight+bias,'r') 
plt.show()

찍힌 점들은 실제 데이터 점이며, 그어진 직선이 단순선형회귀를 통해 구해진 모델입니다.

 

posted by 스노(Snow)
: