4.3 다항회귀
import numpy as np
import matplotlib.pyplot as plt
m = 100
X = 6 * np.random.rand(m,1) - 3
y = 0.5 * X**2 + X + 2 + np.random.randn(m,1) # 약간의 노이즈 포함
plt.plot(X,y,"b.")
plt.show()
사이킷런의 PolynomialFeatures를 사용하여 훈련 데이터를 변환
from sklearn.preprocessing import PolynomialFeatures
poly_features = PolynomialFeatures(degree=2, include_bias=False)
X_poly = poly_features.fit_transform(X)
print(X[0])
print(X_poly[0])
[2.10576397] : X[0]
[2.10576397 4.43424189] : X_poly[0]
X_new=np.linspace(-3, 3, 100).reshape(100, 1)
X_new_poly = poly_features.transform(X_new)
y_new = lin_reg.predict(X_new_poly)
plt.plot(X, y, "b.")
plt.plot(X_new, y_new, "r-", linewidth=2, label="예측")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.legend(loc="upper left", fontsize=14)
plt.show()
4.4 학습 곡선
300인 초록선을 보면, 과대적합이 일어난 것으로, 다항 회귀의 차수가 높아질수록
훈련데이터에 overfitting 시킴을 알 수 있다.
단순 선형 회귀 모델의 학습 곡선을 살펴보자.
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
def plot_learning_curves(model, X, y):
X_train, X_val, y_train, y_val = train_test_split(X,y, test_size=0.2)
train_errors, val_errors = [], []
for m in range (1, len(X_train)):
model.fit(X_train[:m], y_train[:m])
y_train_predict = model.predict(X_train[:m])
y_val_predict = model.predict(X_val)
train_errors.append(mean_squared_error(y_train[:m], y_train_predict))
val_errors.append(mean_squared_error(y_val, y_val_predict))
plt.plot(np.sqrt(train_errors), "r-+", linewidth = 2, label = "train set")
plt.plot(np.sqrt(val_errors), "b-", linewidth = 3, label = "validation set")
plt.xlabel("size of train set")
plt.ylabel("RMSE")
plt.legend()
from sklearn.linear_model import LinearRegression
lin_reg = LinearRegression()
plot_learning_curves(lin_reg, X, y)
위와 같이 과소적합이 되었다고 볼 수 있다.
과소적합 모델의 전형적인 모습
- 훈련 세트 : train set이 0부터 증가할 때, rmse가 0부터 시작하고, 샘플이 추가됨에 따라 노이즈와 비선형적 속성으로 모델이 완벽히 학습하는 것은 불가능하다.
- 검증 세트 : validation set은 모델이 적은 수의 훈련데이터로 제대로 일반화하지 못하여 rmse가 2.5부터 시작하여 점점 감소하여 훈련 세트의 그래프와 가까워진다.
10차 다항 회귀 모델의 학습 곡선 (overfitting의 모습)
rom sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
polynomial_regression = Pipeline([
("poly_features", PolynomialFeatures(degree=10, include_bias = False)),
("lin_reg", LinearRegression())
])
plot_learning_curves(polynomial_regression, X, y)
plt.axis([0,80,0,3])
plt.show()
- 훈련 세트의 RMSE가 선형회귀보다 훨씬 낮다. (거의 1에 가까운 수치)
- 두 곡선 사이에 공간이 있다. 다시 말해 훈련 데이터에서의 모델 성능이 검증 데이터에서보다 훨씬 낫다는 뜻이며, 이는 과대적합 모델의 특징이다.
참고 문헌 :
https://book.naver.com/bookdb/book_detail.nhn?bid=16328592
'공부하는 습관을 들이자 > Machine Learning For Study' 카테고리의 다른 글
Hands-on ML : 4. 6 로지스틱 회귀 (0) | 2022.05.26 |
---|---|
Hands-on ML : 4. 5 릿지(Ridge),라쏘(Lasso),엘라스틱 넷(Elastic-net) 모델 훈련 (0) | 2022.05.20 |
Hands-on ML : 4. 2 확률적 경사하강법, 미니배치 경사 하강법 (0) | 2022.05.18 |
Hands-on ML : 4. 2 경사 하강법 (0) | 2022.05.17 |
Hands-on ML : 4. 선형 회귀 및 계산 복잡도 (시간복잡도, 공간복잡도) (0) | 2022.05.12 |