離散的な Adaboost と実際の Adaboost の比較

Beginner

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

はじめに

この実験では、離散的な SAMME ブースティングアルゴリズムと実際の SAMME.R ブースティングアルゴリズムの性能の違いを示します。両方のアルゴリズムは、目的変数 Y が 10 個の入力特徴量の非線形関数である二値分類タスクで評価されます。この実験は、Hastie 他 2009 年の図 10.2 に基づいています。

VM のヒント

VM の起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebook を使って練習しましょう。

時々、Jupyter Notebook が読み込み終わるまで数秒待つ必要がある場合があります。Jupyter Notebook の制限により、操作の検証を自動化することはできません。

学習中に問題がある場合は、Labby にお尋ねください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。

データとベースラインモデルの準備

まず、Hastie 他 2009 年の例 10.2 で使用される二値分類データセットを生成します。次に、AdaBoost 分類器のハイパーパラメータを設定します。データを訓練用とテスト用に分割します。その後、ベースライン分類器であるdepth=9DecisionTreeClassifierdepth=1の「ハズレ木」DecisionTreeClassifierを訓練し、テストエラーを計算します。

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

X, y = datasets.make_hastie_10_2(n_samples=12_000, random_state=1)

n_estimators = 400
learning_rate = 1.0

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=2_000, shuffle=False
)

dt_stump = DecisionTreeClassifier(max_depth=1, min_samples_leaf=1)
dt_stump.fit(X_train, y_train)
dt_stump_err = 1.0 - dt_stump.score(X_test, y_test)

dt = DecisionTreeClassifier(max_depth=9, min_samples_leaf=1)
dt.fit(X_train, y_train)
dt_err = 1.0 - dt.score(X_test, y_test)

離散的な SAMME と実際の SAMME.R を使った Adaboost

次に、離散的な Adaboost 分類器と実際の Adaboost 分類器を定義し、訓練セットに適合させます。

from sklearn.ensemble import AdaBoostClassifier

ada_discrete = AdaBoostClassifier(
    estimator=dt_stump,
    learning_rate=learning_rate,
    n_estimators=n_estimators,
    algorithm="SAMME",
)
ada_discrete.fit(X_train, y_train)

ada_real = AdaBoostClassifier(
    estimator=dt_stump,
    learning_rate=learning_rate,
    n_estimators=n_estimators,
    algorithm="SAMME.R",
)
ada_real.fit(X_train, y_train)

テストエラーの計算

次に、アンサンブルに追加されるn_estimatorsの各新しいハズレ木に対して、離散的な Adaboost 分類器と実際の Adaboost 分類器のテストエラーを計算しましょう。

import numpy as np
from sklearn.metrics import zero_one_loss

ada_discrete_err = np.zeros((n_estimators,))
for i, y_pred in enumerate(ada_discrete.staged_predict(X_test)):
    ada_discrete_err[i] = zero_one_loss(y_pred, y_test)

ada_discrete_err_train = np.zeros((n_estimators,))
for i, y_pred in enumerate(ada_discrete.staged_predict(X_train)):
    ada_discrete_err_train[i] = zero_one_loss(y_pred, y_train)

ada_real_err = np.zeros((n_estimators,))
for i, y_pred in enumerate(ada_real.staged_predict(X_test)):
    ada_real_err[i] = zero_one_loss(y_pred, y_test)

ada_real_err_train = np.zeros((n_estimators,))
for i, y_pred in enumerate(ada_real.staged_predict(X_train)):
    ada_real_err_train[i] = zero_one_loss(y_pred, y_train)

結果をプロットする

最後に、ベースラインと離散的な Adaboost 分類器および実際の Adaboost 分類器の訓練エラーとテストエラーをプロットします。

import matplotlib.pyplot as plt
import seaborn as sns

fig = plt.figure()
ax = fig.add_subplot(111)

ax.plot([1, n_estimators], [dt_stump_err] * 2, "k-", label="Decision Stump Error")
ax.plot([1, n_estimators], [dt_err] * 2, "k--", label="Decision Tree Error")

colors = sns.color_palette("colorblind")

ax.plot(
    np.arange(n_estimators) + 1,
    ada_discrete_err,
    label="Discrete AdaBoost Test Error",
    color=colors[0],
)
ax.plot(
    np.arange(n_estimators) + 1,
    ada_discrete_err_train,
    label="Discrete AdaBoost Train Error",
    color=colors[1],
)
ax.plot(
    np.arange(n_estimators) + 1,
    ada_real_err,
    label="Real AdaBoost Test Error",
    color=colors[2],
)
ax.plot(
    np.arange(n_estimators) + 1,
    ada_real_err_train,
    label="Real AdaBoost Train Error",
    color=colors[4],
)

ax.set_ylim((0.0, 0.5))
ax.set_xlabel("Number of weak learners")
ax.set_ylabel("error rate")

leg = ax.legend(loc="upper right", fancybox=True)
leg.get_frame().set_alpha(0.7)

plt.show()

まとめ

この実験では、離散的な SAMME ブースティングアルゴリズムと実際の SAMME.R ブースティングアルゴリズムの性能の違いを示しました。実際の Adaboost の訓練セットとテストセットの両方のエラー率が、離散的な Adaboost よりも低いことを観察しました。