Machine Learning_5

YJ·2023년 5월 19일
0

▷ 오늘 학습 계획: 머신러닝 강의(10~11)

📖 Chapter 05_Linear Regression

1) Regression

선형 회귀

입력 변수(특징) 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()

2) Cost Function

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)

[이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.]

0개의 댓글