더북(TheBook)

왼쪽 위 그래프는 편향이 높은 모델을 보여 줍니다. 이 모델은 훈련 정확도와 교차 검증 정확도가 모두 낮습니다. 훈련 데이터에 과소적합되었다는 것을 나타냅니다. 이 문제를 해결하는 일반적인 방법은 모델의 파라미터 개수를 늘리는 것입니다. 예를 들어 추가적인 특성을 수집하거나 만듭니다. 또는 서포트 벡터 머신(SVM)이나 로지스틱 회귀 분류기에서 규제 강도를 줄입니다.

오른쪽 위 그래프는 분산이 높은 모델을 보여 줍니다. 훈련 정확도와 교차 검증 정확도 사이에 큰 차이가 있다는 것을 나타냅니다. 과대적합 문제를 해결하려면 더 많은 훈련 데이터를 모으거나 모델 복잡도를 낮추거나 규제를 증가시킬 수 있습니다. 규제가 없는 모델에서는 특성 선택(4장)이나 특성 추출(5장)을 통해 특성 개수를 줄여 과대적합을 감소할 수 있습니다. 더 많은 훈련 데이터를 수집하는 것이 보통 과대적합의 가능성을 줄이지만 항상 도움이 되는 것은 아닙니다. 예를 들어 훈련 데이터에 잡음이 아주 많거나 모델이 이미 거의 최적화가 된 경우입니다.

다음 절에서 검증 곡선을 사용하여 이런 문제들을 다루는 법을 알아보겠습니다. 먼저 사이킷런의 학습 곡선 함수를 사용하여 모델을 평가해 보죠.

>>> import matplotlib.pyplot as plt
>>> from sklearn.model_selection import learning_curve

>>> pipe_lr = make_pipeline(StandardScaler(),
...                         LogisticRegression(penalty='l2',
...                                            random_state=1))
>>> train_sizes, train_scores, test_scores =\
...                 learning_curve(estimator=pipe_lr,
...                                X=X_train,
...                                y=y_train,
...                                train_sizes=np.linspace(
...                                  0.1, 1.0, 10),
...                                cv=10,
...                                n_jobs=1)
>>> train_mean = np.mean(train_scores, axis=1)
>>> train_std = np.std(train_scores, axis=1)
>>> test_mean = np.mean(test_scores, axis=1)
>>> test_std = np.std(test_scores, axis=1)

>>> plt.plot(train_sizes, train_mean,
...          color='blue', marker='o',
...          markersize=5, label='Training accuracy')

>>> plt.fill_between(train_sizes,
...                  train_mean + train_std,
...                  train_mean - train_std,
...                  alpha=0.15, color='blue')

>>> plt.plot(train_sizes, test_mean,
...          color='green', linestyle='--',
...          marker='s', markersize=5,
...          label='Validation accuracy')

>>> plt.fill_between(train_sizes,
...                  test_mean + test_std,
...                  test_mean - test_std,
...                  alpha=0.15, color='green')
>>> plt.grid()
>>> plt.xlabel('Number of training examples')
>>> plt.ylabel('Accuracy')
>>> plt.legend(loc='lower right')
>>> plt.ylim([0.8, 1.03])
>>> plt.tight_layout()
>>> plt.show()
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.