С реализацией в scikit-learn
Когда модель машинного обучения проектируется и разрабатывается, ее точность может быть ниже ожидаемой или требуемой. Следовательно, ансамблевые методы повышают точность слабых учащихся, комбинируя их с особым подходом. Этот подход основан на теории под названием Мудрость толпы.
В последнее время ансамблевые методы получили распространение из-за широкого круга проблем, которые можно было предсказать с помощью этих методов. Эти методы могут быть использованы в задачах классификации и регрессии.
Типы ансамблевых методов
- Голосование большинством
- Бэгинг
- Вставка
- Повышение
- Укладка
Голосование большинством
Предположим, что три слабых ученика с заданной точностью:
- Логистическая регрессия: 89,06 %
- Классификатор дерева решений: 87,66 %
- Метод опорных векторов: 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.
Ссылки
- Себастьян Рашка. STAT 451: Машинное обучение. https://pages.stat.wisc.edu/~sraschka/teaching/stat451-fs2020/
- Команда ассистентов преподавателей: Введение в машинное обучение. https://github.com/asharifiz/Introduction_to_Machine_Learning