Бустинг, AdaBoost
Содержание
Описание
Бустинг (англ. boosting) — это композиционный мета-алгоритм обучения машин[на 18.01.19 не создан], не использующий параллельное обучение базовых классификаторов как бэггинг (англ. bagging). Бустинг также схож со стэкингом (англ. stacking), но стэкинг комбинирует результаты различных алгоритмов, получая тем самым более точный ответ. Основной идеей бустинга является комбинирование слабых функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. В отличие от слабого алгоритма, сильный обучающий алгоритм является классификатором, хорошо коррелирующим с верной классификацией.
Алгоритмы бустинга
Большинство алгоритмов бустинга состоит из итеративного обучения слабых классификаторов с целью сборки их в сильный классификатор. Когда они добавляются, им обычно приписываются некоторым образом веса, которые, обычно, связаны с точностью обучения[на 18.01.19 не создан]. После того, как слабый классификатор добавлен, веса пересчитываются, что известно как «пересчёт весовых коэффициентов». Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Тем самым последующее слабое обучение фокусируется больше на примерах, где предыдущие слабые обучения дали ошибочную классификацию.
Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек тренировочных данных[на 18.01.19 не создан] и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был AdaBoost (сокр. Adaptive Boosting), предложенный Шапире и Фройндом.
Алгоритмы бустинга могут основываться на выпуклых или невыпуклых алгоритмах оптимизации. Выпуклые алгоритмы, такие как AdaBoost и LogitBoost[1], могут «потерпеть крушение» из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой оптимизации, такие как BrownBoost[2], могут быть обучены из данных с шумами и лежащий в основе классификатор Лонг–Серведио[3] для набора данных может быть обучен.
Прикладное использование алгоритмов бустинга
Задача классификации объектов
Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов — это путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.
Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение признаков[на 18.01.19 не создан], обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели «мешок слов», с помощью локальных описателей, таких как SIFT[4], и так далее. Примерами классификаторов с учителем служат наивные байесовские классификаторы[на 18.01.19 не создан], методы опорных векторов[на 18.01.19 не создан], смесь гауссиан и нейронные сети. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.
Задача ранжирования выдачи поисковых систем
Благодаря AdaBoost в мире появился градиентный бустинг (англ. gradient boosting) или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.
AdaBoost
Описание
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.
AdaBoost вызывает слабые классификаторы в цикле
. После каждого вызова обновляется распределение весов , которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.Алгоритм для задачи построения двоичного классификатора
Пакет AdaBoost может быть использован для распознавания лиц как пример двоичной классификации. Две категории — это лица и фон. Общий алгоритм выглядит следующим образом:
Дано:, где Инициализируем . Для каждого пока не выполнен критерий останова: 1. Находим классификатор который минимизирует взвешенную ошибку классификации: , где 2. Если величина , то останавливаемся. 3. Выбираем , обычно , где взвешенная ошибка классификатора 4. Обновляем: , где является нормализующим параметром (выбранным так, чтобы являлось распределением вероятностей, то есть ). Строим результирующий классификатор: Выражение для обновления распредления должно быть сконструировано таким образом, чтобы выполнялось условие:
Таким образом, после выбора оптимального классификатора
для распределения , объекты , которые классификатор идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении , он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.Пример кода на python для scikit-learn
Классификатор sklearn.ensemble.AdaBoostClassifier имеет 5 параметров: base_estimator, n_estimators, learning_rate, algorithm, random_state. Наиболее важными являются base_estimator, n_estimators и learning_rate.
from sklearn.ensemble import AdaBoostClassifier from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn import metrics iris = datasets.load_iris() X = iris.data y = iris.target X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
abc = AdaBoostClassifier(n_estimators=50, learning_rate=1) model = abc.fit(X_train, y_train) y_pred = model.predict(X_test) print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.8888888888888888
Теперь рассмотрим алгоритм с SVC в качестве базы:
from sklearn.svm import SVC svc=SVC(probability=True, kernel='linear') abc = AdaBoostClassifier(base_estimator=svc, n_estimators=50, learning_rate=1) model = abc.fit(X_train, y_train) y_pred = model.predict(X_test) print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.9555555555555556
Пример на языке Scala
SBT зависимость:
libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2"
Пример классификации датасета и вычисления F1 меры[5] используя smile.classification.adaboost[6]:
import smile.classification._ import smile.data._ import smile.plot._ import smile.read import smile.validation.FMeasure
val iris: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some((new NumericAttribute("class"), 2))) val x: Array[Array[Double]] = iris.x() val y: Array[Int] = iris.y().map(_.toInt) val ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2) val predictions: Array[Int] = x.map(ada.predict) val f1Score = new FMeasure().measure(predictions, y) plot(x, y, ada)
См. также
- Метод опорных векторов
- Байесовская классификация
- Мета-обучение
- Нейронные сети
- Оценка качества в задаче кластеризации
- CatBoost
Примечания
Источники информации
- AdaBoostClassifier — документация scikit-learn
- AdaBoost — статья на machinelearning.ru
- AdaBoost — презентация по AdaBoost