Изменения
Нет описания правки
==Описание==
'''Бустинг''' (англ. ''boosting'') — это композиционный {{---}} [[Мета-обучение|мета-алгоритм машинного обучения машин]]. ПрименяетсяОсновной идеей бустинга является комбинирование слабых функций, главным образомкоторые строятся в ходе итеративного процесса, для уменьшения смещения, а также дисперсии в обучении где на каждом шаге новая модель обучается с учителемиспользованием данных об ошибках предыдущих. Также семейство алгоритмов обучения машин, преобразующих слабые обучающие алгоритмы к сильным. Слабый Сильный обучающий алгоритм определяется как классификаторявляется классификатором, который слабо коррелирует хорошо [[Корреляция случайных величин|коррелирующим]] с правильной верной классификацией , в отличие от слабого. Наравне с бустингом в мета-обучении также рассматривают такие понятия, как [[Виды ансамблей|бэггинг]] (может пометить примеры лучше, чем случайное угадываниеангл. ''bagging'') и стэкинг<ref>[https://dyakonov.org/2017/03/10/c%D1%82%D0%B5%D0%BA%D0%B8%D0%BD%D0%B3-stacking-%D0%B8-%D0%B1%D0%BB%D0%B5%D0%BD%D0%B4%D0%B8%D0%BD%D0%B3-blending/#more-4558 Стекинг {{---}} Дьяконов Александр]</ref> (англ. ''stacking''). В отличие Бэггинг, в отличии от слабого алгоритмабустинга, использует параллельное обучение базовых классификаторов. Стэкинг же комбинирует результаты различных алгоритмов, сильный обучающий алгоритм получая тем самым более точный ответ. Одним из недостатков бустинга является классификаторомто, что он может приводить к построению громоздких композиций, состоящих из сотен алгоритмов. Такие композиции исключают возможность содержательной интерпретации, хорошо коррелирующим с верной классификациейтребуют больших объёмов памяти для хранения базовых алгоритмов и существенных затрат времени на вычисление классификаций.
==Алгоритмы бустинга==
===Задача классификации объектовранжирования выдачи поисковых систем===Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нетБлагодаря AdaBoost в мире появился [[CatBoost|градиентный бустинг]] (англ. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение признаков, обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели ''gradient boosting'«мешок слов»''', с помощью локальных описателей, таких как '''SIFT''', и так далее) или GBM. Примерами классификаторов Задачу ранжирования выдачи поисковых запросов рассмотрели с учителем служат наивные байесовские классификаторы, методы опорных векторов, смесь гауссиан и нейронные сети. Однако исследования показалиточки зрения функции потерь, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.Распознавание категорий объектов в изображениях является сложной задачей которая штрафует за ошибки в компьютерном зрениипорядке выдачи, особенно если число категорий велико. Это является следствием высокой внутренней изменчивости классов и необходимости обобщения различных понятий внутри класса. Объекты поэтому было удобно внедрить GBM в одной категории могут выглядеть совершенно различными. Даже один и тот же предмет может выглядеть непохожим с различных точек обзора, при другом мастшабе или освещении. Шум заднего плана и частичные наложения также добавляют сложности в распознавание. Люди способны распознавать тысячи типов объектов, в то время как большинство существующих систем распознавания объектов тренируются для распознавания лишь нескольких, например человеческих лиц, автомобилей, простых объектов и т.д.. Увеличению числа категорий и возможности добавления новых категорий достигается, в частности, с помощью совместного использования признаков и бустингаранжирование.
==AdaBoost==
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.
AdaBoost вызывает слабые классификаторы <tex>h_i^t</tex> в цикле <tex>t = 1,...,T</tex>. После каждого вызова обновляется распределение весов <tex>D_t</tex>, которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах. ===Описание алгоритма=== <font color=green>//<tex>x_i \in X, y_i \in Y = \{-1,+1\}, size(x) = size(y) = m</tex></font> '''function''' AdaBoost($X$, $Y$, $m$): <font color=green>//Инициализируем</font> '''for''' i = 1..m '''do''': <tex>D_i^1 = \frac{1}{m}</tex> '''end''' '''for''' '''for''' t = 1..T '''do''': <tex>h_t = \arg \min\limits_{h_j \in \mathcal{H}} \epsilon_j = \sum\limits_{i=1}^{m} D_i^t〚y_i\neq h_j(x_i)〛</tex> <font color=green>//$\epsilon$ {{---}} Взвешенная ошибка классификации, классификатор <tex>h_t:X\to \{-1,+1\}</tex></font> <tex>\alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t}</tex> '''for''' i = 1..m '''do''': <font color=green>//<tex>Z_t</tex> {{---}} нормализующий параметр, выбранный так, чтобы <tex>D^{t+1}</tex> являлось распределением вероятностей, то есть <tex>\sum\limits_{i-1}^{m} D_i^{t+1} = 1</tex>, для <tex>t=1,...,T</tex></font> <tex>D_i^{t+1} = \dfrac{D_i^t \textrm{exp}(-\alpha_t y_i h_t(x_i))}{Z_t}</tex> '''end''' '''for''' '''end''' '''for''' <tex>H(x) = \textrm{sign}\left(\sum\limits_{t=1}^{T} \alpha_t h_t(x)\right)</tex> <font color=green>//$H(x)$ {{---}} результирующий классификатор</font> '''return''' $H$Выражение для обновления распределения <tex>D^t</tex> должно быть сконструировано таким образом, чтобы выполнялось условие:<center><tex>\exp^{\alpha_t y_i h_t(x_i)} \begin{cases}<1,\ y(i) = h_t(x_i) \\ >1,\ y(i) \neq h_t(x_i)\end{cases}</tex></center>, Таким образом, после выбора оптимального классификатора <tex>h_t</tex> для распределения <tex>D^t</tex>, объекты <tex>x_i</tex>, которые классификатор <tex>h_t</tex> идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении <tex>D^{t+1}</tex>, он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором. ===Пример работы===Рассмотрим набор данных, которые пометим как $-$ и $+$.[[Файл:Adaboost1.jpg|600px|thumb|center|Результат после первой итерации]]Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим[[Файл:Adaboost2.jpg|1000px|thumb|center|Результат после пересчета весов и второй итерации]]Рассмотрим результат после $2$-х итераций:[[Файл:Adaboost_result12.jpg|1000px|thumb|center|Итоговый результат после $2$-х итераций]]Как видно из последнего изображения, все, что находиться в "цветной" зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и "белые" зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:[[Файл:Adaboost_resultfinal.jpg|300px|thumb|center|Результат работы алгоритма после $30$-ти итераций]]Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю. ===Достоинства и недостатки==='''Достоинства:'''# Простота реализации;# Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов;# Время построения композиции практически полностью определяется временем обучения базовых алгоритмов;# Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.'''Недостатки:'''# Склонен к переобучению при наличии значительного уровня шума в данных;# Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных. ===Пример кода на python для scikit-learn===Классификатор sklearn.ensemble.'''AdaBoostClassifier'''<ref>[https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html Документация AdaBoostClassifier]</ref> имеет 5 параметров: '''base_estimator''', '''n_estimators''', '''learning_rate''', '''algorithm''', '''random_state'''.Наиболее важными являются: # '''base_estimator''' {{---}} базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1);# '''n_estimators''' {{---}} максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше;# '''learning_rate''' {{---}} вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность). '''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 меры<ref>[https://en.wikipedia.org/wiki/F1_score F1 мера]</ref> используя smile.classification.adaboost<ref>[https://haifengl.github.io/smile/classification.html#adaboost Smile, AdaBoost]</ref>: '''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) ===Пример на языке Java===Пример классификации с применением <code>smile.classification.AdaBoost</code><ref>[https://haifengl.github.io/smile/api/java/smile/classification/AdaBoost.html/ Smile, AdaBoost]</ref> <code>Maven</code> зависимость: <dependency> <groupId>com.github.haifengl</groupId> <artifactId>smile-core</artifactId> <version>1.5.2</version> </dependency> '''import''' smile.classification.AdaBoost; '''import''' smile.data.parser.ArffParser; '''import''' smile.validation.Accuracy; '''import''' smile.validation.ClassificationMeasure; '''import''' smile.validation.FMeasure; '''import''' java.util.Arrays; <font color="green">// load train and test datasets</font> '''var''' arffParser = new ArffParser(); arffParser.setResponseIndex(0); '''var''' train = arffParser.parse(this.getClass().getResourceAsStream("train.arff")); '''var''' test = arffParser.parse(this.getClass().getResouceAsStream("test.arff")); <font color="green">// create adaboost classifier</font> '''var''' forest = new AdaBoost(train.attributes(), train.x(), train.labels(), 200, 4); <font color="green">// measure accuracy and F1-measure on test dataset</font> '''var''' measures = new ClassificationMeasure[]{new FMeasure(), new Accuracy()}; '''var''' results = forest.test(test.x(), test.labels(), measures); System.out.println(Arrays.deepToString(results));
===Алгоритм для задачи построения двоичного классификатора=См. также ==Пакет AdaBoost может быть использован для распознавания лиц как пример двоичной классификации*[[Метод опорных векторов (SVM)|Метод опорных векторов]]<sup>[на 28.01.19 не создан]</sup>*[[Байесовская классификация|Байесовская классификация]]<sup>[на 28. Две категории — это лица и фон01. Общий алгоритм выглядит следующим образом:19 не создан]</sup>*[[Мета-обучение|Мета-обучение]]*[[Нейронные сети, перцептрон|Нейронные сети]]*[[Оценка качества в задаче кластеризации|Оценка качества в задаче кластеризации]]*[[CatBoost|CatBoost]]