Skip to content

Latest commit

 

History

History
143 lines (96 loc) · 4.54 KB

regularization.md

File metadata and controls

143 lines (96 loc) · 4.54 KB

규제 (Regularization)

모델 적합도

모델의 복잡도가 증가 할수록 보통 Training Error는 감소합니다.

image

일반적으로 train set의 score가 test set보다 조금 높음습니다.

  • 과대적합(Overfitting): 모델의 train set 성능이 test set보다 훨씬 높은 경우입니다.
  • 과소적합(Underfitting): train set와 test set 성능이 모두 낮거나, test set 성능이 오히려 더 높은 경우 입니다.

아래와 같이 Linear regression에서 과적합(Overfitting)이 발생할 수 있습니다.

image

Regularization과 Epoch를 비교하면 아래와 같습니다.

image

과적합 방지 방법

모델이 과적합 되게 학습하지 않고 일반성을 가질 수 있도록 파라미터값에 제약을 주는것을 말합니다. L1 규제(Lasso), L2 규제(Ridge), alpha 값으로 규제량을 조정합니다.

image

상세 예제는 다중회귀(Multiple Regression)을 참조합니다.

Ridge

Ridge 계수를 제곱한 값을 기준으로 규제를 적용합니다.

from sklearn.linear_model import Ridge

ridge = Ridge()
ridge.fit(train_scaled, train_target)
print(ridge.score(train_scaled, train_target))
print(ridge.score(test_scaled, test_target))

0.9894023149360563
0.9853164821839827

alpha를 매개변수로 규제의 강도를 조절할 수 있습니다. 이때, alpha값이 크면 규제 강도가 세짐으로 계수값을 더 줄이고 좀 더 과대적합 해소가 가능합니다.

alpha_list = [0.001, 0.01, 0.1, 1, 10, 100]
for alpha in alpha_list:
    # 릿지 모델을 만듭니다
    ridge = Ridge(alpha=alpha)
    # 릿지 모델을 훈련합니다
    ridge.fit(train_scaled, train_target)
    # 훈련 점수와 테스트 점수를 저장합니다
    train_score.append(ridge.score(train_scaled, train_target))
    test_score.append(ridge.score(test_scaled, test_target))

import matplotlib.pyplot as plt

plt.plot(np.log10(alpha_list), train_score)
plt.plot(np.log10(alpha_list), test_score)
plt.xlabel('alpha')
plt.ylabel('R^2')
plt.show()

이때의 결정계수는 아래와 같습니다.

image

alpha=1일때의 결정계수를 아래처럼 구할 수 있습니다.

ridge = Ridge(alpha=1)
ridge.fit(train_poly, train_target)

print(ridge.score(train_poly, train_target))
print(ridge.score(test_poly, test_target))

0.9894023149360563
0.9853164821839827

Lasso

Lasso는 계수의 절대값을 기준으로 규제를 적용합니다.

from sklearn.linear_model import Lasso

lasso = Lasso()
lasso.fit(train_scaled, train_target)
print(lasso.score(train_scaled, train_target))
print(lasso.score(test_scaled, test_target))

0.9886724935434511
0.9851391569633392

alpha를 매개변수로 규제의 강도를 조절할 수 있습니다. 이때, alpha값이 크면 규제 강도가 세짐으로 계수값을 더 줄이고 좀 더 과대적합 해소가 가능합니다.

train_score = []
test_score = []

alpha_list = [0.001, 0.01, 0.1, 1, 10, 100]
for alpha in alpha_list:
    # 라쏘 모델을 만듭니다
    lasso = Lasso(alpha=alpha, max_iter=10000)
    # 라쏘 모델을 훈련합니다
    lasso.fit(train_scaled, train_target)
    # 훈련 점수와 테스트 점수를 저장합니다
    train_score.append(lasso.score(train_scaled, train_target))
    test_score.append(lasso.score(test_scaled, test_target))
    
plt.plot(np.log10(alpha_list), train_score)
plt.plot(np.log10(alpha_list), test_score)
plt.xlabel('alpha')
plt.ylabel('R^2')
plt.show()    

이때 결과는 아래와 같습니다.

image

릿지처럼 동일하게 alpha=1일때를 구하면 아래와 같습니다.

lasso = Lasso(alpha=1, max_iter=10000)
lasso.fit(train_poly, train_target)

print(lasso.score(train_poly, train_target))
print(lasso.score(test_poly, test_target))

0.9889627859751756
0.9857778187186969