Введение
В этом лабораторном задании демонстрируется разница в производительности между алгоритмом бустинга дискретного SAMME и алгоритмом бустинга реального SAMME.R. Оба алгоритма оцениваются на задаче бинарной классификации, где целевая переменная Y представляет собой нелинейную функцию от 10 входных признаков. Лабораторное задание основано на рис. 10.2 из Hastie et al 2009.
Советы по использованию ВМ
После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.
Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook загрузится. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.
Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.
Подготовка данных и базовых моделей
Начнем с генерации набора данных для бинарной классификации, используемого в Hastie et al. 2009, Примере 10.2. Затем зададим гиперпараметры для наших классификаторов AdaBoost. Разделим данные на обучающую и тестовую выборки. После этого обучим наши базовые классификаторы: DecisionTreeClassifier с depth=9 и "стамповой" DecisionTreeClassifier с depth=1, и вычислим ошибку на тестовой выборке.
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)
AdaBoost с дискретным SAMME и реальным SAMME.R
Теперь определим дискретный и реальный классификаторы 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)
Вычисление ошибки на тестовой выборке
Теперь вычислим ошибку на тестовой выборке для дискретных и реальных классификаторов AdaBoost для каждого нового "стампа" в n_estimators, добавленного в ансамбль.
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.
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.