С реализацией в scikit-learn

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

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

Типы ансамблевых методов

  • Голосование большинством
  • Бэгинг
  • Вставка
  • Повышение
  • Укладка

Голосование большинством

Предположим, что три слабых ученика с заданной точностью:

  1. Логистическая регрессия: 89,06 %
  2. Классификатор дерева решений: 87,66 %
  3. Метод опорных векторов: 88,28 %
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
log_clf = LogisticRegression(solver='lbfgs', max_iter=30000, random_state = 42)
dt_clf = DecisionTreeClassifier(random_state = 42)
svm_clf = SVC(random_state = 42)

Когда среди этих учеников происходит голосование и выбирается наиболее частый ответ, точность этой новой модели будет приблизительно 89,09 %, что выше, чем у всех упомянутых слабых учеников.

from sklearn.ensemble import VotingClassifier
hard_voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('dt', dt_clf), ('svc', svm_clf)])

Объясняемый подход называется Жесткое голосование. Однако существует концепция под названием Мягкое голосование, которая присваивает вес каждому учащемуся на основе вероятности учащегося. Следовательно, голосование происходит в соответствии с весом и результатами каждого учащегося.

soft_voting_clf = VotingClassifier(estimators=[('lr', log_clf), ('rf', dt_clf), ('svc', svm_clf)], voting='soft')

Упаковка

Агрегация Bootstrap, также называемая бэггингом, представляет собой ансамблевый метод, который использует единую модель с несколькими экземплярами и обучает каждый экземпляр с различным подмножеством входных данных. Например, рассмотрим 2000 DecisionTreeClassifiers, которые обучаются с помощью другого подмножества входных данных (максимум 400 выборок для каждого экземпляра). Окончательные прогнозы делаются путем использования среднего значения всех прогнозов моделей.

from sklearn.ensemble import BaggingClassifier
bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=2000, max_samples=400, bootstrap=True, n_jobs=-1)

Вставка

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

bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=2000, max_samples=400, bootstrap=False, n_jobs=-1)

Повышение

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

Самыми популярными видами прокачки являются:

Адаптивное повышение (AdaBoost)

В AdaBoost первая модель обучается на входных данных, а остальные обучаются на обновленных входных данных последовательно.

Существует два алгоритма реализации AdaBoost:

  • AdaBoost-SAMME
  • AdaBoost-SAMME.R

AdaBoost-SAMME

Это основной алгоритм по умолчанию для AdaBoost, который часто работает быстрее, чем SAMME.R. Однако; обычно имеет меньшую точность по сравнению с SAMME.R.

from sklearn.ensemble import AdaBoostClassifier
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200, algorithm="SAMME", learning_rate=0.5)
ada_clf.fit(x_train, y_train)
y_pred = ada_clf.predict(x_test)
accuracy_score(y_test, y_pred)

AdaBoost-SAMME.R

Алгоритм SAMME.R использует вероятность моделей для обновления веса выборок.

from sklearn.ensemble import AdaBoostClassifier
ada_clf = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), n_estimators=200, algorithm="SAMME.R", learning_rate=0.5)
ada_clf.fit(x_train, y_train)
y_pred = ada_clf.predict(x_test)
accuracy_score(y_test, y_pred)

Усиление градиента

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

Внедрение Gradient Boost вручную:

tree_cl1 = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_cl1.fit(x_train, y_train)

y2 = y_train - tree_cl1.predict(x_train)
tree_cl2 = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_cl2.fit(x_train, y2)

y3 = y2 - tree_cl2.predict(x_train)
tree_cl3 = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_cl3.fit(x_train, y3)

y_pred = sum(tree.predict(x_test) for tree in (tree_cl1, tree_cl2, tree_cl3))
accuracy_score(y_test, y_pred)

Реализация Gradient Boost с помощью scikit-learn:

from sklearn.ensemble import GradientBoostingClassifier
gbc = GradientBoostingClassifier(max_depth=2, n_estimators=5, random_state=42, learning_rate=1.0)
gbc.fit(x_train, y_train)
y_pred = gbc.predict(x_test)
accuracy_score(y_test, y_pred)

Ранняя остановка

Подход «Ранняя остановка» используется для поиска оптимального количества моделей, чтобы минимизировать ошибку проверки. Что касается Gradient Boost, этот подход может быть реализован следующим образом:

from sklearn.metrics import mean_squared_error
from sklearn.ensemble import GradientBoostingClassifier
result={}
for count_of_estimators in range(1, 70):
  gbc = GradientBoostingClassifier(max_depth=2, n_estimators=count_of_estimators, random_state=42, learning_rate=1.0)
  gbc.fit(x_train, y_train)
  y_pred = gbc.predict(x_test)
  val_error = mean_squared_error(y_test, y_pred)
  result[count_of_estimators]=val_error

В приведенном выше примере наилучшим числом моделей является 65, что дает ошибку проверки примерно 0,0963.

Стекирование

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

Например, предположим, что модель стекирования включает три модели:

  • Случайный лес
  • Метод опорных векторов (SVM)
  • k-ближайшие соседи (KNN)

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

from sklearn.ensemble import StackingClassifier
from sklearn.neighbors import KNeighborsClassifier

rf_clf = RandomForestClassifier(n_estimators=10, random_state=42)
svm_clf = SVC(random_state=42)
knn_clf = KNeighborsClassifier(n_neighbors=3)
stacking_clf = StackingClassifier(estimators=[('rf', rf_clf), ('svc', svm_clf), ('knn', knn_clf)], final_estimator=LogisticRegression())

Заключение

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

Ссылки