Алгоритм AdaBoost
Алгоритм AdaBoost – это метод улучшения, который работает путем объединения слабых учеников в сильных. Хороший способ для модели прогнозирования исправить свою предшественницу – уделить больше внимания обучающим образцам, которым предшественник не подходил.
Это может привести к созданию новой модели прогнозирования, работа которой будет в основном сосредоточена на сложных случаях. Этот метод используется алгоритмом AdaBoost. В этой статье я расскажу вам об алгоритме AdaBoost в машинном обучении.
Обучение базового классификатора
Чтобы использовать алгоритм классификации AdaBoost, нам сначала нужно обучить базовую модель классификации. Итак, чтобы объяснить этот алгоритм, я сначала обучу алгоритм дерева решений в качестве нашей базовой модели классификации. Начнем с импорта необходимых пакетов для обучения DecisionTreeClassifier:
import sys
assert sys.version_info >= (3, 5)
# Scikit-Learn ≥0.20 is required
import sklearn
assert sklearn.__version__ >= "0.20"
# Common imports
import numpy as np
import os
# to make this notebook's output stable across runs
np.random.seed(42)
# To plot pretty figures
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)
Теперь я буду использовать алгоритм дерева решений для обучения базовой классификации:
from sklearn.model_selection import train_test_split from sklearn.datasets import make_moons X, y = make_moons(n_samples=500, noise=0.30, random_state=42) X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
Алгоритм AdaBoost в машинном обучении
Алгоритм AdaBoost увеличивает относительный вес менее классифицированных обучающих выборок. Затем он обучает другую модель классификации, используя новые веса обновлений классифицированных обучающих выборок, и снова делает прогноз на обучающем наборе. Давайте посмотрим, как мы можем реализовать этот алгоритм:
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import AdaBoostClassifier
ada_clf = AdaBoostClassifier(
DecisionTreeClassifier(max_depth=1), n_estimators=200,
algorithm="SAMME.R", learning_rate=0.5, random_state=42)
ada_clf.fit(X_train, y_train)
Чтобы двигаться дальше, я создам вспомогательную функцию для построения границы решения. Теперь давайте создадим функцию:
from matplotlib.colors import ListedColormap
def plot_decision_boundary(clf, X, y, axes=[-1.5, 2.45, -1, 1.5], alpha=0.5, contour=True):
x1s = np.linspace(axes[0], axes[1], 100)
x2s = np.linspace(axes[2], axes[3], 100)
x1, x2 = np.meshgrid(x1s, x2s)
X_new = np.c_[x1.ravel(), x2.ravel()]
y_pred = clf.predict(X_new).reshape(x1.shape)
custom_cmap = ListedColormap(['#fafab0','#9898ff','#a0faa0'])
plt.contourf(x1, x2, y_pred, alpha=0.3, cmap=custom_cmap)
if contour:
custom_cmap2 = ListedColormap(['#7d7d58','#4c4c7f','#507d50'])
plt.contour(x1, x2, y_pred, cmap=custom_cmap2, alpha=0.8)
plt.plot(X[:, 0][y==0], X[:, 1][y==0], "yo", alpha=alpha)
plt.plot(X[:, 0][y==1], X[:, 1][y==1], "bs", alpha=alpha)
plt.axis(axes)
plt.xlabel(r"$x_1$", fontsize=18)
plt.ylabel(r"$x_2$", fontsize=18, rotation=0)
plot_decision_boundary(ada_clf, X, y)

Теперь давайте изобразим результаты нашей модели классификации, используя границу принятия решения:
from sklearn.svm import SVC
m = len(X_train)
fix, axes = plt.subplots(ncols=2, figsize=(10,4), sharey=True)
for subplot, learning_rate in ((0, 1), (1, 0.5)):
sample_weights = np.ones(m)
plt.sca(axes[subplot])
for i in range(5):
svm_clf = SVC(kernel="rbf", C=0.05, gamma="scale", random_state=42)
svm_clf.fit(X_train, y_train, sample_weight=sample_weights)
y_pred = svm_clf.predict(X_train)
sample_weights[y_pred != y_train] *= (1 + learning_rate)
plot_decision_boundary(svm_clf, X, y, alpha=0.2)
plt.title("learning_rate = {}".format(learning_rate), fontsize=16)
if subplot == 0:
plt.text(-0.7, -0.65, "1", fontsize=14)
plt.text(-0.6, -0.10, "2", fontsize=14)
plt.text(-0.5, 0.10, "3", fontsize=14)
plt.text(-0.4, 0.55, "4", fontsize=14)
plt.text(-0.3, 0.90, "5", fontsize=14)
else:
plt.ylabel("")
plt.show()

Новый алгоритм классификации работает лучше в тех же случаях, что и алгоритм дерева решений. На рисунке справа представлена последовательность прогнозов, используемых алгоритмом AdaBoost. Скорость обучения снижается вдвое, потому что менее классифицированные веса увеличиваются вдвое на каждом шаге итераций.
Как видите, алгоритм AdaBoost добавил прогнозы в модель и, в конце концов, улучшил ее работу. Если ваша модель переоснащается обучающей выборкой, вы можете уменьшить количество оценщиков. Надеюсь, вам понравилась эта статья.



