본문 바로가기
  • 데이터에 가치를 더하다, 서영석입니다.
공부하는 습관을 들이자/Machine Learning For Study

Hands-on ML : 4. 3 다항회귀 및 4.4 학습곡선

by 꿀먹은데이터 2022. 5. 19.

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

 

핸즈온 머신러닝

머신러닝 전문가로 이끄는 최고의 실전 지침서 텐서플로 2.0을 반영한 풀컬러 개정판 『핸즈온 머신러닝』은 지능형 시스템을 구축하려면 반드시 알아야 할 머신러닝, 딥러닝 분야 핵심 개념과

book.naver.com