Привет, Хабр!
Сегодня мы рассмотрим 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 октября: «Подготовка к техническому собеседованию на позицию аналитика». Узнать подробнее