여기서 보듯이 깊이가 1인 결정 트리는 훈련 데이터에 과소적합된 것 같습니다. 이전 절에서 보았던 가지치기가 없는 결정 트리와는 반대입니다.23
>>> ada = ada.fit(X_train, y_train)
>>> y_train_pred = ada.predict(X_train)
>>> y_test_pred = ada.predict(X_test)
>>> ada_train = accuracy_score(y_train, y_train_pred)
>>> ada_test = accuracy_score(y_test, y_test_pred)
>>> print('에이다부스트의 훈련 정확도/테스트 정확도 %.3f/%.3f'
... % (ada_train, ada_test))
에이다부스트의 훈련 정확도/테스트 정확도 1.000/0.917
에이다부스트 모델은 훈련 데이터셋의 모든 클래스 레이블을 정확하게 예측하고 깊이가 1인 결정 트리에 비해 테스트 데이터셋 성능도 좀 더 높습니다. 훈련 성능과 테스트 성능 사이에 간격이 크므로 모델의 편향을 줄임으로써 추가적인 분산이 발생했습니다.
예시를 위해 간단한 예제를 사용했지만 에이다부스트 분류기의 성능이 깊이가 1인 결정 트리에 비해 좀 더 향상되었습니다. 이전 절에 훈련했던 배깅 분류기의 정확도와 매우 비슷한 점수를 달성했습니다. 테스트 데이터셋을 반복적으로 사용하여 모델을 선택하는 것은 나쁜 방법입니다.
6장에서 자세히 언급했듯이 일반화 성능을 매우 낙관적으로 추정하게 됩니다.
23 역주 사이킷런 추정기의 fit 메서드는 ada.fit(...).predict(...)처럼 다른 메서드를 연결하여 쓸 수 있도록 객체 자신을 반환합니다. 그 외에는 이 절의 예제에서처럼 fit 메서드의 반환값을 다시 변수에 저장할 필요는 없습니다. 정확도를 계산하려면 ada.score(X_train, y_train)처럼 모델에서 제공하는 score 메서드를 사용하는 것이 더 편리합니다.