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