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

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

Технику можно легко применить, выполнив следующие три шага:

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

Это может показаться странно простым для реализации, действительно ли это даст лучший результат, чем по сравнению с одной независимой прогностической моделью? На самом деле ансамбль моделей часто показывал лучшие результаты, чем любая отдельная модель. Почему так?

Почему усреднение по ансамблю работает?

Предвзятость и дисперсия

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

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

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

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

Обзор машины для голосования

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

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

Что мы можем здесь сделать, так это смешать восемь чашек кофе и получить новую смесь кофе, которая сохраняет нотку карамели, шоколада и горечи каждого кофе. Теоретически этот кофе должен обслуживать более широкий круг клиентов по сравнению, например, с чистым эспрессо. Это связано с тем, что первоначальные ограничения горечи в эспрессо, которые могут не подойти некоторым покупателям, были усреднены смесью.

Определение разнообразия?

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

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

Демонстрация Python

В этой статье я продемонстрирую реализацию усреднения по ансамблю как для проблемы регрессии, так и для проблемы классификации.

Классификация

Во-первых, мы импортируем некоторые необходимые модули из Scikit Learn.

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import VotingClassifier 
from sklearn.neighbors import KNeighborsClassifier

Мы используем make_classification() из Scitkit Learn для имитации задачи бинарной классификации с 50 функциями и 10000 выборками.

Смоделированные данные далее разбиваются на обучающие и тестовые наборы.

X, y = make_classification(n_samples=10000, n_features=50, n_redundant= 15, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=43)

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

models = [('Decision Tree', DecisionTreeClassifier()),
         ('KNN', KNeighborsClassifier()),
         ('Naive Bayes', GaussianNB())]
for name, model in models:
    model.fit(X_train, y_train)
    
    prediction = model.predict(X_test)
    score = accuracy_score(y_test, prediction)
    print('{} Model Accuracy: {}'.format(name,score))

После подгонки моделей мы можем заметить, что модели уже могут неплохо работать сами по себе. Давайте посмотрим на результат после того, как мы внедрили методы ансамбля с использованием VotingClassifier из Scitkit Learn.

ensemble = VotingClassifier(estimators=models)
ensemble.fit(X_train, y_train)
prediction = ensemble.predict(X_test)
score = accuracy_score(y_test, prediction)
print('Ensemble Model Accuracy: {}'.format(score))

VotingClassifier реализует объединение трех моделей, выбирая предсказанные метки классов с помощью голосования по правилу большинства. Например, если две модели предсказывали класс A для экземпляра, а только одна модель предсказывала класс B, окончательный результат предсказания будет классом A.

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

Регрессия

Этот метод также может быть реализован на задачах регрессии. Подобно тому, как мы представили это в задаче классификации, мы сначала импортируем некоторые необходимые модули из Scitkit Learn.

import numpy as np
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.datasets import make_regression
from sklearn.svm import SVR
from sklearn.tree import DecisionTreeRegressor
from sklearn.neighbors import KNeighborsRegressor
from sklearn.ensemble import VotingRegressor

На этот раз мы используем make_regression() для моделирования проблемы регрессии с 10 функциями и 10000 выборками.

Смоделированные данные снова разбиваются на обучающие и тестовые наборы.

X, y = make_regression(n_samples=10000, n_features=10, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30, random_state=43)

Мы обучаем регрессор опорных векторов, регрессор дерева решений, KNN для прогнозирования проблемы регрессии.

models = [('Support Vector', SVR()),
         ('Decision Tree', DecisionTreeRegressor()),
         ('KNN', KNeighborsRegressor())]
score = []
for name, model in models:
    model.fit(X_train, y_train)
    
    prediction = model.predict(X_test)
    score = mean_squared_error(y_test, prediction, squared = False)
    scores.append(score)
    print('{} Model RMSE: {}'.format(name,score))

Как обычно, теперь мы реализуем методы ансамблирования с помощью VotingRegressor из Scitkit Learn.

ensemble = VotingRegressor(estimators=models)
ensemble.fit(X_train, y_train)
prediction = ensemble.predict(X_test)
score = mean_squared_error(y_test, prediction, squared = False)
print('Ensemble Model RMSE: {}'.format(score))

VotingRegressor работает аналогично VotingClassifier, за исключением того, что он реализует объединение, просто усредняя отдельные прогнозы для формирования окончательного прогноза.

Дополнительные полезные советы

Как в VotingRegressor, так и в VotingClassifier мы можем использовать параметр «веса», чтобы изменить результат ансамбля. Параметр «веса» определяет, сколько силы каждая модель имеет в конечном результате. Например, в этой проблеме регрессии мы видим, что модель KNN относительно лучше прогнозирует результат, чем ее аналоги. В этом случае мы можем присвоить больший вес его вкладу в окончательный прогноз. Для этого мы просто передаем список весов в функцию VotingRegressor.

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

scores = [-x for x in scores]
ranking = 1 + np.argsort(scores)
print(ranking)

Используя RMSE из моделей, мы реализуем np.argsort для их сортировки в соответствии с их рангами. Поскольку np.argsort сортирует от меньшего значения, мы сначала отрицаем оценки, прежде чем сортировать их. Таким образом, модель с более низким RMSE будет иметь больший вес. Например, модели KNN присваивается вес 3 из 6.

Давайте снова обучим ансамбль и посмотрим, станут ли наши результаты лучше.

ensemble = VotingRegressor(estimators=models, weights = ranking)
ensemble.fit(X_train, y_train)
prediction = ensemble.predict(X_test)
score = mean_squared_error(y_test, prediction, squared = False)
print('Ensemble Model RMSE: {}'.format(score))

К сожалению, наша ансамблевая модель на этот раз имеет более высокое среднеквадратичное отклонение по сравнению с обычным усреднением. Тогда вы можете спросить, как нам узнать, какой вес установить, чтобы получить идеальные веса для каждой модели?

К счастью, мы можем использовать составной регрессор, который изучит лучшие линейные комбинации из предикторов и сможет снова получить окончательный результат с улучшенной точностью предсказания. Подробнее о Stacked Regressor я расскажу в своей следующей статье.

Еда на вынос

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

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

Еще раз спасибо, что нашли время в своем плотном графике, чтобы прочитать этот отрывок.