Adding to basket

Пример кода[править]

Пример кода на python для scikit-learnправить

Классификатор sklearn.ensemble.AdaBoostClassifier имеет 5 параметров: base_estimator, n_estimators, learning_rate, algorithm, random_state.
Наиболее важными являются:

  1. base_estimator — базовый алгоритм. По умолчанию используется DecisionTreeClassifier(max_depth=1);
  2. n_estimators — максимальное количество оценок, после которого бустинг прекращается. Если произойдет полное совпадение, то закончится раньше;
  3. learning_rate — вклад каждой модели в весовые коэффициенты и значение по умолчанию равно $1$. Снижение этого параметра будет означать, что весовые коэффициенты буду увеличиваться или уменьшаться в небольшой степени, вынуждая модель дольше обучаться (но иногда повышается производительность).
from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import metrics

iris = datasets.load_iris()

X = iris.data
y = iris.target

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
abc = AdaBoostClassifier(n_estimators=50, learning_rate=1)

model = abc.fit(X_train, y_train)

y_pred = model.predict(X_test)

print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.8888888888888888

Теперь рассмотрим алгоритм с SVC в качестве базы:

from sklearn.svm import SVC

svc=SVC(probability=True, kernel='linear')

abc = AdaBoostClassifier(base_estimator=svc, n_estimators=50, learning_rate=1)

model = abc.fit(X_train, y_train)

y_pred = model.predict(X_test)

print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
Accuracy: 0.9555555555555556

Пример на языке Scalaправить

SBT зависимость:

 libraryDependencies += "com.github.haifengl" %% "smile-scala" % "1.5.2"

Пример классификации датасета и вычисления F1 меры используя smile.classification.adaboost:

 import smile.classification._
 import smile.data._
 import smile.plot._
 import smile.read
 import smile.validation.FMeasure
 val iris: AttributeDataset = read.table("iris.csv", delimiter = ",", response = Some((new NumericAttribute("class"), 2)))
 val x: Array[Array[Double]] = iris.x()
 val y: Array[Int] = iris.y().map(_.toInt)
 val ada: AdaBoost = adaboost(x, y, ntrees = 500, maxNodes = 2)
 val predictions: Array[Int] = x.map(ada.predict)
 val f1Score = new FMeasure().measure(predictions, y)
 plot(x, y, ada)

Пример на языке Javaправить

Пример классификации с применением

зависимость:

 <dependency>
   <groupId>com.github.haifengl</groupId>
   <artifactId>smile-core</artifactId>
   <version>1.5.2</version>
 </dependency>
 import smile.classification.AdaBoost;
 import smile.data.parser.ArffParser;
 import smile.validation.Accuracy;
 import smile.validation.ClassificationMeasure;
 import smile.validation.FMeasure;
 import java.util.Arrays;
 
 var arffParser = new ArffParser();
 arffParser.setResponseIndex(0);
 var train    = arffParser.parse(this.getClass().getResourceAsStream("train.arff"));
 var test     = arffParser.parse(this.getClass().getResouceAsStream("test.arff"));
 
 var forest   = new AdaBoost(train.attributes(), train.x(), train.labels(), 200, 4);
 
 var measures = new ClassificationMeasure[]{new FMeasure(), new Accuracy()};
 var results  = forest.test(test.x(), test.labels(), measures);
 System.out.println(Arrays.deepToString(results));

Пример на языке Rправить

Основная статья: Примеры кода на R
install.packages()
library(mlr)


train <- read.csv()
test <- read.csv()


getParamSet()
baseLearner <- makeLearner(,  = )


controlFunction <- makeTuneControlRandom( = ) 
cvFunction <- makeResampleDesc(,  = ) 

gbmParameters<- makeParamSet(
  makeDiscreteParam(,  = ),
  makeIntegerParam(,  = ,  = ), 
  makeIntegerParam(,  = ,  = ), 
  makeIntegerParam(,  = ,  = ),
  makeNumericParam(,  = ,  = )
)


gbmTuningParameters <- tuneParams( = baseLearner,
                                   = trainTask,
                                   = cvFunction,
                                   = acc,
                                   = gbmParameters,
                                   = controlFunction)


model <- setHyperPars( = baseLearner,  = gbmTuningParameters)


fit <- train(model, train)
predictions <- predict(fit, test)

Алгоритмы бустинга[править]

Определение:
Композицией $T$ алгоритмов называется суперпозиция алгоритмических операторов , корректирующей операции и решающего правила , где — пространство оценок,
, Алгоритмы $a_t$ называют базовыми алгоритмами.

Бустинг представляет собой композицию алгоритмов, в которых ошибки отдельных алгоритмов взаимно компенсируются. Например, в задаче классификации на два класса $Y = {-1, +1}$ в качестве пространства оценок принимают $R = \mathbb{R}$ и . Тогда базовые алгоритмы возвращают ответы $−1, 0, +1$. Ответ $b_t(x) = 0$ означает, что базовый алгоритм $b_t$ отказывается от классификации объекта $x$, и ответ $b_t(x)$ не учитывается в композиции. Получаем искомую композицию:

Большая часть алгоритмов бустинга основывается на итеративном обучении слабых классификаторов с дальнейшей сборкой их в сильный классификатор. Когда они добавляются, им обычно приписываются веса, обычно связанные с точностью обучения. После добавления слабого классификатора, веса пересчитываются («пересчёт весовых коэффициентов»). Неверно классифицированные входные данные получают больший вес, а правильно классифицированные экземпляры теряют вес. Таким образом, дальнейшее слабое обучение фокусируется на примерах, где предыдущие слабые обучения дали ошибочную классификацию.

Основное расхождение между многими алгоритмами бустинга заключается в методах определения весовых коэффициентов точек тренировочных данных и гипотез. Первым алгоритмом, который смог адаптироваться к слабому обучению был AdaBoost (сокр. Adaptive Boosting), предложенный Шапире и Фройндом.

Алгоритмы бустинга могут использовать выпуклую или невыпуклую функцию потерь. Алгоритмы с выпуклой функцией, такие как AdaBoost и LogitBoost, могут некорректно классифицировать из-за случайного шума, так как не могут обучить базовым и поддающимся научению комбинациям слабых гипотез. Алгоритмы бустинга, основанные на невыпуклой функции потерь, такие как BrownBoost, позволяют избежать переобучения на данных с большим количеством «шума», откидывая зашумленные элементы.

AdaBoost[править]

Описаниеправить

Алгоритм может использоваться в сочетании с несколькими алгоритмами классификации для улучшения их эффективности. Алгоритм усиливает классификаторы, объединяя их в «комитет». AdaBoost является адаптивным в том смысле, что каждый следующий комитет классификаторов строится по объектам, неверно классифицированным предыдущими комитетами. AdaBoost чувствителен к шуму в данных и выбросам. Однако он менее подвержен переобучению по сравнению с другими алгоритмами машинного обучения.

AdaBoost вызывает слабые классификаторы в цикле

После каждого вызова обновляется распределение весов , которые отвечают важности каждого из объектов обучающего множества для классификации

На каждой итерации веса каждого неверно классифицированного объекта возрастают, таким образом новый комитет классификаторов «фокусирует своё внимание» на этих объектах.

Описание алгоритмаправить

function AdaBoost($X$, $Y$, $m$):
   
  for i = 1..m do:
    
  end for
  
  for t = 1..T do:
      
    
    for i = 1..m do:
       
       
    end for
  end for
    
  return $H$

Выражение для обновления распределения должно быть сконструировано таким образом, чтобы выполнялось условие:

Таким образом, после выбора оптимального классификатора для распределения , объекты , которые классификатор идентифицирует корректно, имеют веса меньшие, чем те, которые идентифицируются некорректно. Следовательно, когда алгоритм тестирует классификаторы на распределении , он будет выбирать классификатор, который лучше идентифицирует объекты неверно распознаваемые предыдущим классификатором.

Пример работыправить

Рассмотрим набор данных, которые пометим как $-$ и $+$.


Результат после первой итерации

Для всех ошибочно классифицированных объектов увеличим веса, а для верно классифицированных уменьшим


Результат после пересчета весов и второй итерации

Рассмотрим результат после $2$-х итераций:


Итоговый результат после $2$-х итераций

Как видно из последнего изображения, все, что находиться в «цветной» зоне, мы можем однозначно классифицировать, но тогда у нас появляются ошибки и «белые» зоны, которые мы не можем однозначно классифицировать. Рассмотрим алгоритм после $30$-ти итераций:


Результат работы алгоритма после $30$-ти итераций

Теперь у нас все объекты классифицируются верно и число ошибок на выборке равно нулю.

Достоинства и недостаткиправить

Достоинства:

  1. Простота реализации;
  2. Хорошая обобщающая способность. В реальных задачах удаётся строить композиции, превосходящие по качеству базовые алгоритмы. Обобщающая способность может улучшаться по мере увеличения числа базовых алгоритмов;
  3. Время построения композиции практически полностью определяется временем обучения базовых алгоритмов;
  4. Возможность идентифицировать выбросы. Это наиболее «трудные» объекты $x_i$, для которых в процессе наращивания композиции веса $w_i$ принимают наибольшие значения.

Недостатки:

  1. Склонен к переобучению при наличии значительного уровня шума в данных;
  2. Требует достаточно длинных обучающих выборок. Другие методы линейной коррекции, в частности, бэггинг, способны строить алгоритмы сопоставимого качества по меньшим выборкам данных.

Прикладное использование алгоритмов бустинга[править]

Задача классификации объектовправить

Если даны изображения, содержащие различные известные в мире объекты, классификатор может быть обучен на основе них для автоматической классификации объектов в будущих неизвестных изображениях. Простые классификаторы, построенные на основе некоторых признаков изображения объекта, обычно оказываются малоэффективными в классификации. Использование методов бустинга для классификации объектов — путь объединения слабых классификаторов специальным образом для улучшения общей возможности классификации.

Классификация признаков является типичной задачей компьютерного зрения, где определяется, содержит ли изображение некоторую категорию объектов или нет. Идея тесно связана с распознаванием, идентификацией и обнаружением. Классификация по обнаружению объекта обычно содержит выделение признаков, обучение классификатора и применение классификатора к новым данным. Есть много способов представления категории объектов, например по анализу формы, с помощью модели «мешок слов», с помощью локальных описателей, таких как SIFT, и так далее. Примерами классификаторов с учителем служат наивные байесовские классификаторы, методы опорных векторов, смесь гауссиан и нейронные сети. Однако исследования показали, что категории объектов и их положение в изображениях могут быть обнаружены также с помощью обучения без учителя.

Задача ранжирования выдачи поисковых системправить

Благодаря AdaBoost в мире появился градиентный бустинг (англ. gradient boosting) или GBM. Задачу ранжирования выдачи поисковых запросов рассмотрели с точки зрения функции потерь, которая штрафует за ошибки в порядке выдачи, поэтому было удобно внедрить GBM в ранжирование.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
The voice for you
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: