Кратко про Ensemble методы с примерами

от автора

Привет, Хабр!

Сегодня мы рассмотрим Ensemble методов, которые помогают сделать модели более точными и устойчивыми к переобучению. Рассмотрим три основных подхода: Bagging, Boosting и Stacking, и посмотрим, как их реализовать на Python.

Bagging

Bagging, или Bootstrap Aggregating, — это техника, основанная на создании множества моделей с использованием случайных подвыборок данных. Суть в том, чтобы объединить их предсказания, тем самым, снижая разброс и увеличивая общую точность.

Начнем с реализации Bagging с помощью RandomForest из библиотеки scikit-learn:

import pandas as pd from sklearn.datasets import load_iris from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score  # Загрузка данных data = load_iris() X = pd.DataFrame(data.data, columns=data.feature_names) y = pd.Series(data.target)  # Разделение данных на обучающую и тестовую выборки X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)  # Обучение модели model = RandomForestClassifier(n_estimators=100, random_state=42) model.fit(X_train, y_train)  # Предсказания y_pred = model.predict(X_test)  # Оценка точности accuracy = accuracy_score(y_test, y_pred) print(f'Test Accuracy: {accuracy:.2f}')

Здесь используем RandomForest, который создает множество деревьев решений на случайных подвыборках данных. Объединяя их результаты, можно получить более устойчивую модель.

Теперь посмотрим как можно реализовать Bagging с помощью BaggingClassifier:

from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier  # Создание базовой модели base_model = DecisionTreeClassifier()  # Обучение модели Bagging bagging_model = BaggingClassifier(base_estimator=base_model, n_estimators=100, random_state=42) bagging_model.fit(X_train, y_train)  # Предсказания y_pred_bagging = bagging_model.predict(X_test)  # Оценка точности accuracy_bagging = accuracy_score(y_test, y_pred_bagging) print(f'Bagging Test Accuracy: {accuracy_bagging:.2f}')

Создаем DecisionTreeClassifier как базовую модель и применяем BaggingClassifier для объединения результатов.

Boosting

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

Начнем с простейшего примера, реализуя AdaBoost:

from sklearn.ensemble import AdaBoostClassifier from sklearn.tree import DecisionTreeClassifier  # Создание базовой модели base_model_adaboost = DecisionTreeClassifier(max_depth=1)  # Обучение модели AdaBoost adaboost_model = AdaBoostClassifier(base_estimator=base_model_adaboost, n_estimators=100, random_state=42) adaboost_model.fit(X_train, y_train)  # Предсказания y_pred_adaboost = adaboost_model.predict(X_test)  # Оценка точности accuracy_adaboost = accuracy_score(y_test, y_pred_adaboost) print(f'AdaBoost Test Accuracy: {accuracy_adaboost:.2f}')

Используем DecisionTreeClassifier с глубиной 1 как базовую модель.

Теперь реализуем Gradient Boosting с помощью XGBoost:

import xgboost as xgb  # Преобразуем данные в формат DMatrix dtrain = xgb.DMatrix(X_train, label=y_train) dtest = xgb.DMatrix(X_test, label=y_test)  # Параметры модели params = {     'objective': 'multi:softmax',     'num_class': 3,     'max_depth': 3,     'eta': 0.1 }  # Обучение модели xgboost_model = xgb.train(params, dtrain, num_boost_round=100)  # Предсказания y_pred_xgboost = xgboost_model.predict(dtest)  # Оценка точности accuracy_xgboost = accuracy_score(y_test, y_pred_xgboost) print(f'XGBoost Test Accuracy: {accuracy_xgboost:.2f}')

Stacking

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

Реализуем стекинг с помощью StackingClassifier:

from sklearn.ensemble import StackingClassifier from sklearn.linear_model import LogisticRegression  # Определение базовых моделей base_models = [     ('rf', RandomForestClassifier(n_estimators=100, random_state=42)),     ('dt', DecisionTreeClassifier(max_depth=3)),     ('ab', AdaBoostClassifier(n_estimators=100)) ]  # Создание модели стекинга stacking_model = StackingClassifier(estimators=base_models, final_estimator=LogisticRegression()) stacking_model.fit(X_train, y_train)  # Предсказания y_pred_stacking = stacking_model.predict(X_test)  # Оценка точности accuracy_stacking = accuracy_score(y_test, y_pred_stacking) print(f'Stacking Test Accuracy: {accuracy_stacking:.2f}')

Таким образом можно комбинировать несколько моделей для получения более точных предсказаний. Используем LogisticRegression в качестве мета-модели.

Теперь посмотрим как можно реализовать стекинг для регрессии:

from sklearn.ensemble import StackingRegressor from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor  # Определение базовых регрессоров base_regressors = [     ('rf', RandomForestRegressor(n_estimators=100, random_state=42)),     ('lr', LinearRegression()) ]  # Создание модели стекинга stacking_regressor = StackingRegressor(estimators=base_regressors, final_estimator=LinearRegression()) stacking_regressor.fit(X_train, y_train)  # Предсказания y_pred_stacking_regressor = stacking_regressor.predict(X_test)  # Оценка точности accuracy_stacking_regressor = stacking_regressor.score(X_test, y_test) print(f'Stacking Regressor Test Score: {accuracy_stacking_regressor:.2f}')

Так стекинг может применяться не только для классификации, но и для регрессии. В этом случае мы комбинируем RandomForestRegressor и LinearRegression.


Больше актуальных навыков по аналитике и анализу вы можете получить в рамках практических онлайн-курсов от экспертов отрасли, а также, посетив открытые уроки:


ссылка на оригинал статьи https://habr.com/ru/articles/846892/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *