▷ 오늘 학습 계획: 머신러닝 강의(10~11)
선형 회귀
입력 변수(특징) x가 하나인 경우 선형 회귀 문제는
주어진 학습데이터와 가장 잘 맞는 Hypothesis 함수 h를 찾는 문제가 된다.OLS: Ordinary Linear Least Square
잔차 평가
잔차(residue) = 내 모델과 실제값의 차이
잔차평가: 잔차의 평균이 0이고 정규분포를 따르는지 확인결정계수(R-Squared)
예측 값과 실제 값이 일치하면 결정계수 1 (결정계수가 높을 수록 좋은 모델)
import pandas as pd import statsmodels.formula.api as smf import numpy as np
# 데이터 만들기 data = {'x': [1., 2., 3., 4., 5.], 'y': [1., 3., 4., 6., 5.]} df = pd.DataFrame(data)
# 가설 세우기 lm_model = smf.ols(formula='y ~ x', data=df).fit() #y~x → y=ax+b
# 결과 확인 lm_model.params
# 잔차 확인 resid = lm_model.resid
# 결정계수 구하기 mu = np.mean(df.y) y=df.y y_hat = lm_model.predict() np.sum((y_hat-mu)**2)/np.sum((y-mu)**2) # lm_model.rsquared
통계적 회귀
import statsmodels.api as sm X=data['Length of Membership'] y=data['Yearly Amount Spent'] lm = sm.OLS(y, X).fit() lm.summary()
R-squared : 모형 적합도, y의 분산을 각각의 변수들이 약 99.8%로 설명할 수 있음(평균을 기준으로 데이터의 예측, 실제값이 가지는 편차를 계산)
Adj. R-squared : 독립변수가 여러 개인 다중회귀분석에서 사용
Prob(F-Statistic) : 회귀모형에 대한 통계적 유의미성 검정
(0.05 이하면 모집단에서도 의미가 있다고 볼 수 있음)
AIC: 내가 만든 모델이 내 데이터를 얼마나 반영하는지
(내가 만든 모델이 원래 정보를 얼마나 손실시키는지)회귀 모델 그리기
pred = lm.predict(X) sns.scatterplot(x=X, y=y) plt.plot(X, pred, 'r', ls='dashed', lw=3);
참값 vs 예측값
sns.scatterplot(x=y, y=pred) plt.plot([min(y), max(y)], [min(y), max(y)], 'r', ls='dashed', lw=3);
상수항(열) 추가
X = np.c_[X, [1]*len(X)]
lm = sm.OLS(y, X).fit() lm.summary()
cost function: 에러를 표현하는 도구로, 값이 작을수록 좋다.
모든 학습 데이터가 Hypothesis 함수와 에러 없이 정확히 일치할 때 Cost Function의 값은 0이다.
import numpy as np np.poly1d([2,-1])** 2 + np.poly1d([3,-5])**2 + np.poly1d([5,-6])**2 # poly1d([ 38, -94, 62])
import sympy as sym theta = sym.Symbol('theta') diff_th = sym.diff(38*theta**2 - 94*theta + 62, theta) diff_th # 76θ−94
Gradient Descent
미분을 통해 cost function의 최솟값을 찾는다.
- 학습률(Learning Rate)이 작으면 최솟값을 찾으러 가는 간격이 작아진다. 여러번 갱신해야 하지만 최솟값에 잘 도달할 수 있다.
- 학습률(Learning Rate)이 크면 최솟값을 찾으러 가는 간격이 커진다. 최솟값을 찾았다면 갱신횟수는 상대적으로 적을 수 있지만 수렴하지 않고 진동할 수도 있다.
다변수 데이터에 대한 회귀
특성(feature)이 여러개라면 multivariate linear regression 문제로 일반화할 수 있다.
BOSTON 집값 예측
# 데이터 나누기 from sklearn.model_selection import train_test_split X = boston_pd.drop('PRICE', axis=1) y = boston_pd['PRICE'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=13)
# LinearResgression from sklearn.linear_model import LinearRegression reg = LinearRegression() reg.fit(X_train, y_train)
# 모델 평가(RMS) import numpy as np from sklearn.metrics import mean_squared_error pred_tr = reg.predict(X_train) pred_test = reg.predict(X_test) rmse_tr = np.sqrt(mean_squared_error(y_train, pred_tr)) rmse_test = np.sqrt(mean_squared_error(y_test, pred_test)) print('RMSE of Train Data :', rmse_tr) print('RMSE of Test Data :', rmse_test)
# 성능 확인 plt.scatter(y_test, pred_test) plt.xlabel('Actual House Prices ($1000)') plt.ylabel('Predicted Prices') plt.title('Real vs Predicted') plt.plot([0,48], [0,48], 'r') plt.show()
X = boston_pd.drop(['PRICE', 'LSTAT'], axis=1)로 모델을 평가하면 성능은 나빠진다. 성능이 나빠진다고 그 변수를 제거할지 판단하기는 어렵다.
▷ 내일 학습 계획: 머신러닝 강의(12~14)