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

Сегодня мы рассмотрим 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.


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

Комментарии (1)


  1. OlegZH
    04.10.2024 18:57

    И что? Набросали множество строчек разного кода. А что получилось на выходе? Приглашение на курс? Было бы понятнее, если бы был приведён развёрнутый пример отдельного занятия или такое же развёрнутое описание целого курса.