다중 클래스 AdaBoost 의사결정 트리

Beginner

This tutorial is from open-source community. Access the source code

소개

이 실습에서는 부스팅이 다중 분류 문제에서 예측 정확도를 개선하는 방법을 살펴봅니다. 10 차원 표준 정규 분포를 기반으로 데이터셋을 구성하고, 중첩된 동심 10 차원 구체로 세 개의 클래스를 구분하여 각 클래스에 거의 동일한 수의 샘플이 포함되도록 정의합니다.

SAMME 및 SAMME.R 알고리즘의 성능을 비교합니다. SAMME.R 은 확률 추정치를 사용하여 가산 모델을 업데이트하는 반면, SAMME 는 분류 결과만 사용합니다.

VM 팁

VM 시작이 완료되면 왼쪽 상단 모서리를 클릭하여 Notebook 탭으로 전환하여 연습을 위한 Jupyter Notebook에 접근합니다.

때때로 Jupyter Notebook 이 완전히 로드되기까지 몇 초 정도 기다려야 할 수 있습니다. Jupyter Notebook 의 제한으로 인해 작업 검증은 자동화될 수 없습니다.

학습 중 문제가 발생하면 Labby 에 문의하십시오. 세션 후 피드백을 제공하면 문제를 신속하게 해결해 드리겠습니다.

필요한 라이브러리 가져오기

필요한 라이브러리를 가져오는 것으로 시작합니다. sklearn.datasets에서 make_gaussian_quantilesaccuracy_score를, sklearn.ensemble에서 AdaBoostClassifierDecisionTreeClassifier를, 그리고 matplotlib.pyplot를 가져옵니다.

import matplotlib.pyplot as plt
from sklearn.datasets import make_gaussian_quantiles
from sklearn.ensemble import AdaBoostClassifier
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier

데이터셋 로드

sklearn.datasetsmake_gaussian_quantiles 함수를 사용하여 데이터셋을 생성합니다. 이 함수는 등방성 가우시안 분포를 생성하고 클래스 간의 분리를 추가하여 문제를 더 어렵게 만듭니다.

X, y = make_gaussian_quantiles(
    n_samples=13000, n_features=10, n_classes=3, random_state=1
)

데이터셋 분할

데이터셋을 학습용과 테스트용으로 분할합니다. 처음 3000 개의 샘플을 학습용으로, 나머지 샘플을 테스트용으로 사용합니다.

n_split = 3000
X_train, X_test = X[:n_split], X[n_split:]
y_train, y_test = y[:n_split], y[n_split:]

모델 생성 및 학습

SAMME 와 SAMME.R 를 사용하는 두 개의 AdaBoost 모델을 생성합니다. 두 모델 모두 DecisionTreeClassifier 를 사용하며, 최대 깊이 (max depth) 는 2 이고 추정자 (estimators) 는 300 개입니다.

bdt_real = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth=2), n_estimators=300, learning_rate=1
)

bdt_discrete = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth=2),
    n_estimators=300,
    learning_rate=1.5,
    algorithm="SAMME",
)

bdt_real.fit(X_train, y_train)
bdt_discrete.fit(X_train, y_train)

모델 테스트

각 부스팅 반복 후 각 모델의 테스트 오류를 계산하여 모델을 테스트합니다.

real_test_errors = []
discrete_test_errors = []

for real_test_predict, discrete_test_predict in zip(
    bdt_real.staged_predict(X_test), bdt_discrete.staged_predict(X_test)
):
    real_test_errors.append(1.0 - accuracy_score(real_test_predict, y_test))
    discrete_test_errors.append(1.0 - accuracy_score(discrete_test_predict, y_test))

결과 플롯

각 모델의 테스트 오류, 분류 오류 및 부스팅 가중치를 플롯합니다.

n_trees_discrete = len(bdt_discrete)
n_trees_real = len(bdt_real)

## 부스팅은 조기 종료될 수 있지만, 다음 배열은 항상
## n_estimators 길이입니다. 여기서 실제 트리 수에 맞춰 잘라냅니다.
discrete_estimator_errors = bdt_discrete.estimator_errors_[:n_trees_discrete]
real_estimator_errors = bdt_real.estimator_errors_[:n_trees_real]
discrete_estimator_weights = bdt_discrete.estimator_weights_[:n_trees_discrete]

plt.figure(figsize=(15, 5))

plt.subplot(131)
plt.plot(range(1, n_trees_discrete + 1), discrete_test_errors, c="black", label="SAMME")
plt.plot(
    range(1, n_trees_real + 1),
    real_test_errors,
    c="black",
    linestyle="dashed",
    label="SAMME.R",
)
plt.legend()
plt.ylim(0.18, 0.62)
plt.ylabel("테스트 오류")
plt.xlabel("트리 개수")

plt.subplot(132)
plt.plot(
    range(1, n_trees_discrete + 1),
    discrete_estimator_errors,
    "b",
    label="SAMME",
    alpha=0.5,
)
plt.plot(
    range(1, n_trees_real + 1), real_estimator_errors, "r", label="SAMME.R", alpha=0.5
)
plt.legend()
plt.ylabel("오류")
plt.xlabel("트리 개수")
plt.ylim((0.2, max(real_estimator_errors.max(), discrete_estimator_errors.max()) * 1.2))
plt.xlim((-20, len(bdt_discrete) + 20))

plt.subplot(133)
plt.plot(range(1, n_trees_discrete + 1), discrete_estimator_weights, "b", label="SAMME")
plt.legend()
plt.ylabel("가중치")
plt.xlabel("트리 개수")
plt.ylim((0, discrete_estimator_weights.max() * 1.2))
plt.xlim((-20, n_trees_discrete + 20))

## y 축 레이블이 겹치는 것을 방지
plt.subplots_adjust(wspace=0.25)
plt.show()

요약

이 실험에서는 부스팅이 다중 클래스 문제에 대한 예측 정확도를 개선하는 방법을 탐구했습니다. 10 차원 표준 정규 분포를 기반으로 만들어진 데이터셋을 사용했으며, 중첩된 동심원적인 10 차원 구체로 세 개의 클래스를 구분했습니다. SAMME 및 SAMME.R 알고리즘의 성능을 비교하고 각 모델의 테스트 오류, 분류 오류 및 부스팅 가중치를 플롯했습니다. 결과는 SAMME.R 이 일반적으로 SAMME 보다 더 빠르게 수렴하여 더 적은 부스팅 반복으로 더 낮은 테스트 오류를 달성함을 보여줍니다.