✍ 책 파이썬 머신러닝 완벽 가이드 : 314pg
✍ https://blog.naver.com/leenk1006/222418662641
다항 회귀는 피처의 직선적 관계가 아닌 복잡한 다항 관계를 모델링 할 수가 있음. 다항식의 차수가 커질수록 매우 복잡한 피처간의 관계까지 모델링 가능함
하지만 다항 회귀의 차수(degree)를 높일수록 학습 데이터에만 너무 맞춘 학습이 이뤄지기 때문에, 테스트 데이터 환경에서는 오히려 예측 정확도가 떨어짐
즉, 차수가 높아질 수록 과적합의 문제가 크게 발생함
🎉 example
import numpy as np
import matplotlib.pyplot as plt
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_val_score
%matplotlib inline
# random 값으로 구성된 X값에 대해 Cosine 변환값을 반환.
def true_fun(X):
return np.cos(1.5 * np.pi * X)
# X는 0 부터 1까지 30개의 random 값을 순서대로 sampling 한 데이타 입니다.
np.random.seed(0)
n_samples = 30
X = np.sort(np.random.rand(n_samples))
# y 값은 cosine 기반의 true_fun() 에서 약간의 Noise 변동값을 더한 값입니다.
y = true_fun(X) + np.random.randn(n_samples) * 0.1
plt.figure(figsize=(14, 5))
degrees = [1, 4, 15]
# 다항 회귀의 차수(degree)를 1, 4, 15로 각각 변화시키면서 비교합니다.
for i in range(len(degrees)):
ax = plt.subplot(1, len(degrees), i + 1)
plt.setp(ax, xticks=(), yticks=())
# 개별 degree별로 Polynomial 변환합니다.
polynomial_features = PolynomialFeatures(degree=degrees[i], include_bias=False)
linear_regression = LinearRegression()
pipeline = Pipeline([("polynomial_features", polynomial_features),
("linear_regression", linear_regression)])
pipeline.fit(X.reshape(-1, 1), y)
# 교차 검증으로 다항 회귀를 평가합니다.
scores = cross_val_score(pipeline, X.reshape(-1,1), y,scoring="neg_mean_squared_error", cv=10)
coefficients = pipeline.named_steps['linear_regression'].coef_
print('\\nDegree {0} 회귀 계수는 {1} 입니다.'.format(degrees[i], np.round(coefficients),2))
print('Degree {0} MSE 는 {1:.2f} 입니다.'.format(degrees[i] , -1*np.mean(scores)))
# 0 부터 1까지 테스트 데이터 세트를 100개로 나눠 예측을 수행합니다.
# 테스트 데이터 세트에 회귀 예측을 수행하고 예측 곡선과 실제 곡선을 그려서 비교합니다.
X_test = np.linspace(0, 1, 100)
# 예측값 곡선
plt.plot(X_test, pipeline.predict(X_test[:, np.newaxis]), label="Model")
# 실제 값 곡선
plt.plot(X_test, true_fun(X_test), '--', label="True function")
plt.scatter(X, y, edgecolor='b', s=20, label="Samples")
plt.xlabel("x"); plt.ylabel("y"); plt.xlim((0, 1)); plt.ylim((-2, 2)); plt.legend(loc="best")
plt.title("Degree {}\\nMSE = {:.2e}(+/- {:.2e})".format(degrees[i], -scores.mean(), scores.std()))
Degree 1 회귀 계수는 [-2.] 입니다.
Degree 1 MSE 는 0.41 입니다.
Degree 4 회귀 계수는 [ 0. -18. 24. -7.] 입니다.
Degree 4 MSE 는 0.04 입니다.
Degree 15 회귀 계수는 [-2.98300000e+03 1.03900000e+05 -1.87417100e+06 2.03717220e+07
-1.44873987e+08 7.09318780e+08 -2.47066977e+09 6.24564048e+09
-1.15677067e+10 1.56895696e+10 -1.54006776e+10 1.06457788e+10
-4.91379977e+09 1.35920330e+09 -1.70381654e+08] 입니다.
Degree 15 MSE 는 182815433.48 입니다.
맨 왼쪽의 degree1 곡선은 너무 단순한 직선으로 단순 선형 회귀임.
⇒ 과소 적합 모델 MSE 는 0.41
가운데 degree4 곡선은 학습데이터를 바탕으로 테스트 데이터까지 비교적 잘 예측함. MSE 는 0.04 로 가장 뛰어난 예측 성능을 나타냄
맨 오른쪽의 degree 15 곡선은 데이터 세트를 지나치게 반영한 결과로('잡음 값까지 다 반영했다' 라고 적혀있음) 예측 곡선이 학습 데이터 세트만 정확히 예측하고, 테스트 값의 실제 곡선과는 완전히 다른 형태의 예측 곡선이 나옴.
⇒ 과적합이 심한 모델 MSE 는 182815433.48
⇒ degree15의 회귀 계수는 [-2.98300000e+03 1.03900000e+05..]⭐ 로 degree 1,4 와 비교할 수 없을 정도로 큰 값임
결론: 좋은 예측 모델은 학습데이터의 패턴을 잘 반영하면서도 복잡하지 않은 균형 잡힌(Balanced) 모델을 의미함. 학습데이터, 테스트데이터 점수 차이 적은 모델
⭐ e의 의미
-2.98300000e+03 는 -2983을 의미하며
-2.98300000e-03 는 -0.003을 의미함
'+' 를 사용하면 10에다가 + 뒤에 오는 숫자만큼의 지수(승)을 해주어 곱해주면 되며
'-'를 사용하면, 10에다가 - 뒤에 오는 숫자만큼의 지수(승)을 해주어 나누어주면 됨
규제는 일반적인 선형 회귀의 과적합 문제를 해결하기 위해서 회귀 계수에 페널티 값을 적용하는 것을 말함
앞서 진행했던 일반 선형 회귀 모델의 경우, 비용함수는 RSS(실제값과 예측값의 차이를 최소화)를 최소화하는 것만 고려함
⇒ 이에 따라 학습데이터에 지나치게 맞추게 되고(과적합), 회귀 계수가 쉽게 커짐
⇒ 변동성이 너무 커져, 테스트 데이터 세트에서의 예측 성능 저하
⇒ 균형(balance) 필요
비용함수 구성 요소 :
(학습데이터 잔차 오류 최소화) + (회귀 계수 크기 제어)
목표 : 비용 함수 최소화하는 W벡터를 찾는 것
위 목표는 릿지의 경우임
W는 회귀계수(혹은 기울기)를 의미함
여기서 알파(alpha)는 간혹 람다(lambda)라고도 불림
알파는 학습 데이터 적합 정도와 회기 계수 값의 크기를 제어를 수행하는 튜닝 파라미터임
알파의 역할
알파가 0 또는 매우 작은 값이면, 비용함수식은 일반 선형 함수와 동일한 MIn(RSS(W)+0)이 될 것임. 반대로 알파가 무한대 혹은 매우 큰 값이라면 RSS(W)값에 비해 알파*W^2의 값이 너무 커지게 되어, W값을 0 또는 매우 작게 만들어야 목표 달성 가능
⇒ 즉,
알파 값을 크게 하면 비용함수는 회귀계수W를 작게 해 과적합 개선
알파 값을 작게 하면 회귀 계수 W의 값이 커져도 상쇄 가능하기 때문에 학습데이터 적합 개선 가능
L2 규제는 비용 함수 목표에 alpha*W^2 를 넣어 W의 제곱에 대해 페널티를 부여하는 방식임
L2 규제를 적용한 회귀를 릿지(Ridge) 회귀라고 함
이는 회귀 계수 값의 크기를 감소시키는 형식임
L1 규제는 비용 함수 목표에 alpha*|W| 를 넣어 페널티를 부여하는 방식임
L1 규제를 적용한 회귀를 라쏘(Lasso) 회귀라고 하며
이는 영향력이 크지 않은 회귀 계수 값을 0으로 변환하는 형식임