아는 사람이 졸업작품으로 '날씨에 따른 중국집 배달 수를 조사'하고 싶다고 하여서 참고하라고 만들어보았습니다.
우선 필요할 듯한 패키지입니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
import matplotlib.ticker as plticker
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import os
import tensorflow as tf
import statsmodels.formula.api as sm
from patsy import dmatrices
지인의 데이터를 확인하지 못하여 임의로 만들었습니다.
x1 x2 x3
1 0 0 - 맑음
0 1 0 - 흐림
0 0 1 - 비
0 0 0 - 눈
순위가 정해지지 않은 범주형 데이터를 분석할 때에는 변수를 위와 같이 만들어야합니다.
일단 데이터를 불러옵니다.
data = pd.read_csv('data.csv')
model = sm.ols(formula = 'y ~ x1 + x2 + x3',data=data).fit()
model.summary()
선형회귀표입니다.
P>|t| 가 0.05 보다 높으면 쓸모 없는 변수이지만, x1,x2,x3는 날씨라고 하는 한 변수의 더미변수이기 때문에 전부 버려야하는 상황이 아니면 버리지 않습니다.
Adj.R-squared 는 수정된 상관관계입니다. 실제로 종속변수에 영향을 주는 독립변수들에 의해 설명되는 분산의 비율을 알려줍니다. 이번 블로그의 주제인 '날씨에 따른 중국집 배달 수를 조사'는 사회과학에 속하기에 시계열, 패널 데이터가 아닌 이상 결정계수가 낮을 가능성이 매우 크지만, 적절한 추정방법을 사용했다면 작더라도 상관은 없습니다.
다루기 편하게 x와 y를 NumPy 배열로 변경합니다.
multi_y = np.array(data.y)
df_x = data[["x1", "x2", "x3"]]
multi_x = df_x.as_matrix()
그 다음부터는 본격적으로 tensorflow를 사용하겠습니다.
with tf.Graph().as_default() as multi_regresstion:
num_x = 3 # x변수는 몇개?
X = tf.placeholder(tf.float32, [None, num_x], name='X')
Y = tf.placeholder(tf.float32, [None], name='Y')
lr = tf.constant(1e-3,tf.float32)
W = tf.get_variable("W", [1,num_x], tf.float32)
b = tf.get_variable("b",dtype=tf.float32,initializer=tf.constant(1.,tf.float32))
h = tf.matmul(W,X,transpose_b=True) + b
cost = tf.reduce_mean(tf.square(tf.subtract(h,Y)))
train = tf.train.GradientDescentOptimizer(lr).minimize(cost)
우선 multi_regresstion이라는 이름을 가진 그래프를 만듭니다.
그후 placeholder 2개를 그래프에 추가합니다. placeholder는 외부데이터를 받아서 저장하는 변수로,
tf.placeholder(자료형, 텐서모양,이름)으로 구성됩니다.
tf.constant는 상수를 정의해주며, tf.constant(값, 자료형)으로 구성됩니다.
tf.get_variable은 학습 중에 계속 변하는 변수이며, tf.get_variable(이름,자료형,초기값)으로 구성됩니다.
여기까지가 선형회귀에 필요한 변수입니다.
cost는 계산할 오차이며, 이 오차를 줄이기 위해 GradientDescent알고리즘을 이용하였습니다.
이제 그래프 그리기는 모두 끝났으며, Session을 사용하여 방금 만든 그래프를 불러옵니다.
with tf.Session(graph=multi_regresstion) as sess:
sess.run(tf.global_variables_initializer())
for i in range(3000):
_,l = sess.run([train,cost],feed_dict={X:multi_x,Y:multi_y})
print("loss",l)
W_multi, b_multi = sess.run([W,b])
학습을 진행할 수록 loss(cost)가 줄어드는 것을 볼 수 있습니다. (만약 NA값이 뜨거나 점점 커지면 식의 설명력이 너무 낮아서 변수를 바꾸거나 다른 방법을 써야 합니다. 이건 나중에 쓸 일이 있으면 올리겠습니다.)
for j in range(len(multi_x)):
sum = 0
for i in range(3):
sum += W_multi[0][i] * multi_x[j,i]
print(multi_y[j],sum+b_multi)
print(W_multi,b_multi)
이제 학습을 마쳤으니 결과를 확인할 차례입니다.
실행시에 위와 비슷한 결과가 나옵니다.
결과적으로
h = -2.593823*x1 + 1.0692451*x2 + 3.6352885*x3 + 5.5272436
라는 식을 얻을 수 있습니다.
def weather(weather):
if weather == '맑음':
a,b,c = 1,0,0
elif weather == '흐림':
a,b,c = 0,1,0
elif weather == '비':
a,b,c = 0,0,1
elif weather == '눈':
a,b,c = 0,0,0
else:
a,b,c = 'error'
d = W_multi[0][0]*a+W_multi[0][1]*b+W_multi[0][2]*c+b_multi
return(a,b,c,d)
이제 새로운 값을 얻었을 경우 값 예측을 만들면 됩니다.
weather('눈')
'Python 파이썬 > 머신러닝' 카테고리의 다른 글
군집 분석 (클러스터 분석) (0) | 2019.11.12 |
---|---|
K-최근접 이웃 알고리즘 (KNN) 간단한 파이썬 코드 (0) | 2019.11.11 |
K-최근접 이웃 알고리즘 (KNN) (0) | 2019.11.11 |
넘파이 NumPy (0) | 2019.10.11 |
머신러닝의 개념 (0) | 2019.10.09 |