Какие модели классификации или регрессии вы использовали в реальных проектах?

«Какие модели классификации или регрессии вы использовали в реальных проектах?» — вопрос из категории Классическое ML, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В зависимости от задачи, данных и требований к интерпретируемости я применял широкий спектр моделей:

Для задач классификации:

  • Логистическая регрессия: Мой выбор для базового решения, пилотных проектов или когда критически важна интерпретируемость коэффициентов. Использую с L1/L2 регуляризацией.
  • Случайный лес (Random Forest): Отлично работает «из коробки» на табличных данных со смешанными типами признаков, устойчив к выбросам и переобучению. Часто использую для получения baseline и анализа важности признаков (feature_importances_).
  • Градиентный бустинг (XGBoost, LightGBM, CatBoost): Это мои основные инструменты для соревнований и production-задач, где важна максимальная точность. LightGBM — для скорости на больших данных, CatBoost — для работы с категориальными признаками без предобработки.

Для задач регрессии:

  • Линейная регрессия / Ridge / Lasso: Основные модели, когда ожидается линейная зависимость или нужен простой, интерпретируемый прогноз. Lasso полезен для отбора признаков.
  • Градиентный бустинг для регрессии: Аналогично классификации, XGBoost Regressor часто показывает наилучшие результаты на нетривиальных зависимостях.

Пример пайплайна сравнения моделей для классификации:

from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from xgboost import XGBClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

models = {
    "Logistic Regression": LogisticRegression(max_iter=1000, C=0.1),
    "Random Forest": RandomForestClassifier(n_estimators=100, random_state=42),
    "XGBoost": XGBClassifier(n_estimators=100, use_label_encoder=False, eval_metric='logloss')
}

for name, model in models.items():
    scores = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc')
    print(f"{name}: Средний ROC-AUC = {np.mean(scores):.4f} (+/- {np.std(scores):.4f})")

Выбор всегда обосновывается через кросс-валидацию и метрики бизнес-задачи (AUC-ROC, F1, MAE).