출력된 정확도 값을 보면 가지치기가 없는 결정 트리는 모든 훈련 샘플을 정확하게 예측했습니다. 테스트 데이터셋의 정확도는 확실히 낮기 때문에 모델의 분산이 높다는 것(과대적합)을 나타냅니다.
>>> bag = bag.fit(X_train, y_train)
>>> y_train_pred = bag.predict(X_train)
>>> y_test_pred = bag.predict(X_test)
>>> bag_train = accuracy_score(y_train, y_train_pred)
>>> bag_test = accuracy_score(y_test, y_test_pred)
>>> print('배깅의 훈련 정확도/테스트 정확도 %.3f/%.3f'
... % (bag_train, bag_test))
배깅의 훈련 정확도/테스트 정확도 1.000/0.917
결정 트리와 배깅 분류기의 훈련 정확도가 훈련 데이터셋에서 비슷하지만 (둘 다 100%) 테스트 데이터셋의 정확도로 미루어 보아 배깅 분류기가 일반화 성능이 더 나을 것 같습니다. 다음에는 결정 트리와 배깅 분류기의 결정 경계를 비교해 봅시다.
>>> x_min = X_train[:, 0].min() - 1
>>> x_max = X_train[:, 0].max() + 1
>>> y_min = X_train[:, 1].min() - 1
>>> y_max = X_train[:, 1].max() + 1
>>> xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
... np.arange(y_min, y_max, 0.1))
>>> f, axarr = plt.subplots(nrows=1, ncols=2,
... sharex='col',
... sharey='row',
... figsize=(8, 3))
>>> for idx, clf, tt in zip([0, 1],
... [tree, bag],
... ['Decision tree', 'Bagging']):
... clf.fit(X_train, y_train)
...
... Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
... Z = Z.reshape(xx.shape)
... axarr[idx].contourf(xx, yy, Z, alpha=0.3)
... axarr[idx].scatter(X_train[y_train==0, 0],
... X_train[y_train==0, 1],
... c='blue', marker='^')
... axarr[idx].scatter(X_train[y_train==1, 0],
... X_train[y_train==1, 1],
... c='green', marker='o')
... axarr[idx].set_title(tt)
>>> axarr[0].set_ylabel('Alcohol', fontsize=12)
>>> plt.tight_layout()
>>> plt.text(0, -0.2,
... s='OD280/OD315 of diluted wines',
... ha='center', va='center', fontsize=12, transform=axarr[1].transAxes)
>>> plt.show()