Алгоритм 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 добавил прогнозы в модель и, в конце концов, улучшил ее работу. Если ваша модель переоснащается обучающей выборкой, вы можете уменьшить количество оценщиков. Надеюсь, вам понравилась эта статья.