머신러닝은 학습하려는 문제의 유형에 따라 크게 다음과 같은 세 가지로 분류할 수 있다.
상관관계 분석 : 변수 간의 관련성을 분석
회귀분석
단순회귀분석
단순선형회귀모델에서 최소제곱법을 이용해 회귀계수를 구한다.
이 회귀계수의 목적은 관찰된 자료를 가장 잘 표현하는 직선을 구하기 위함이다.
(최적의 추세선)
잔차 : 적합한 추세선과 실제 자료의 차이를 잔차라고한다. 여기서 모든 잔차의 합은 0인데, 회귀계수를 구하려면 잔차를 제곱(최소제곱법)하여 회귀계수를 구한다.
잔차제곱의 합이 최소가 되는 것이 목표이며, 그 값을 구하려면 미분을 이용해야 한다. (y절편,기울기를 구하므로 편미분을 사용)
[우] : cost(손실)그래프. 기울기가 0이 되는 지점(w)이 최적의 추세선이다.
from sklearn.datasets import make_regression
make_regression()
이 있다.from sklearn.datasets import make_regression
x,y,coef = make_regression(n_samples=50, n_features=1,bias=100,coef=True)
#회귀식(모델) => y = wx+b :: y = 89.47.. * x + 100
선형회귀계수 (89.47..) 을 구해 회귀식모델을 만들었다. 이를 통해 미지수 값을 예측할 수 있다.
x값에 임의의 수를 넣어보자.
#미지수 값 예측
y_pred_new = 89.474 * 33 + 100
print(y_pred_new) #3052.64
from sklearn.linear_model import LinearRegression
from sklearn.linear_model import LinearRegression
model = LinearRegression()
fit_model = model.fit(xx,yy) #학습데이터로 모델 추정. bias(절편),기울기 얻음
print('기울기',fit_model.coef_) #89.47
print('bias',fit_model.intercept_) #100.0 #방법1과 같음
predict
: 얻어낸 계수로 예측을 할때 LinearRegression에서는 예측값 확인 함수를 지원한다.#기존 학습데이터로 검정(2차원배열값)
y_new = fit_model.predict(xx[[0]])
print('y_new : ',y_new) #-52.172
#새로운 자료로 예측
y_new = fit_model.predict([[12]])
# result : 1173.691
import statsmodels.formula.api as smf
최소자승법 : 잔차제곱합(RSS: Residual Sum of Squares)를 최소화하는 가중치 벡터를 구하는 방법
model변수는 smf의 ols(최소제곱법)을 사용하여 회귀모형을 만든다.
Formula = '종속변수 ~ 독립변수'
형식에 맞춰 분석하고자 하는 종속변수(왼쪽)와 독립변수(오른쪽)를 넣으면된다.
data에는 사용하고자하는 데이터를 넣어주면 된다. fit은 모형을 적합시킨다
import statsmodels.formula.api as smf
import pandas as pd
x1 = xx.flatten() #2->1차원으로 축소
y1 = yy
data = np.array([x1,y1])
df = pd.DataFrame(data.T) #배열 전치
#formula 종속~독립변수
model2 = smf.ols(formula='y1 ~ x1',data=df).fit()
print(model2.summary()) #ols가 지원하는 보고서
예측하는 방법
#예측 (검정)
new_df = pd.DataFrame({'x1':[-1.70073563,-0.67794537]})
new_pred = model2.predict(new_df)
print(new_pred)
#새로운 값으로 예측
new2_df = pd.DataFrame({'x1':[-1.000,12]})
new2_pred = model2.predict(new2_df)
print(new2_pred)
IQ와 시험성적 간의 인과관계 확인. 시험점수값 예측하기
score_iq = pd.read_csv("../testdata/score_iq.csv")
sid score iq academy game tv
0 10001 90 140 2 1 0
1 10002 75 125 1 3 3
....
score_iq = pd.read_csv("../testdata/score_iq.csv")
iq = score_iq.iq
score = score_iq.score
# 상관계수 확인
print(np.corrcoef(iq,score)) #양의상관관계 : 0.88
print(score_iq.corr())
linregress
model = stats.linregress(iq,score)
print('slope: ',model.slope) #기울기 0.651
print('intercept: ',model.intercept) #절편 -2.85
print('pvalue: ',model.pvalue) #pvalue 2.84e-50
print('stderr : ',model.stderr) #표준오차 0.0285
pvalue < 0.05 이므로 (iq/score)는 인과관계가 있다.
slope
: iq는 시험성적에 0.651배 만큼 영향을 준다
Cost Minimization.
predict
함수를 지원하지 않아 수식을 직접 작성한다.
plt.scatter(iq,score)
plt.plot(iq,model.slope * iq + model.intercept)
plt.show()
점수 예측
#수식
preScore = model.slope * 112 + model.intercept
print(preScore)
#함수
# 새로운 iq값으로 성적 예측
new_df = pd.DataFrame({'iq':[55,66,77,88,99,111]})
print('점수예측값',np.polyval([model.slope,model.intercept],\
new_df))
점수예측값 [32.97] [40.13] [47.30] [54.46] [61.63] [69.45]