Введение

Ансамбль — это метод использования нескольких моделей машинного обучения, также называемых базовыми учащимися (могут быть или не быть одного и того же типа), с целью создания более мощной модели, чем любая из отдельных моделей.

В этом блоге я расскажу о следующих техниках ансамбля:

  • Упаковка.
  • Повышение.
  • Укладка.

Bagginging — Bвыборка ootstrap с Aggregation — метаалгоритм ансамбля машинного обучения, предназначенный для повышения стабильности и точности используемых алгоритмов машинного обучения. в статистической классификации и регрессии. Это также уменьшает дисперсию и помогает избежать переобучения.

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

Выполненные шаги –

  • Bootstrap Sampling используется для создания подмножеств набора данных Train.
  • Затем отдельные базовые модели обучаются на подмножестве данных.
  • Окончательное решение принимается на основе агрегирования всех прогнозов базовых учащихся — голосов большинства, используемых в случае классификации, и среднего/медианы, используемых в случае проблемы регрессии.

Зачем использовать выборку Bootstrap?

Прежде всего, следует отметить, что в данном случае мы используем Overfit Base Learners (High Variance). Итак, нам нужен какой-то механизм для уменьшения дисперсии в конечной модели без влияния на смещение — самозагрузка обеспечивает именно это. Поскольку ни один из базовых учащихся не увидит все данные, поэтому небольшие изменения в исходном наборе данных изменят не всех, а некоторых базовых учащихся. Это, в свою очередь, уменьшит дисперсию в окончательной модели. Следовательно, окончательная модель будет иметь низкое смещение и уменьшенную дисперсию.

Случайный лес — это метод обучения ансамблю (группирование) для классификации и регрессии, который работает путем построения множества деревьев решений во время обучения и вывода класса, который является режимом. » классов (классификация) или среднее предсказание (регрессия) отдельных деревьев.

Как было показано ранее, базовые учащиеся, используемые во время метода бэггинга, имеют низкую погрешность и высокую дисперсию — одной из таких моделей является глубокое дерево решений. . Это то, что используется в случае Random Forest.

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

В дополнение к тому, что мы видели для бэггинга (случайная выборка строк), Random Forest также включает случайную выборку столбцов (функция пакетирования). Это гарантирует, что созданные деревья решений имеют комбинацию различных функций, используемых для прогнозирования. Поскольку мы берем случайные выборки для создания подмножеств данных, существуют некоторые точки данных, которые не используются ни в одной из выборок. Они называются точками Out-of-Bag (OOB). Их можно использовать на этапе перекрестной проверки в качестве тестовых данных для оценки гиперпараметров.

Пример кода:-

>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.datasets import make_classification
>>> X, y = make_classification(n_samples=1000, n_features=4,
...                            n_informative=2, n_redundant=0,
...                            random_state=0, shuffle=False)
>>> clf = RandomForestClassifier(n_estimators=100, max_depth=2,
...                              random_state=0)
>>> clf.fit(X, y)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=2, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=None,
            oob_score=False, random_state=0, verbose=0, warm_start=False)
>>> print(clf.feature_importances_)
[0.14205973 0.76664038 0.0282433  0.06305659]
>>> print(clf.predict([[0, 0, 0, 0]]))
[1]

Ознакомьтесь с документацией sklearn для получения дополнительной информации о Random Forest.

Boosting — метаалгоритм ансамбля машинного обучения, предназначенный в первую очередь для уменьшения предвзятости, а также дисперсии в обучении с учителем, а также семейство алгоритмов машинного обучения, которые превращают слабых учеников в сильных.

В то время как процесс бэггинга создается несколькими базовыми учащимися, параллельно работающими над подвыборками, повышение — это последовательный процесс, в котором каждый последующий (слабый) базовый учащийся пытается исправить своего предшественника. Созданная таким образом окончательная модель уменьшает смещение (за счет уменьшения ошибки обучения) в системе.

Типы повышения –

  • AdaBoostAdaptive Boost — это метод, который использует неглубокие деревья решений( Пни принятия решений) в качестве базовых обучающихся и последовательно уменьшает количество ошибок на каждой итерации.

Каждый из базовых учеников сам по себе является слабым классификатором и допускает ошибки при классификации +ve и -ve точек. Всем точкам данных в начале присваиваются одинаковые веса. Однако на каждой последующей итерации ошибки наказываются (увеличиваются +/- на рисунке выше) добавлением весов. На изображении выше видно, что D1 правильно классифицирует две точки +ve, однако допускает ошибки в трех других точках +ve. Этим неверно классифицированным точкам присваиваются дополнительные веса, чтобы они составляли большую часть обучающего набора следующего классификатора. Кроме того, каждому классификатору (Alpha_t) присваивается весовое значение, определенное AdaBoost. Чем точнее классификатор, тем больший вес ему присваивается (Alpha_t).

Окончательный классификатор состоит из «T» слабых классификаторов, где h_t(x) — это результат Classifier_t, а Alpha_t — это вес, присвоенный ему в соответствии с оценкой AdaBoost. Таким образом, окончательный результат — это просто линейная комбинация всех слабых классификаторов, а затем окончательное решение просто принимается, глядя на знак этой суммы.

Пример кода:-

>>> from sklearn.ensemble import AdaBoostClassifier
>>> from sklearn import datasets
>>> 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.33, random_state=42)
>>> clf = AdaBoostClassifier(n_estimators=50, learning_rate=0.1, random_state=42)
>>> clf.fit(X_train, y_train)
AdaBoostClassifier(algorithm='SAMME.R', base_estimator=None,
          learning_rate=0.1, n_estimators=50, random_state=42)
>>> pred = clf.predict(X_test)
>>> accuracy_score(y_test, pred)
0.96

Ознакомьтесь с документацией sklearn для получения дополнительной информации об AdaBoost.

  • Усиление градиента — это подход, при котором создаются новые модели, которые предсказывают невязки или ошибки предыдущих моделей, а затем суммируются для получения окончательного прогноза. Это называется повышением градиента, потому что оно использует алгоритм градиентного спуска для минимизации потерь при добавлении новых моделей.

Выполненные шаги –

  1. Подберите простую модель (Ex — простая линейная регрессия) для целевой переменной и оцените псевдоостатки.
  2. На последующих итерациях подбирайте базовых учащихся на основе псевдоостатков в качестве целевой переменной вместо фактических значений (y_i).
  3. Повторяйте шаг 2, пока сумма остатков не станет постоянной.
  4. Окончательная модель строится путем объединения всех базовых учащихся путем присвоения оцененных весов каждой модели.

Пример кода:-

>>> from sklearn.ensemble import GradientBoostingClassifier
>>> from sklearn import datasets
>>> 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.33, random_state=42)
>>> clf = GradientBoostingClassifier(n_estimators=50, learning_rate=0.1, random_state=42)
>>> clf.fit(X_train, y_train)
GradientBoostingClassifier(criterion='friedman_mse', init=None,
              learning_rate=0.1, loss='deviance', max_depth=3,
              max_features=None, max_leaf_nodes=None,
              min_impurity_decrease=0.0, min_impurity_split=None,
              min_samples_leaf=1, min_samples_split=2,
              min_weight_fraction_leaf=0.0, n_estimators=50,
              presort='auto', random_state=42, subsample=1.0, verbose=0,
              warm_start=False)
>>> pred = clf.predict(X_test)
>>> accuracy_score(y_test, pred)
0.98

Ознакомьтесь с документацией sklearn для получения дополнительной информации о классификаторе повышения градиента.

  • XGBoost — Extreme Gradient Boosting — это реализация деревьев решений с градиентным усилением. Машины с градиентным усилением, как правило, очень медленны в реализации из-за последовательного обучения модели. Следовательно, они не очень масштабируемы. XGBoost ориентирован на скорость вычислений и производительность модели.

Основные функции –

  • Распараллеливание построения дерева с использованием всех ядер ЦП во время обучения.
  • Распределенные вычисления для обучения очень больших моделей с использованием кластера машин.
  • Внешние вычисления для очень больших наборов данных, которые не помещаются в память.
  • Оптимизация кеша структур данных и алгоритма для наилучшего использования оборудования.

Пример кода:-

>>> from xgboost import XGBClassifier
>>> from sklearn import datasets
>>> 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.33, random_state=42)
>>> clf = XGBClassifier(learning_rate=0.1, n_estimators=50, random_state=42)
>>> clf.fit(X_train, y_train)
XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1,
       colsample_bytree=1, gamma=0, learning_rate=0.1, max_delta_step=0,
       max_depth=3, min_child_weight=1, missing=None, n_estimators=50,
       n_jobs=1, nthread=None, objective='multi:softprob', random_state=42,
       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=None,
       silent=True, subsample=1)
>>> pred = clf.predict(X_test)
>>> accuracy_score(y_test, pred)
0.98

Ознакомьтесь с документацией XGBoost для получения дополнительной информации о XGBoost Classifier.

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

Базовые учащиеся в этом подходе обучаются на всех данных обучения. Эти хорошо подходящие модели делают прогнозы для набора тестовых данных, которые затем передаются в метаклассификатор/регрессор для предоставления окончательного прогноза. Как правило, чем более разнообразны базовые учащиеся, тем лучше ансамбль стекирования.

Пример кода:-

>>> from sklearn import model_selection
>>> from sklearn.linear_model import LogisticRegression
>>> from sklearn.neighbors import KNeighborsClassifier
>>> from sklearn.naive_bayes import GaussianNB
>>> from sklearn.ensemble import RandomForestClassifier
>>> from mlxtend.classifier import StackingClassifier
>>> import numpy as np
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> X = iris.data
>>> y = iris.target
>>> clf1 = KNeighborsClassifier(n_neighbors=1)
>>> clf2 = RandomForestClassifier(random_state=1)
>>> clf3 = GaussianNB()
>>> lr = LogisticRegression()
>>> sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],
...                           meta_classifier=lr)
>>>
>>> print('3-fold cross validation:\n')
3-fold cross validation:
>>> for clf, label in zip([clf1, clf2, clf3, sclf], ['KNN','Random Forest','Naive Bayes','StackingClassifier']):
...     scores = model_selection.cross_val_score(clf, X[:, 1:3], y,cv=3, scoring='accuracy')
...     print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))
...
Accuracy: 0.91 (+/- 0.01) [KNN]
Accuracy: 0.91 (+/- 0.06) [Random Forest]
Accuracy: 0.92 (+/- 0.03) [Naive Bayes]
Accuracy: 0.95 (+/- 0.03) [StackingClassifier]

Ознакомьтесь с документацией mlxtend для получения дополнительной информации о Stacking Classifier.

Сводка —

  • Три типа ансамблей — бэггинг, бустинг и стек.
  • Бэггинг уменьшает дисперсию, форсирование уменьшает смещение, а суммирование повышает точность.
  • Случайный лес — это реализация бэггинга, в которой в качестве базовых обучающихся используются глубокие деревья решений.
  • XGBoost является реализацией Boosting и использует неглубокие деревья решений в качестве базовых учеников.
  • Stacking использует гетерогенные модели в качестве базовых учащихся и метаклассификатор/регрессор, построенный с использованием прогнозов базовых учащихся, чтобы сделать окончательный прогноз.

Ссылки –