Привет, Хабр!
Сегодня мы рассмотрим 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
.
Больше актуальных навыков по аналитике и анализу вы можете получить в рамках практических онлайн-курсов от экспертов отрасли, а также, посетив открытые уроки:
-
15 октября: «Прецеденты, варианты использования и Use case». Узнать подробнее
-
17 октября: «Подготовка к техническому собеседованию на позицию аналитика». Узнать подробнее
ссылка на оригинал статьи https://habr.com/ru/articles/846892/
Добавить комментарий