<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=217.66.159.109&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=217.66.159.109&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/217.66.159.109"/>
		<updated>2026-06-11T14:16:45Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69442</id>
		<title>Бустинг, AdaBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69442"/>
				<updated>2019-01-26T18:18:59Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.159.109: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание==&lt;br /&gt;
'''Бустинг''' (англ. ''boosting'') — это [[Мета-обучение|мета-алгоритм машинного обучения]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;. Основной идеей бустинга является комбинирование слабых функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Сильный обучающий алгоритм является классификатором, хорошо [[Корреляция случайных величин|коррелирующим]] с верной классификацией, в отличие от слабого. Наравне с бустингом в мета-обучении также рассматривают такие понятия, как [[Виды ансамблей|бэггинг]] (англ. ''bagging'') и стэкинг&amp;lt;ref&amp;gt;[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 Стекинг {{---}} Дьяконов Александр]&amp;lt;/ref&amp;gt; (англ. ''stacking''). Бэггинг, в отличии от бустинга, использует параллельное обучение базовых классификаторов. Стэкинг же комбинирует результаты различных алгоритмов, получая тем самым более точный ответ. &lt;br /&gt;
&lt;br /&gt;
Одним из недостатков бустинга является то, что он может приводить к построению громоздких композиций, состоящих из сотен алгоритмов. Такие композиции исключают возможность содержательной интерпретации, требуют больших объёмов памяти для хранения базовых алгоритмов и существенных затрат времени на вычисление классификаций.&lt;br /&gt;
&lt;br /&gt;
==Алгоритмы бустинга==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Композицией''' $T$ '''алгоритмов''' &amp;lt;tex&amp;gt;a_t(x) = C(b_t(x)),\ t = 1,...,T&amp;lt;/tex&amp;gt; называется [[Суперпозиции|суперпозиция]] алгоритмических операторов &amp;lt;tex&amp;gt;b_t\ :\ X\to R&amp;lt;/tex&amp;gt;, корректирующей операции &amp;lt;tex&amp;gt;F\ :\ R^T\to R&amp;lt;/tex&amp;gt; и решающего правила &amp;lt;tex&amp;gt; C\ :\ R\to Y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} пространство оценок,&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))), x \in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;br&amp;gt;Алгоритмы $a_t$ называют ''базовыми алгоритмами''.}}&lt;br /&gt;
Бустинг представляет собой композицию алгоритмов, в которых ошибки отдельных алгоритмов взаимно компенсируются. Например, в задаче классификации на два класса $Y = {-1, +1}$ в качестве пространства оценок принимают $R = \mathbb{R}$ и &amp;lt;tex&amp;gt;C(b(x)) = \textrm{sign}(b(x))&amp;lt;/tex&amp;gt;. Тогда базовые алгоритмы возвращают ответы $−1, 0, +1$. Ответ $b_t(x) = 0$ означает, что базовый алгоритм $b_t$ отказывается от классификации объекта $x$, и ответ $b_t(x)$ не учитывается в композиции. Получаем искомую композицию:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))) = \textrm{sign}\left(\sum\limits_{t=1}^T \alpha_t b_t(x)\right),\ x\in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Большая часть алгоритмов бустинга основывается на итеративном обучении слабых классификаторов с дальнейшей сборкой их в сильный классификатор. Когда они добавляются, им обычно приписываются веса, обычно связанные с [[Общие понятия|точностью обучения]]. После добавления слабого классификатора, веса пересчитываются ('''«пересчёт весовых коэффициентов»'''). Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Таким образом, дальнейшее слабое обучение фокусируется на примерах, где предыдущие слабые обучения дали ошибочную классификацию.&lt;br /&gt;
&lt;br /&gt;
Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек [[Общие понятия|тренировочных данных]] и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был '''AdaBoost'''&amp;lt;ref&amp;gt;[http://rob.schapire.net/papers/explaining-adaboost.pdf Explaining AdaBoost {{---}} Robert E. Schapire]&amp;lt;/ref&amp;gt; (сокр. ''Adaptive Boosting''), предложенный Шапире и Фройндом.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы бустинга могут использовать выпуклую или невыпуклую функцию потерь. Алгоритмы с выпуклой функцией, такие как AdaBoost и LogitBoost&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/LogitBoost Wikipedia {{---}} LogitBoost]&amp;lt;/ref&amp;gt;, могут некорректно классифицировать из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой функции потерь, такие как BrownBoost&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/BrownBoost Википедия {{---}} BrownBoost]&amp;lt;/ref&amp;gt;, позволяют избежать переобучения на данных с большим количеством &amp;quot;шума&amp;quot;, откидывая зашумленные элементы.&lt;br /&gt;
&lt;br /&gt;
==Прикладное использование алгоритмов бустинга==&lt;br /&gt;
===Задача классификации объектов===&lt;br /&gt;
Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов — это путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.&lt;br /&gt;
&lt;br /&gt;
Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение [[Общие понятия|признаков]], обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели '''«мешок слов»''', с помощью локальных описателей, таких как '''SIFT'''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Wikipedia {{---}} Scale-invariant feature transform]&amp;lt;/ref&amp;gt;, и так далее. Примерами классификаторов с учителем служат наивные [[Байесовская классификация|байесовские классификаторы]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Метод опорных векторов (SVM)|методы опорных векторов]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, смесь гауссиан и [[Нейронные сети, перцептрон|нейронные сети]]. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.&lt;br /&gt;
&lt;br /&gt;
===Задача ранжирования выдачи поисковых систем===&lt;br /&gt;
Благодаря AdaBoost в мире появился [[CatBoost|градиентный бустинг]] (англ. ''gradient boosting'') или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.&lt;br /&gt;
&lt;br /&gt;
==AdaBoost==&lt;br /&gt;
===Описание===&lt;br /&gt;
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.&lt;br /&gt;
&lt;br /&gt;
AdaBoost вызывает слабые классификаторы в цикле &amp;lt;tex&amp;gt;t = 1,...,T&amp;lt;/tex&amp;gt;. После каждого вызова обновляется распределение весов &amp;lt;tex&amp;gt;D_t&amp;lt;/tex&amp;gt;, которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;h_x^t&amp;lt;/tex&amp;gt; {{---}} &amp;quot;слабый&amp;quot; или базисный классификатор, гипотеза, &amp;quot;фича&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;x_i \in X, y_i \in Y = \{-1,+1\}, size(x) = size(y) = m&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' AdaBoost($X$, $Y$, $m$):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;//Инициализируем&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 1..m '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_i^1 = \frac{1}{m}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &lt;br /&gt;
   '''for''' t = 1..T '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;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)〛&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$\epsilon$ {{---}} Взвешенная ошибка классификации, классификатор &amp;lt;tex&amp;gt;h_t:X\to \{-1,+1\}&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;\alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' i = 1..m '''do''':&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;Z_t&amp;lt;/tex&amp;gt; {{---}} нормализующий параметр, выбранный так, чтобы &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt; являлось распределением вероятностей, то есть &amp;lt;tex&amp;gt;\sum\limits_{i-1}^{m} D_i^{t+1} = 1&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;t=1,...,T&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
       &amp;lt;tex&amp;gt;D_i^{t+1} = \dfrac{D_i^t \textrm{exp}(-\alpha_t y_i h_t(x_i))}{Z_t}&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &amp;lt;tex&amp;gt;H(x) = \textrm{sign}\left(\sum\limits_{t=1}^{T} \alpha_t h_t(x)\right)&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$H(x)$ {{---}} результирующий классификатор&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' $H$&lt;br /&gt;
Выражение для обновления распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt; должно быть сконструировано таким образом, чтобы выполнялось условие:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\exp^{\alpha_t y_i h_t(x_i)} \begin{cases}&amp;lt;1,\ y(i) = h_t(x_i) \\ &amp;gt;1,\ y(i) \neq h_t(x_i)\end{cases}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, после выбора оптимального классификатора &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; для распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt;, объекты &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, которые классификатор &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt;, он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.&lt;br /&gt;
&lt;br /&gt;
===Пример работы===&lt;br /&gt;
Рассмотрим набор данных, которые пометим как $-$ и $+$.&lt;br /&gt;
[[Файл:Adaboost1.jpg|600px|thumb|center|Результат после первой итерации]]&lt;br /&gt;
Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим&lt;br /&gt;
[[Файл:Adaboost2.jpg|1000px|thumb|center|Результат после пересчета весов и второй итерации]]&lt;br /&gt;
Рассмотрим результат после $2$-х итераций:&lt;br /&gt;
[[Файл:Adaboost_result12.jpg|1000px|thumb|center|Итоговый результат после $2$-х итераций]]&lt;br /&gt;
Как видно из последнего изображения, все, что находиться в &amp;quot;цветной&amp;quot; зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и &amp;quot;белые&amp;quot; зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:&lt;br /&gt;
[[Файл:Adaboost_resultfinal.jpg|300px|thumb|center|Результат работы алгоритма после $30$-ти итераций]]&lt;br /&gt;
Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю.&lt;br /&gt;
&lt;br /&gt;
===Достоинства и недостатки===&lt;br /&gt;
'''Достоинства:'''&lt;br /&gt;
# Простота реализации&lt;br /&gt;
# Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов.&lt;br /&gt;
# Время построения композиции практически полностью определяется временем обучения базовых алгоритмов.&lt;br /&gt;
# Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.&lt;br /&gt;
'''Недостатки:'''&lt;br /&gt;
# Склонен к переобучению при наличии значительного уровня шума в данных.&lt;br /&gt;
# Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных.&lt;br /&gt;
&lt;br /&gt;
===Пример кода на python для scikit-learn===&lt;br /&gt;
Классификатор sklearn.ensemble.'''AdaBoostClassifier'''&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html Документация AdaBoostClassifier]&amp;lt;/ref&amp;gt; имеет 5 параметров: '''base_estimator''', '''n_estimators''', '''learning_rate''', '''algorithm''', '''random_state'''.&lt;br /&gt;
Наиболее важными являются: &lt;br /&gt;
# '''base_estimator''' {{---}} базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1)&lt;br /&gt;
# '''n_estimators''' {{---}} максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше.&lt;br /&gt;
# '''learning_rate''' {{---}} вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность).&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' AdaBoostClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
 &lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 &lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
 abc = AdaBoostClassifier(n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.8888888888888888&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим алгоритм с SVC в качестве базы:&lt;br /&gt;
 '''from''' sklearn.svm '''import''' SVC&lt;br /&gt;
 &lt;br /&gt;
 svc=SVC(probability='''True''', kernel=''''linear'''')&lt;br /&gt;
 &lt;br /&gt;
 abc = AdaBoostClassifier(base_estimator='''svc''', n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.9555555555555556&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.adaboost&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#adaboost Smile, AdaBoost]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(ada.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, ada)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&lt;br /&gt;
*[[Байесовская классификация|Байесовская классификация]]&lt;br /&gt;
*[[Мета-обучение|Мета-обучение]]&lt;br /&gt;
*[[Нейронные сети, перцептрон|Нейронные сети]]&lt;br /&gt;
*[[Оценка качества в задаче кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
*[[CatBoost|CatBoost]]&lt;br /&gt;
&lt;br /&gt;
== Примечания==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=AdaBoost AdaBoost] {{---}} статья на machinelearning.ru&lt;br /&gt;
# [http://cmp.felk.cvut.cz/~sochmj1/adaboost_talk.pdf AdaBoost] {{---}} презентация по AdaBoost&lt;br /&gt;
# [https://ru.coursera.org/lecture/ml-classification/example-of-adaboost-in-action-um0cX Example of AdaBoost in action] {{---}} презентация на coursera.org&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2) Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>217.66.159.109</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69441</id>
		<title>Бустинг, AdaBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69441"/>
				<updated>2019-01-26T18:18:21Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.159.109: /* Описание */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание==&lt;br /&gt;
'''Бустинг''' (англ. ''boosting'') — это [[Мета-обучение|мета-алгоритм машинного обучения]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;. Основной идеей бустинга является комбинирование слабых функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Сильный обучающий алгоритм является классификатором, хорошо [[Корреляция случайных величин|коррелирующим]] с верной классификацией, в отличие от слабого. Наравне с бустингом в мета-обучении также рассматривают такие понятия, как [[Виды ансамблей|бэггинг]] (англ. ''bagging'') и стэкинг&amp;lt;ref&amp;gt;[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 Стекинг {{---}} Дьяконов Александр]&amp;lt;/ref&amp;gt; (англ. ''stacking''). Бэггинг, в отличии от бустинга, использует параллельное обучение базовых классификаторов. Стэкинг же комбинирует результаты различных алгоритмов, получая тем самым более точный ответ. &lt;br /&gt;
&lt;br /&gt;
Одним из недостатков бустинга является то, что он может приводить к построению громоздких композиций, состоящих из сотен алгоритмов. Такие композиции исключают возможность содержательной интерпретации, требуют больших объёмов памяти для хранения базовых алгоритмов и существенных затрат времени на вычисление классификаций.&lt;br /&gt;
&lt;br /&gt;
==Алгоритмы бустинга==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Композицией''' $T$ '''алгоритмов''' &amp;lt;tex&amp;gt;a_t(x) = C(b_t(x)),\ t = 1,...,T&amp;lt;/tex&amp;gt; называется [[Суперпозиции|суперпозиция]] алгоритмических операторов &amp;lt;tex&amp;gt;b_t\ :\ X\to R&amp;lt;/tex&amp;gt;, корректирующей операции &amp;lt;tex&amp;gt;F\ :\ R^T\to R&amp;lt;/tex&amp;gt; и решающего правила &amp;lt;tex&amp;gt; C\ :\ R\to Y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} пространство оценок,&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))), x \in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;br&amp;gt;Алгоритмы $a_t$ называют ''базовыми алгоритмами''.}}&lt;br /&gt;
Бустинг представляет собой композицию алгоритмов, в которых ошибки отдельных алгоритмов взаимно компенсируются. Например, в задаче классификации на два класса $Y = {-1, +1}$ в качестве пространства оценок принимают $R = \mathbb{R}$ и &amp;lt;tex&amp;gt;C(b(x)) = \textrm{sign}(b(x))&amp;lt;/tex&amp;gt;. Тогда базовые алгоритмы возвращают ответы $−1, 0, +1$. Ответ $b_t(x) = 0$ означает, что базовый алгоритм $b_t$ отказывается от классификации объекта $x$, и ответ $b_t(x)$ не учитывается в композиции. Получаем искомую композицию:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))) = \textrm{sign}\left(\sum\limits_{t=1}^T \alpha_t b_t(x)\right),\ x\in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Большая часть алгоритмов бустинга основывается на итеративном обучении слабых классификаторов с дальнейшей сборкой их в сильный классификатор. Когда они добавляются, им обычно приписываются веса, обычно связанные с [[Общие понятия|точностью обучения]]. После добавления слабого классификатора, веса пересчитываются ('''«пересчёт весовых коэффициентов»'''). Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Таким образом, дальнейшее слабое обучение фокусируется на примерах, где предыдущие слабые обучения дали ошибочную классификацию.&lt;br /&gt;
&lt;br /&gt;
Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек [[Общие понятия|тренировочных данных]] и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был '''AdaBoost'''&amp;lt;ref&amp;gt;[http://rob.schapire.net/papers/explaining-adaboost.pdf Explaining AdaBoost {{---}} Robert E. Schapire]&amp;lt;/ref&amp;gt; (сокр. ''Adaptive Boosting''), предложенный Шапире и Фройндом.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы бустинга могут использовать выпуклую или невыпуклую функцию потерь. Алгоритмы с выпуклой функцией, такие как AdaBoost и LogitBoost&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/LogitBoost Wikipedia {{---}} LogitBoost]&amp;lt;/ref&amp;gt;, могут некорректно классифицировать из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой функции потерь, такие как BrownBoost&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/BrownBoost Википедия {{---}} BrownBoost]&amp;lt;/ref&amp;gt;, позволяют избежать переобучения на данных с большим количеством &amp;quot;шума&amp;quot;, откидывая зашумленные элементы.&lt;br /&gt;
&lt;br /&gt;
==Прикладное использование алгоритмов бустинга==&lt;br /&gt;
===Задача классификации объектов===&lt;br /&gt;
Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов — это путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.&lt;br /&gt;
&lt;br /&gt;
Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение [[Общие понятия|признаков]], обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели '''«мешок слов»''', с помощью локальных описателей, таких как '''SIFT'''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Wikipedia {{---}} Scale-invariant feature transform]&amp;lt;/ref&amp;gt;, и так далее. Примерами классификаторов с учителем служат наивные [[Байесовская классификация|байесовские классификаторы]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Метод опорных векторов (SVM)|методы опорных векторов]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, смесь гауссиан и [[Нейронные сети, перцептрон|нейронные сети]]. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.&lt;br /&gt;
&lt;br /&gt;
===Задача ранжирования выдачи поисковых систем===&lt;br /&gt;
Благодаря AdaBoost в мире появился [[CatBoost|градиентный бустинг]] (англ. ''gradient boosting'') или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.&lt;br /&gt;
&lt;br /&gt;
==AdaBoost==&lt;br /&gt;
===Описание===&lt;br /&gt;
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.&lt;br /&gt;
&lt;br /&gt;
AdaBoost вызывает слабые классификаторы в цикле &amp;lt;tex&amp;gt;t = 1,...,T&amp;lt;/tex&amp;gt;. После каждого вызова обновляется распределение весов &amp;lt;tex&amp;gt;D_t&amp;lt;/tex&amp;gt;, которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tex&amp;gt;h_x^t&amp;lt;/tex&amp;gt; {{---}} &amp;quot;слабый&amp;quot; или базисный классификатор, гипотеза, &amp;quot;фича&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;x_i \in X, y_i \in Y = \{-1,+1\}, size(x) = size(y) = m&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' AdaBoost($X$, $Y$, $m$):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;//Инициализируем&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 1..m '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_i^1 = \frac{1}{m}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &lt;br /&gt;
   '''for''' t = 1..T '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;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)〛&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$\epsilon$ - Взвешенная ошибка классификации, классификатор &amp;lt;tex&amp;gt;h_t:X\to \{-1,+1\}&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;\alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' i = 1..m '''do''':&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;Z_t&amp;lt;/tex&amp;gt; {{---}} нормализующий параметр, выбранный так, чтобы &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt; являлось распределением вероятностей, то есть &amp;lt;tex&amp;gt;\sum\limits_{i-1}^{m} D_i^{t+1} = 1&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;t=1,...,T&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
       &amp;lt;tex&amp;gt;D_i^{t+1} = \dfrac{D_i^t \textrm{exp}(-\alpha_t y_i h_t(x_i))}{Z_t}&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &amp;lt;tex&amp;gt;H(x) = \textrm{sign}\left(\sum\limits_{t=1}^{T} \alpha_t h_t(x)\right)&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$H(x)$ - результирующий классификатор&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' $H$&lt;br /&gt;
Выражение для обновления распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt; должно быть сконструировано таким образом, чтобы выполнялось условие:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\exp^{\alpha_t y_i h_t(x_i)} \begin{cases}&amp;lt;1,\ y(i) = h_t(x_i) \\ &amp;gt;1,\ y(i) \neq h_t(x_i)\end{cases}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, после выбора оптимального классификатора &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; для распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt;, объекты &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, которые классификатор &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt;, он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.&lt;br /&gt;
&lt;br /&gt;
===Пример работы===&lt;br /&gt;
Рассмотрим набор данных, которые пометим как $-$ и $+$.&lt;br /&gt;
[[Файл:Adaboost1.jpg|600px|thumb|center|Результат после первой итерации]]&lt;br /&gt;
Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим&lt;br /&gt;
[[Файл:Adaboost2.jpg|1000px|thumb|center|Результат после пересчета весов и второй итерации]]&lt;br /&gt;
Рассмотрим результат после $2$-х итераций:&lt;br /&gt;
[[Файл:Adaboost_result12.jpg|1000px|thumb|center|Итоговый результат после $2$-х итераций]]&lt;br /&gt;
Как видно из последнего изображения, все, что находиться в &amp;quot;цветной&amp;quot; зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и &amp;quot;белые&amp;quot; зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:&lt;br /&gt;
[[Файл:Adaboost_resultfinal.jpg|300px|thumb|center|Результат работы алгоритма после $30$-ти итераций]]&lt;br /&gt;
Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю.&lt;br /&gt;
&lt;br /&gt;
===Достоинства и недостатки===&lt;br /&gt;
'''Достоинства:'''&lt;br /&gt;
# Простота реализации&lt;br /&gt;
# Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов.&lt;br /&gt;
# Время построения композиции практически полностью определяется временем обучения базовых алгоритмов.&lt;br /&gt;
# Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.&lt;br /&gt;
'''Недостатки:'''&lt;br /&gt;
# Склонен к переобучению при наличии значительного уровня шума в данных.&lt;br /&gt;
# Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных.&lt;br /&gt;
&lt;br /&gt;
===Пример кода на python для scikit-learn===&lt;br /&gt;
Классификатор sklearn.ensemble.'''AdaBoostClassifier'''&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html Документация AdaBoostClassifier]&amp;lt;/ref&amp;gt; имеет 5 параметров: '''base_estimator''', '''n_estimators''', '''learning_rate''', '''algorithm''', '''random_state'''.&lt;br /&gt;
Наиболее важными являются: &lt;br /&gt;
# '''base_estimator''' {{---}} базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1)&lt;br /&gt;
# '''n_estimators''' {{---}} максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше.&lt;br /&gt;
# '''learning_rate''' {{---}} вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность).&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' AdaBoostClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
 &lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 &lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
 abc = AdaBoostClassifier(n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.8888888888888888&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим алгоритм с SVC в качестве базы:&lt;br /&gt;
 '''from''' sklearn.svm '''import''' SVC&lt;br /&gt;
 &lt;br /&gt;
 svc=SVC(probability='''True''', kernel=''''linear'''')&lt;br /&gt;
 &lt;br /&gt;
 abc = AdaBoostClassifier(base_estimator='''svc''', n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.9555555555555556&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.adaboost&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#adaboost Smile, AdaBoost]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(ada.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, ada)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&lt;br /&gt;
*[[Байесовская классификация|Байесовская классификация]]&lt;br /&gt;
*[[Мета-обучение|Мета-обучение]]&lt;br /&gt;
*[[Нейронные сети, перцептрон|Нейронные сети]]&lt;br /&gt;
*[[Оценка качества в задаче кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
*[[CatBoost|CatBoost]]&lt;br /&gt;
&lt;br /&gt;
== Примечания==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=AdaBoost AdaBoost] {{---}} статья на machinelearning.ru&lt;br /&gt;
# [http://cmp.felk.cvut.cz/~sochmj1/adaboost_talk.pdf AdaBoost] {{---}} презентация по AdaBoost&lt;br /&gt;
# [https://ru.coursera.org/lecture/ml-classification/example-of-adaboost-in-action-um0cX Example of AdaBoost in action] {{---}} презентация на coursera.org&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2) Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>217.66.159.109</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69438</id>
		<title>Бустинг, AdaBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69438"/>
				<updated>2019-01-26T18:03:14Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.159.109: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание==&lt;br /&gt;
'''Бустинг''' (англ. ''boosting'') — это [[Мета-обучение|мета-алгоритм машинного обучения]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;. Основной идеей бустинга является комбинирование слабых функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Сильный обучающий алгоритм является классификатором, хорошо [[Корреляция случайных величин|коррелирующим]] с верной классификацией, в отличие от слабого. Наравне с бустингом в мета-обучении также рассматривают такие понятия, как [[Виды ансамблей|бэггинг]] (англ. ''bagging'') и стэкинг&amp;lt;ref&amp;gt;[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 Стекинг {{---}} Дьяконов Александр]&amp;lt;/ref&amp;gt; (англ. ''stacking''). Бэггинг, в отличии от бустинга, использует параллельное обучение базовых классификаторов. Стэкинг же комбинирует результаты различных алгоритмов, получая тем самым более точный ответ. &lt;br /&gt;
&lt;br /&gt;
Одним из недостатков бустинга является то, что он может приводить к построению громоздких композиций, состоящих из сотен алгоритмов. Такие композиции исключают возможность содержательной интерпретации, требуют больших объёмов памяти для хранения базовых алгоритмов и существенных затрат времени на вычисление классификаций.&lt;br /&gt;
&lt;br /&gt;
==Алгоритмы бустинга==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Композицией''' $T$ '''алгоритмов''' &amp;lt;tex&amp;gt;a_t(x) = C(b_t(x)),\ t = 1,...,T&amp;lt;/tex&amp;gt; называется [[Суперпозиции|суперпозиция]] алгоритмических операторов &amp;lt;tex&amp;gt;b_t\ :\ X\to R&amp;lt;/tex&amp;gt;, корректирующей операции &amp;lt;tex&amp;gt;F\ :\ R^T\to R&amp;lt;/tex&amp;gt; и решающего правила &amp;lt;tex&amp;gt; C\ :\ R\to Y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} пространство оценок,&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))), x \in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;br&amp;gt;Алгоритмы $a_t$ называют ''базовыми алгоритмами''.}}&lt;br /&gt;
Бустинг представляет собой композицию алгоритмов, в которых ошибки отдельных алгоритмов взаимно компенсируются. Например, в задаче классификации на два класса $Y = {-1, +1}$ в качестве пространства оценок принимают $R = \mathbb{R}$ и &amp;lt;tex&amp;gt;C(b(x)) = \textrm{sign}(b(x))&amp;lt;/tex&amp;gt;. Тогда базовые алгоритмы возвращают ответы $−1, 0, +1$. Ответ $b_t(x) = 0$ означает, что базовый алгоритм $b_t$ отказывается от классификации объекта $x$, и ответ $b_t(x)$ не учитывается в композиции. Получаем искомую композицию:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))) = \textrm{sign}\left(\sum\limits_{t=1}^T \alpha_t b_t(x)\right),\ x\in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Большая часть алгоритмов бустинга основывается на итеративном обучении слабых классификаторов с дальнейшей сборкой их в сильный классификатор. Когда они добавляются, им обычно приписываются веса, обычно связанные с [[Общие понятия|точностью обучения]]. После добавления слабого классификатора, веса пересчитываются ('''«пересчёт весовых коэффициентов»'''). Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Таким образом, дальнейшее слабое обучение фокусируется на примерах, где предыдущие слабые обучения дали ошибочную классификацию.&lt;br /&gt;
&lt;br /&gt;
Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек [[Общие понятия|тренировочных данных]] и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был '''AdaBoost'''&amp;lt;ref&amp;gt;[http://rob.schapire.net/papers/explaining-adaboost.pdf Explaining AdaBoost {{---}} Robert E. Schapire]&amp;lt;/ref&amp;gt; (сокр. ''Adaptive Boosting''), предложенный Шапире и Фройндом.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы бустинга могут использовать выпуклую или невыпуклую функцию потерь. Алгоритмы с выпуклой функцией, такие как AdaBoost и LogitBoost&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/LogitBoost Wikipedia {{---}} LogitBoost]&amp;lt;/ref&amp;gt;, могут некорректно классифицировать из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой функции потерь, такие как BrownBoost&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/BrownBoost Википедия {{---}} BrownBoost]&amp;lt;/ref&amp;gt;, позволяют избежать переобучения на данных с большим количеством &amp;quot;шума&amp;quot;, откидывая зашумленные элементы.&lt;br /&gt;
&lt;br /&gt;
==Прикладное использование алгоритмов бустинга==&lt;br /&gt;
===Задача классификации объектов===&lt;br /&gt;
Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов — это путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.&lt;br /&gt;
&lt;br /&gt;
Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение [[Общие понятия|признаков]], обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели '''«мешок слов»''', с помощью локальных описателей, таких как '''SIFT'''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Wikipedia {{---}} Scale-invariant feature transform]&amp;lt;/ref&amp;gt;, и так далее. Примерами классификаторов с учителем служат наивные [[Байесовская классификация|байесовские классификаторы]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Метод опорных векторов (SVM)|методы опорных векторов]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, смесь гауссиан и [[Нейронные сети, перцептрон|нейронные сети]]. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.&lt;br /&gt;
&lt;br /&gt;
===Задача ранжирования выдачи поисковых систем===&lt;br /&gt;
Благодаря AdaBoost в мире появился [[CatBoost|градиентный бустинг]] (англ. ''gradient boosting'') или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.&lt;br /&gt;
&lt;br /&gt;
==AdaBoost==&lt;br /&gt;
===Описание===&lt;br /&gt;
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.&lt;br /&gt;
&lt;br /&gt;
AdaBoost вызывает слабые классификаторы в цикле &amp;lt;tex&amp;gt;t = 1,...,T&amp;lt;/tex&amp;gt;. После каждого вызова обновляется распределение весов &amp;lt;tex&amp;gt;D_t&amp;lt;/tex&amp;gt;, которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.&lt;br /&gt;
&lt;br /&gt;
===Описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;x_i \in X, y_i \in Y = \{-1,+1\}, size(x) = size(y) = m&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' AdaBoost($X$, $Y$, $m$):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;//Инициализируем&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 1..m '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_i^1 = \frac{1}{m}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &lt;br /&gt;
   '''for''' t = 1..T '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;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)〛&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$\epsilon$ - Взвешенная ошибка классификации, классификатор &amp;lt;tex&amp;gt;h_t:X\to \{-1,+1\}&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;\alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' i = 1..m '''do''':&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;Z_t&amp;lt;/tex&amp;gt; {{---}} нормализующий параметр, выбранный так, чтобы &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt; являлось распределением вероятностей, то есть &amp;lt;tex&amp;gt;\sum\limits_{i-1}^{m} D_i^{t+1} = 1&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;t=1,...,T&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
       &amp;lt;tex&amp;gt;D_i^{t+1} = \dfrac{D_i^t \textrm{exp}(-\alpha_t y_i h_t(x_i))}{Z_t}&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &amp;lt;tex&amp;gt;H(x) = \textrm{sign}\left(\sum\limits_{t=1}^{T} \alpha_t h_t(x)\right)&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$H(x)$ - результирующий классификатор&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' $H$&lt;br /&gt;
Выражение для обновления распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt; должно быть сконструировано таким образом, чтобы выполнялось условие:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\exp^{\alpha_t y_i h_t(x_i)} \begin{cases}&amp;lt;1,\ y(i) = h_t(x_i) \\ &amp;gt;1,\ y(i) \neq h_t(x_i)\end{cases}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Таким образом, после выбора оптимального классификатора &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; для распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt;, объекты &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, которые классификатор &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt;, он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.&lt;br /&gt;
&lt;br /&gt;
===Пример работы===&lt;br /&gt;
Рассмотрим набор данных, которые пометим как $-$ и $+$.&lt;br /&gt;
[[Файл:Adaboost1.jpg|600px|thumb|center|Результат после первой итерации]]&lt;br /&gt;
Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим&lt;br /&gt;
[[Файл:Adaboost2.jpg|1000px|thumb|center|Результат после пересчета весов и второй итерации]]&lt;br /&gt;
Рассмотрим результат после $2$-х итераций:&lt;br /&gt;
[[Файл:Adaboost_result12.jpg|1000px|thumb|center|Итоговый результат после $2$-х итераций]]&lt;br /&gt;
Как видно из последнего изображения, все, что находиться в &amp;quot;цветной&amp;quot; зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и &amp;quot;белые&amp;quot; зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:&lt;br /&gt;
[[Файл:Adaboost_resultfinal.jpg|300px|thumb|center|Результат работы алгоритма после $30$-ти итераций]]&lt;br /&gt;
Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю.&lt;br /&gt;
&lt;br /&gt;
===Достоинства и недостатки===&lt;br /&gt;
'''Достоинства:'''&lt;br /&gt;
# Простота реализации&lt;br /&gt;
# Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов.&lt;br /&gt;
# Время построения композиции практически полностью определяется временем обучения базовых алгоритмов.&lt;br /&gt;
# Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.&lt;br /&gt;
'''Недостатки:'''&lt;br /&gt;
# Склонен к переобучению при наличии значительного уровня шума в данных.&lt;br /&gt;
# Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных.&lt;br /&gt;
&lt;br /&gt;
===Пример кода на python для scikit-learn===&lt;br /&gt;
Классификатор sklearn.ensemble.'''AdaBoostClassifier'''&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html Документация AdaBoostClassifier]&amp;lt;/ref&amp;gt; имеет 5 параметров: '''base_estimator''', '''n_estimators''', '''learning_rate''', '''algorithm''', '''random_state'''.&lt;br /&gt;
Наиболее важными являются: &lt;br /&gt;
# '''base_estimator''' {{---}} базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1)&lt;br /&gt;
# '''n_estimators''' {{---}} максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше.&lt;br /&gt;
# '''learning_rate''' {{---}} вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность).&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' AdaBoostClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
 &lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 &lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
 abc = AdaBoostClassifier(n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.8888888888888888&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим алгоритм с SVC в качестве базы:&lt;br /&gt;
 '''from''' sklearn.svm '''import''' SVC&lt;br /&gt;
 &lt;br /&gt;
 svc=SVC(probability='''True''', kernel=''''linear'''')&lt;br /&gt;
 &lt;br /&gt;
 abc = AdaBoostClassifier(base_estimator='''svc''', n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.9555555555555556&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.adaboost&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#adaboost Smile, AdaBoost]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(ada.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, ada)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&lt;br /&gt;
*[[Байесовская классификация|Байесовская классификация]]&lt;br /&gt;
*[[Мета-обучение|Мета-обучение]]&lt;br /&gt;
*[[Нейронные сети, перцептрон|Нейронные сети]]&lt;br /&gt;
*[[Оценка качества в задаче кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
*[[CatBoost|CatBoost]]&lt;br /&gt;
&lt;br /&gt;
== Примечания==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=AdaBoost AdaBoost] {{---}} статья на machinelearning.ru&lt;br /&gt;
# [http://cmp.felk.cvut.cz/~sochmj1/adaboost_talk.pdf AdaBoost] {{---}} презентация по AdaBoost&lt;br /&gt;
# [https://ru.coursera.org/lecture/ml-classification/example-of-adaboost-in-action-um0cX Example of AdaBoost in action] {{---}} презентация на coursera.org&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2) Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>217.66.159.109</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69436</id>
		<title>Бустинг, AdaBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69436"/>
				<updated>2019-01-26T18:02:20Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.159.109: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание==&lt;br /&gt;
'''Бустинг''' (англ. ''boosting'') — это [[Мета-обучение|мета-алгоритм машинного обучения]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;. Основной идеей бустинга является комбинирование слабых функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Сильный обучающий алгоритм является классификатором, хорошо [[Корреляция случайных величин|коррелирующим]] с верной классификацией, в отличие от слабого. Наравне с бустингом в мета-обучении также рассматривают такие понятия, как [[Виды ансамблей|бэггинг]] (англ. ''bagging'') и стэкинг&amp;lt;ref&amp;gt;[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 Стекинг {{---}} Дьяконов Александр]&amp;lt;/ref&amp;gt; (англ. ''stacking''). Бэггинг, в отличии от бустинга, использует параллельное обучение базовых классификаторов. Стэкинг же комбинирует результаты различных алгоритмов, получая тем самым более точный ответ. &lt;br /&gt;
&lt;br /&gt;
Одним из недостатков бустинга является то, что он может приводить к построению громоздких композиций, состоящих из сотен алгоритмов. Такие композиции исключают возможность содержательной интерпретации, требуют больших объёмов памяти для хранения базовых алгоритмов и существенных затрат времени на вычисление классификаций.&lt;br /&gt;
&lt;br /&gt;
==Алгоритмы бустинга==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Композицией''' $T$ '''алгоритмов''' &amp;lt;tex&amp;gt;a_t(x) = C(b_t(x)),\ t = 1,...,T&amp;lt;/tex&amp;gt; называется [[Суперпозиции|суперпозиция]] алгоритмических операторов &amp;lt;tex&amp;gt;b_t\ :\ X\to R&amp;lt;/tex&amp;gt;, корректирующей операции &amp;lt;tex&amp;gt;F\ :\ R^T\to R&amp;lt;/tex&amp;gt; и решающего правила &amp;lt;tex&amp;gt; C\ :\ R\to Y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} пространство оценок,&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))), x \in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;br&amp;gt;Алгоритмы $a_t$ называют ''базовыми алгоритмами''.}}&lt;br /&gt;
Бустинг представляет собой композицию алгоритмов, в которых ошибки отдельных алгоритмов взаимно компенсируются. Например, в задаче классификации на два класса $Y = {-1, +1}$ в качестве пространства оценок принимают $R = \mathbb{R}$ и &amp;lt;tex&amp;gt;C(b(x)) = \textrm{sign}(b(x))&amp;lt;/tex&amp;gt;. Тогда базовые алгоритмы возвращают ответы $−1, 0, +1$. Ответ $b_t(x) = 0$ означает, что базовый алгоритм $b_t$ отказывается от классификации объекта $x$, и ответ $b_t(x)$ не учитывается в композиции. Получаем искомую композицию:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))) = \textrm{sign}\left(\sum\limits_{t=1}^T \alpha_t b_t(x)\right),\ x\in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Большая часть алгоритмов бустинга основывается на итеративном обучении слабых классификаторов с дальнейшей сборкой их в сильный классификатор. Когда они добавляются, им обычно приписываются веса, обычно связанные с [[Общие понятия|точностью обучения]]. После добавления слабого классификатора, веса пересчитываются ('''«пересчёт весовых коэффициентов»'''). Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Таким образом, дальнейшее слабое обучение фокусируется на примерах, где предыдущие слабые обучения дали ошибочную классификацию.&lt;br /&gt;
&lt;br /&gt;
Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек [[Общие понятия|тренировочных данных]] и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был '''AdaBoost'''&amp;lt;ref&amp;gt;[http://rob.schapire.net/papers/explaining-adaboost.pdf Explaining AdaBoost {{---}} Robert E. Schapire]&amp;lt;/ref&amp;gt; (сокр. ''Adaptive Boosting''), предложенный Шапире и Фройндом.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы бустинга могут использовать выпуклую или невыпуклую функцию потерь. Алгоритмы с выпуклой функцией, такие как AdaBoost и LogitBoost&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/LogitBoost Wikipedia {{---}} LogitBoost]&amp;lt;/ref&amp;gt;, могут некорректно классифицировать из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой функции потерь, такие как BrownBoost&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/BrownBoost Википедия {{---}} BrownBoost]&amp;lt;/ref&amp;gt;, позволяют избежать переобучения на данных с большим количеством &amp;quot;шума&amp;quot;, откидывая зашумленные элементы.&lt;br /&gt;
&lt;br /&gt;
==Прикладное использование алгоритмов бустинга==&lt;br /&gt;
===Задача классификации объектов===&lt;br /&gt;
Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов — это путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.&lt;br /&gt;
&lt;br /&gt;
Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение [[Общие понятия|признаков]], обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели '''«мешок слов»''', с помощью локальных описателей, таких как '''SIFT'''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Wikipedia {{---}} Scale-invariant feature transform]&amp;lt;/ref&amp;gt;, и так далее. Примерами классификаторов с учителем служат наивные [[Байесовская классификация|байесовские классификаторы]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Метод опорных векторов (SVM)|методы опорных векторов]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, смесь гауссиан и [[Нейронные сети, перцептрон|нейронные сети]]. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.&lt;br /&gt;
&lt;br /&gt;
===Задача ранжирования выдачи поисковых систем===&lt;br /&gt;
Благодаря AdaBoost в мире появился [[CatBoost|градиентный бустинг]] (англ. ''gradient boosting'') или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.&lt;br /&gt;
&lt;br /&gt;
==AdaBoost==&lt;br /&gt;
===Описание===&lt;br /&gt;
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.&lt;br /&gt;
&lt;br /&gt;
AdaBoost вызывает слабые классификаторы в цикле &amp;lt;tex&amp;gt;t = 1,...,T&amp;lt;/tex&amp;gt;. После каждого вызова обновляется распределение весов &amp;lt;tex&amp;gt;D_t&amp;lt;/tex&amp;gt;, которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.&lt;br /&gt;
&lt;br /&gt;
===Описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;x_i \in X, y_i \in Y = \{-1,+1\}, size(x) = size(y) = m&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' AdaBoost($X$, $Y$, $m$):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;//Инициализируем&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 1..m '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_i^1 = \frac{1}{m}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &lt;br /&gt;
   '''for''' t = 1..T '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;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)〛&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$\epsilon$ - Взвешенная ошибка классификации, классификатор &amp;lt;tex&amp;gt;h_t:X\to \{-1,+1\}&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;\alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' i = 1..m '''do''':&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;Z_t&amp;lt;/tex&amp;gt; {{---}} нормализующий параметр, выбранный так, чтобы &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt; являлось распределением вероятностей, то есть &amp;lt;tex&amp;gt;\sum\limits_{i-1}^{m} D_i^{t+1} = 1&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;t=1,...,T&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
       &amp;lt;tex&amp;gt;D_i^{t+1} = \dfrac{D_i^t \textrm{exp}(-\alpha_t y_i h_t(x_i))}{Z_t}&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &amp;lt;tex&amp;gt;H(x) = \textrm{sign}\left(\sum\limits_{t=1}^{T} \alpha_t h_t(x)\right)&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$H(x)$ - результирующий классификатор&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' $H$&lt;br /&gt;
Выражение для обновления распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt; должно быть сконструировано таким образом, чтобы выполнялось условие:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\exp^{\alpha_t y_i h_t(x_i)} \begin{cases}&amp;lt;1,\ y(i) = h_t(x_i) \\ &amp;gt;1,\ y(i) \neq h_t(x_i)\end{cases}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;В&lt;br /&gt;
&lt;br /&gt;
Таким образом, после выбора оптимального классификатора &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; для распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt;, объекты &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, которые классификатор &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt;, он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.&lt;br /&gt;
&lt;br /&gt;
===Пример работы===&lt;br /&gt;
Рассмотрим набор данных, которые пометим как $-$ и $+$.&lt;br /&gt;
[[Файл:Adaboost1.jpg|600px|thumb|center|Результат после первой итерации]]&lt;br /&gt;
Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим&lt;br /&gt;
[[Файл:Adaboost2.jpg|1000px|thumb|center|Результат после пересчета весов и второй итерации]]&lt;br /&gt;
Рассмотрим результат после $2$-х итераций:&lt;br /&gt;
[[Файл:Adaboost_result12.jpg|1000px|thumb|center|Итоговый результат после $2$-х итераций]]&lt;br /&gt;
Как видно из последнего изображения, все, что находиться в &amp;quot;цветной&amp;quot; зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и &amp;quot;белые&amp;quot; зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:&lt;br /&gt;
[[Файл:Adaboost_resultfinal.jpg|300px|thumb|center|Результат работы алгоритма после $30$-ти итераций]]&lt;br /&gt;
Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю.&lt;br /&gt;
&lt;br /&gt;
===Достоинства и недостатки===&lt;br /&gt;
'''Достоинства:'''&lt;br /&gt;
# Простота реализации&lt;br /&gt;
# Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов.&lt;br /&gt;
# Время построения композиции практически полностью определяется временем обучения базовых алгоритмов.&lt;br /&gt;
# Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.&lt;br /&gt;
'''Недостатки:'''&lt;br /&gt;
# Склонен к переобучению при наличии значительного уровня шума в данных.&lt;br /&gt;
# Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных.&lt;br /&gt;
&lt;br /&gt;
===Пример кода на python для scikit-learn===&lt;br /&gt;
Классификатор sklearn.ensemble.'''AdaBoostClassifier'''&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html Документация AdaBoostClassifier]&amp;lt;/ref&amp;gt; имеет 5 параметров: '''base_estimator''', '''n_estimators''', '''learning_rate''', '''algorithm''', '''random_state'''.&lt;br /&gt;
Наиболее важными являются: &lt;br /&gt;
# '''base_estimator''' {{---}} базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1)&lt;br /&gt;
# '''n_estimators''' {{---}} максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше.&lt;br /&gt;
# '''learning_rate''' {{---}} вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность).&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' AdaBoostClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
 &lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 &lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
 abc = AdaBoostClassifier(n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.8888888888888888&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим алгоритм с SVC в качестве базы:&lt;br /&gt;
 '''from''' sklearn.svm '''import''' SVC&lt;br /&gt;
 &lt;br /&gt;
 svc=SVC(probability='''True''', kernel=''''linear'''')&lt;br /&gt;
 &lt;br /&gt;
 abc = AdaBoostClassifier(base_estimator='''svc''', n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.9555555555555556&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.adaboost&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#adaboost Smile, AdaBoost]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(ada.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, ada)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&lt;br /&gt;
*[[Байесовская классификация|Байесовская классификация]]&lt;br /&gt;
*[[Мета-обучение|Мета-обучение]]&lt;br /&gt;
*[[Нейронные сети, перцептрон|Нейронные сети]]&lt;br /&gt;
*[[Оценка качества в задаче кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
*[[CatBoost|CatBoost]]&lt;br /&gt;
&lt;br /&gt;
== Примечания==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=AdaBoost AdaBoost] {{---}} статья на machinelearning.ru&lt;br /&gt;
# [http://cmp.felk.cvut.cz/~sochmj1/adaboost_talk.pdf AdaBoost] {{---}} презентация по AdaBoost&lt;br /&gt;
# [https://ru.coursera.org/lecture/ml-classification/example-of-adaboost-in-action-um0cX Example of AdaBoost in action] {{---}} презентация на coursera.org&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2) Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>217.66.159.109</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69433</id>
		<title>Бустинг, AdaBoost</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%91%D1%83%D1%81%D1%82%D0%B8%D0%BD%D0%B3,_AdaBoost&amp;diff=69433"/>
				<updated>2019-01-26T17:54:25Z</updated>
		
		<summary type="html">&lt;p&gt;217.66.159.109: /* Описание алгоритма */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание==&lt;br /&gt;
'''Бустинг''' (англ. ''boosting'') — это [[Мета-обучение|мета-алгоритм машинного обучения]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;. Основной идеей бустинга является комбинирование слабых функций, которые строятся в ходе итеративного процесса, где на каждом шаге новая модель обучается с использованием данных об ошибках предыдущих. Сильный обучающий алгоритм является классификатором, хорошо [[Корреляция случайных величин|коррелирующим]] с верной классификацией, в отличие от слабого. Наравне с бустингом в мета-обучении также рассматривают такие понятия, как [[Виды ансамблей|бэггинг]] (англ. ''bagging'') и стэкинг&amp;lt;ref&amp;gt;[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 Стекинг {{---}} Дьяконов Александр]&amp;lt;/ref&amp;gt; (англ. ''stacking''). Бэггинг, в отличии от бустинга, использует параллельное обучение базовых классификаторов. Стэкинг же комбинирует результаты различных алгоритмов, получая тем самым более точный ответ. &lt;br /&gt;
&lt;br /&gt;
Одним из недостатков бустинга является то, что он может приводить к построению громоздких композиций, состоящих из сотен алгоритмов. Такие композиции исключают возможность содержательной интерпретации, требуют больших объёмов памяти для хранения базовых алгоритмов и существенных затрат времени на вычисление классификаций.&lt;br /&gt;
&lt;br /&gt;
==Алгоритмы бустинга==&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition='''Композицией''' $T$ '''алгоритмов''' &amp;lt;tex&amp;gt;a_t(x) = C(b_t(x)),\ t = 1,...,T&amp;lt;/tex&amp;gt; называется [[Суперпозиции|суперпозиция]] алгоритмических операторов &amp;lt;tex&amp;gt;b_t\ :\ X\to R&amp;lt;/tex&amp;gt;, корректирующей операции &amp;lt;tex&amp;gt;F\ :\ R^T\to R&amp;lt;/tex&amp;gt; и решающего правила &amp;lt;tex&amp;gt; C\ :\ R\to Y&amp;lt;/tex&amp;gt;, где &amp;lt;tex&amp;gt;R&amp;lt;/tex&amp;gt; {{---}} пространство оценок,&amp;lt;br&amp;gt;&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))), x \in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&amp;lt;br&amp;gt;Алгоритмы $a_t$ называют ''базовыми алгоритмами''.}}&lt;br /&gt;
Бустинг представляет собой композицию алгоритмов, в которых ошибки отдельных алгоритмов взаимно компенсируются. Например, в задаче классификации на два класса $Y = {-1, +1}$ в качестве пространства оценок принимают $R = \mathbb{R}$ и &amp;lt;tex&amp;gt;C(b(x)) = \textrm{sign}(b(x))&amp;lt;/tex&amp;gt;. Тогда базовые алгоритмы возвращают ответы $−1, 0, +1$. Ответ $b_t(x) = 0$ означает, что базовый алгоритм $b_t$ отказывается от классификации объекта $x$, и ответ $b_t(x)$ не учитывается в композиции. Получаем искомую композицию:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;a(x) = C(F(b_1(x),...,b_T(x))) = \textrm{sign}\left(\sum\limits_{t=1}^T \alpha_t b_t(x)\right),\ x\in X&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Большая часть алгоритмов бустинга основывается на итеративном обучении слабых классификаторов с дальнейшей сборкой их в сильный классификатор. Когда они добавляются, им обычно приписываются веса, обычно связанные с [[Общие понятия|точностью обучения]]. После добавления слабого классификатора, веса пересчитываются ('''«пересчёт весовых коэффициентов»'''). Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Таким образом, дальнейшее слабое обучение фокусируется на примерах, где предыдущие слабые обучения дали ошибочную классификацию.&lt;br /&gt;
&lt;br /&gt;
Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек [[Общие понятия|тренировочных данных]] и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был '''AdaBoost'''&amp;lt;ref&amp;gt;[http://rob.schapire.net/papers/explaining-adaboost.pdf Explaining AdaBoost {{---}} Robert E. Schapire]&amp;lt;/ref&amp;gt; (сокр. ''Adaptive Boosting''), предложенный Шапире и Фройндом.&lt;br /&gt;
&lt;br /&gt;
Алгоритмы бустинга могут использовать выпуклую или невыпуклую функцию потерь. Алгоритмы с выпуклой функцией, такие как AdaBoost и LogitBoost&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/LogitBoost Wikipedia {{---}} LogitBoost]&amp;lt;/ref&amp;gt;, могут некорректно классифицировать из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой функции потерь, такие как BrownBoost&amp;lt;ref&amp;gt;[https://ru.wikipedia.org/wiki/BrownBoost Википедия {{---}} BrownBoost]&amp;lt;/ref&amp;gt;, позволяют избежать переобучения на данных с большим количеством &amp;quot;шума&amp;quot;, откидывая зашумленные элементы.&lt;br /&gt;
&lt;br /&gt;
==Прикладное использование алгоритмов бустинга==&lt;br /&gt;
===Задача классификации объектов===&lt;br /&gt;
Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов — это путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.&lt;br /&gt;
&lt;br /&gt;
Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение [[Общие понятия|признаков]], обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели '''«мешок слов»''', с помощью локальных описателей, таких как '''SIFT'''&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/Scale-invariant_feature_transform Wikipedia {{---}} Scale-invariant feature transform]&amp;lt;/ref&amp;gt;, и так далее. Примерами классификаторов с учителем служат наивные [[Байесовская классификация|байесовские классификаторы]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, [[Метод опорных векторов (SVM)|методы опорных векторов]]&amp;lt;sup&amp;gt;[на 22.01.19 не создан]&amp;lt;/sup&amp;gt;, смесь гауссиан и [[Нейронные сети, перцептрон|нейронные сети]]. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.&lt;br /&gt;
&lt;br /&gt;
===Задача ранжирования выдачи поисковых систем===&lt;br /&gt;
Благодаря AdaBoost в мире появился [[CatBoost|градиентный бустинг]] (англ. ''gradient boosting'') или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.&lt;br /&gt;
&lt;br /&gt;
==AdaBoost==&lt;br /&gt;
===Описание===&lt;br /&gt;
Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.&lt;br /&gt;
&lt;br /&gt;
AdaBoost вызывает слабые классификаторы в цикле &amp;lt;tex&amp;gt;t = 1,...,T&amp;lt;/tex&amp;gt;. После каждого вызова обновляется распределение весов &amp;lt;tex&amp;gt;D_t&amp;lt;/tex&amp;gt;, которые отвечают важности каждого из объектов обучающего множества для классификации. На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.&lt;br /&gt;
&lt;br /&gt;
===Описание алгоритма===&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;x_i \in X, y_i \in Y = \{-1,+1\}, size(x) = size(y) = m&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
 '''function''' AdaBoost($X$, $Y$, $m$):&lt;br /&gt;
    &amp;lt;font color=green&amp;gt;//Инициализируем&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''for''' i = 1..m '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;D_i^1 = \frac{1}{m}&amp;lt;/tex&amp;gt;&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &lt;br /&gt;
   '''for''' t = 1..T '''do''':&lt;br /&gt;
     &amp;lt;tex&amp;gt;\epsilon_j = \sum\limits_{i=1}^{m} D_i^t [y_i\neq h_j(x_i)]&amp;lt;/tex&amp;gt; &amp;lt;font color=green&amp;gt;//Взвешенная ошибка классификации&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;h_t = \arg \min\limits_{h_j \in \mathcal{H}} \epsilon_j&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//Классификатор &amp;lt;tex&amp;gt;h_t:X\to \{-1,+1\}&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt;&lt;br /&gt;
     &amp;lt;tex&amp;gt;\alpha_t = \frac{1}{2}\ln\frac{1-\epsilon_t}{\epsilon_t}&amp;lt;/tex&amp;gt;&lt;br /&gt;
     '''for''' i = 1..m '''do''':&lt;br /&gt;
       &amp;lt;font color=green&amp;gt;//&amp;lt;tex&amp;gt;Z_t&amp;lt;/tex&amp;gt; {{---}} нормализующий параметр, выбранный так, чтобы &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt; являлось распределением вероятностей, то есть &amp;lt;tex&amp;gt;\sum\limits_{i-1}^{m} D_i^{t+1} = 1&amp;lt;/tex&amp;gt;, для &amp;lt;tex&amp;gt;t=1,...,T&amp;lt;/tex&amp;gt;&amp;lt;/font&amp;gt; &lt;br /&gt;
       &amp;lt;tex&amp;gt;D_i^{t+1} = \dfrac{D_i^t \textrm{exp}(-\alpha_t y_i h_t(x_i))}{Z_t}&amp;lt;/tex&amp;gt; &lt;br /&gt;
     '''end''' '''for'''&lt;br /&gt;
   '''end''' '''for'''&lt;br /&gt;
   &amp;lt;tex&amp;gt;H(x) = \textrm{sign}\left(\sum\limits_{t=1}^{T} \alpha_t h_t(x)\right)&amp;lt;/tex&amp;gt;  &amp;lt;font color=green&amp;gt;//$H(x)$ - результирующий классификатор&amp;lt;/font&amp;gt;&lt;br /&gt;
   '''return''' $H$&lt;br /&gt;
Выражение для обновления распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt; должно быть сконструировано таким образом, чтобы выполнялось условие:&lt;br /&gt;
&amp;lt;center&amp;gt;&amp;lt;tex&amp;gt;\exp^{\alpha_t y_i h_t(x_i)} \begin{cases}&amp;lt;1,\ y(i) = h_t(x_i) \\ &amp;gt;1,\ y(i) \neq h_t(x_i)\end{cases}&amp;lt;/tex&amp;gt;&amp;lt;/center&amp;gt;В&lt;br /&gt;
&lt;br /&gt;
Таким образом, после выбора оптимального классификатора &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; для распределения &amp;lt;tex&amp;gt;D^t&amp;lt;/tex&amp;gt;, объекты &amp;lt;tex&amp;gt;x_i&amp;lt;/tex&amp;gt;, которые классификатор &amp;lt;tex&amp;gt;h_t&amp;lt;/tex&amp;gt; идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении &amp;lt;tex&amp;gt;D^{t+1}&amp;lt;/tex&amp;gt;, он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.&lt;br /&gt;
&lt;br /&gt;
===Пример работы===&lt;br /&gt;
Рассмотрим набор данных, которые пометим как $-$ и $+$.&lt;br /&gt;
[[Файл:Adaboost1.jpg|600px|thumb|center|Результат после первой итерации]]&lt;br /&gt;
Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим&lt;br /&gt;
[[Файл:Adaboost2.jpg|1000px|thumb|center|Результат после пересчета весов и второй итерации]]&lt;br /&gt;
Рассмотрим результат после $2$-х итераций:&lt;br /&gt;
[[Файл:Adaboost_result12.jpg|1000px|thumb|center|Итоговый результат после $2$-х итераций]]&lt;br /&gt;
Как видно из последнего изображения, все, что находиться в &amp;quot;цветной&amp;quot; зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и &amp;quot;белые&amp;quot; зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:&lt;br /&gt;
[[Файл:Adaboost_resultfinal.jpg|300px|thumb|center|Результат работы алгоритма после $30$-ти итераций]]&lt;br /&gt;
Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю.&lt;br /&gt;
&lt;br /&gt;
===Достоинства и недостатки===&lt;br /&gt;
'''Достоинства:'''&lt;br /&gt;
# Простота реализации&lt;br /&gt;
# Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов.&lt;br /&gt;
# Время построения композиции практически полностью определяется временем обучения базовых алгоритмов.&lt;br /&gt;
# Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.&lt;br /&gt;
'''Недостатки:'''&lt;br /&gt;
# Склонен к переобучению при наличии значительного уровня шума в данных.&lt;br /&gt;
# Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных.&lt;br /&gt;
&lt;br /&gt;
===Пример кода на python для scikit-learn===&lt;br /&gt;
Классификатор sklearn.ensemble.'''AdaBoostClassifier'''&amp;lt;ref&amp;gt;[https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.AdaBoostClassifier.html Документация AdaBoostClassifier]&amp;lt;/ref&amp;gt; имеет 5 параметров: '''base_estimator''', '''n_estimators''', '''learning_rate''', '''algorithm''', '''random_state'''.&lt;br /&gt;
Наиболее важными являются: &lt;br /&gt;
# '''base_estimator''' {{---}} базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1)&lt;br /&gt;
# '''n_estimators''' {{---}} максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше.&lt;br /&gt;
# '''learning_rate''' {{---}} вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность).&lt;br /&gt;
&lt;br /&gt;
 '''from''' sklearn.ensemble '''import''' AdaBoostClassifier&lt;br /&gt;
 '''from''' sklearn '''import''' datasets&lt;br /&gt;
 '''from''' sklearn.model_selection '''import''' train_test_split&lt;br /&gt;
 '''from''' sklearn '''import''' metrics&lt;br /&gt;
 &lt;br /&gt;
 iris = datasets.'''load_iris()'''&lt;br /&gt;
 &lt;br /&gt;
 X = iris.data&lt;br /&gt;
 y = iris.target&lt;br /&gt;
 &lt;br /&gt;
 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size='''0.3''')&lt;br /&gt;
&lt;br /&gt;
 abc = AdaBoostClassifier(n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.8888888888888888&lt;br /&gt;
&lt;br /&gt;
Теперь рассмотрим алгоритм с SVC в качестве базы:&lt;br /&gt;
 '''from''' sklearn.svm '''import''' SVC&lt;br /&gt;
 &lt;br /&gt;
 svc=SVC(probability='''True''', kernel=''''linear'''')&lt;br /&gt;
 &lt;br /&gt;
 abc = AdaBoostClassifier(base_estimator='''svc''', n_estimators='''50''', learning_rate='''1''')&lt;br /&gt;
 &lt;br /&gt;
 model = abc.'''fit'''(X_train, y_train)&lt;br /&gt;
 &lt;br /&gt;
 y_pred = model.'''predict'''(X_test)&lt;br /&gt;
 &lt;br /&gt;
 '''print'''(&amp;quot;Accuracy:&amp;quot;,metrics.'''accuracy_score'''(y_test, y_pred))&lt;br /&gt;
&lt;br /&gt;
 Accuracy: 0.9555555555555556&lt;br /&gt;
&lt;br /&gt;
===Пример на языке Scala===&lt;br /&gt;
SBT зависимость:&lt;br /&gt;
  libraryDependencies '''+=''' &amp;quot;com.github.haifengl&amp;quot; '''%%''' &amp;quot;smile-scala&amp;quot; '''%''' &amp;quot;1.5.2&amp;quot;&lt;br /&gt;
Пример классификации датасета и вычисления F1 меры&amp;lt;ref&amp;gt;[https://en.wikipedia.org/wiki/F1_score F1 мера]&amp;lt;/ref&amp;gt; используя smile.classification.adaboost&amp;lt;ref&amp;gt;[https://haifengl.github.io/smile/classification.html#adaboost Smile, AdaBoost]&amp;lt;/ref&amp;gt;:&lt;br /&gt;
  '''import '''smile.classification._&lt;br /&gt;
  '''import '''smile.data._&lt;br /&gt;
  '''import '''smile.plot._&lt;br /&gt;
  '''import '''smile.read&lt;br /&gt;
  '''import '''smile.validation.FMeasure&lt;br /&gt;
&lt;br /&gt;
  '''val '''iris: AttributeDataset = read.table(&amp;quot;iris.csv&amp;quot;, delimiter = &amp;quot;,&amp;quot;, response = Some(('''new '''NumericAttribute(&amp;quot;class&amp;quot;), 2)))&lt;br /&gt;
  '''val '''x: Array[Array['''Double''']] = iris.x()&lt;br /&gt;
  '''val '''y: Array['''Int'''] = iris.y().map(_.toInt)&lt;br /&gt;
  '''val '''ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2)&lt;br /&gt;
  '''val '''predictions: Array['''Int'''] = x.map(ada.predict)&lt;br /&gt;
  '''val '''f1Score = '''new '''FMeasure().measure(predictions, y)&lt;br /&gt;
  plot(x, y, ada)&lt;br /&gt;
&lt;br /&gt;
== См. также ==&lt;br /&gt;
*[[Метод опорных векторов (SVM)|Метод опорных векторов]]&lt;br /&gt;
*[[Байесовская классификация|Байесовская классификация]]&lt;br /&gt;
*[[Мета-обучение|Мета-обучение]]&lt;br /&gt;
*[[Нейронные сети, перцептрон|Нейронные сети]]&lt;br /&gt;
*[[Оценка качества в задаче кластеризации|Оценка качества в задаче кластеризации]]&lt;br /&gt;
*[[CatBoost|CatBoost]]&lt;br /&gt;
&lt;br /&gt;
== Примечания==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Источники информации ==&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=AdaBoost AdaBoost] {{---}} статья на machinelearning.ru&lt;br /&gt;
# [http://cmp.felk.cvut.cz/~sochmj1/adaboost_talk.pdf AdaBoost] {{---}} презентация по AdaBoost&lt;br /&gt;
# [https://ru.coursera.org/lecture/ml-classification/example-of-adaboost-in-action-um0cX Example of AdaBoost in action] {{---}} презентация на coursera.org&lt;br /&gt;
# [http://www.machinelearning.ru/wiki/index.php?title=%D0%9C%D0%B0%D1%88%D0%B8%D0%BD%D0%BD%D0%BE%D0%B5_%D0%BE%D0%B1%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5_(%D0%BA%D1%83%D1%80%D1%81_%D0%BB%D0%B5%D0%BA%D1%86%D0%B8%D0%B9%2C_%D0%9A.%D0%92.%D0%92%D0%BE%D1%80%D0%BE%D0%BD%D1%86%D0%BE%D0%B2) Курс лекций по машинному обучению] {{---}} Воронцов К.В.&lt;br /&gt;
[[Категория: Автоматическое машинное обучение]]&lt;br /&gt;
[[Категория: Машинное обучение]]&lt;/div&gt;</summary>
		<author><name>217.66.159.109</name></author>	</entry>

	</feed>