Ответ
В моём последнем проекте по прогнозированию оттока клиентов (бинарная классификация) выбор модели проходил в несколько этапов.
Контекст: Данные — табличные, около 100k строк и 50 признаков (микс числовых и категориальных). Требовалась умеренная интерпретируемость.
Процесс выбора:
- Бейзлайн: Начал с LogisticRegression и DecisionTreeClassifier, чтобы понять сложность задачи. F1-score был около 0.65.
- Ансамбли: Перешёл к RandomForestClassifier и GradientBoostingClassifier (XGBoost). Они показали значительный прирост (F1 ~ 0.82). Gradient Boosting был немного лучше.
- Сравнение и тонкая настройка: Сравнил несколько бустинговых фреймворков, используя кросс-валидацию по стратегированной разбивке (по времени).
import xgboost as xgb
from lightgbm import LGBMClassifier
from sklearn.metrics import classification_report
# После предобработки и feature engineering
models_to_tune = {
'XGBoost': xgb.XGBClassifier(objective='binary:logistic', n_estimators=200),
'LightGBM': LGBMClassifier(n_estimators=200, verbose=-1)
}
for name, model in models_to_tune.items():
model.fit(X_train, y_train,
eval_set=[(X_val, y_val)],
early_stopping_rounds=20,
verbose=False)
y_pred = model.predict(X_val)
print(f'n--- {name} ---')
print(classification_report(y_val, y_pred))
- Критерии выбора:
- Метрика: Основной была F1-score (важен баланс precision/recall).
- Скорость: LightGBM обучался и предсказывал в ~1.5 раза быстрее XGBoost на наших данных.
- Интерпретируемость: Использовал SHAP для объяснения предсказаний LightGBM, что удовлетворило бизнес-требования.
Итог: Выбрал LightGBM из-за лучшего баланса скорости, точности и возможности интерпретации. После GridSearch для гиперпараметров модель вышла в A/B-тест.