2 min read

AdaBoost

AdaBoost

AdaBoost (Adaptive Boosting) – классифицирующая Модель (Model), которая объединяет несколько слабых классификаторов для повышения точности. Является  Ансамблем (Ensemble).

Алгоритм предложен Йоавом Фройндом (Yoav Freund) и Робертом Шапире (Robert Schapire) в 1996 году. Комбинируя несколько неэффективных классификаторов, мы получаем сильный классификатор высокой точности.

Основная концепция заключается в установке весов классификаторов и обучении выборки данных на каждой итерации, чтобы обеспечить точные предсказания необычных наблюдений. Любой алгоритм Машинного обучения (ML) может использоваться в качестве базового классификатора, если он принимает веса в обучающем наборе.

AdaBoost должен соответствовать двум условиям:

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

Чтобы построить классификатор AdaBoost, представьте, что в качестве первого базового классификатора мы обучаем алгоритм Дерева решений (Decision Tree) для прогнозирования наших обучающих данных. Теперь, следуя методологии, вес неверно классифицированных обучающих экземпляров увеличен. Второй классификатор обучается, принимает обновленные веса и повторяет процедуру снова и снова. В конце каждого прогноза мы в конечном итоге увеличиваем веса неправильно классифицированных экземпляров, чтобы следующая модель лучше справлялась с ними, и так далее.

AdaBoost добавляет в ансамбль Предикторы (Predictor Variable), постепенно улучшая его. Большим недостатком этого алгоритма является то, что модель не может быть распараллелена, поскольку каждый предиктор может быть обучен только после того, как предыдущий был обучен и оценен.

AdaBoost на scikit-learn

Давайте посмотрим, как AdaBoost реализован в SkLearn. Для начала импортируем необходимые библиотеки:

import sklearn as sk
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix
from sklearn.preprocessing import LabelEncoder

import pandas as pd
import numpy as np

Импортируем датасет о раке груди и разделим Признаки (Feature) на предикторы и Целевой признак (Target Variable):

breast_cancer = load_breast_cancer()
X = pd.DataFrame(breast_cancer.data, columns=breast_cancer.feature_names)
y = pd.Categorical.from_codes(breast_cancer.target, breast_cancer.target_names)

Закодируем целевые метки значениями от 0 до значения [число классов  – 2], то есть возможными значениями являются 0 и 1:

encoder = LabelEncoder()
binary_encoded_y = pd.Series(encoder.fit_transform(y))

Разделим датасет на тренировочную и тестовую части функцией train_test_split и применим перемешивание (random_state = 1):

train_X, test_X, train_y, test_y = train_test_split(X, binary_encoded_y, random_state = 1)

Создадим объект-классификатор и обучим его Тренировочными данными (Train Data):

classifier = AdaBoostClassifier(
    DecisionTreeClassifier(max_depth = 1),
    n_estimators = 200)

classifier.fit(train_X, train_y)

Система демонстрирует параметры модели по умолчанию. К примеру, в качестве базового Алгоритма (Algorithm) будет использоваться Дерево решений (Decision Tree) (base_estimator=DecisionTreeClassifier):

AdaBoostClassifier(algorithm='SAMME.R', base_estimator=DecisionTreeClassifier(ccp_alpha=0.0, class_weight=None, criterion='gini', max_depth=1, max_features=None, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort='deprecated', random_state=None, splitter='best'),
learning_rate=1.0, n_estimators=200, random_state=None)

Сгенерируем предсказания для Тестовых данных (Test Data):

predictions = classifier.predict(test_X)

Проверим модель с помощью Матрицы ошибок (Confusion Matrix):

confusion_matrix(test_y, predictions)

На главной диагонали – крупные числа (в сравнении с остальными элементами матрицы),  а это означает, что количество верно классифицированных истинных и ложных случаев значительно превышает неверные (96,5%):

array([[86,  2],
       [ 3, 52]])

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Автор оригинальной статьи: Prashant Banerjee

Фото: @davealmine