Как выбирается модель для проекта машинного обучения?

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

Ответ

Выбор модели — это итеративный процесс, основанный на задаче, данных и ограничениях проекта. Я начинаю с простого бейзлайна и двигаюсь к более сложным вариантам.

Ключевые критерии:

  1. Тип задачи: Классификация, регрессия, кластеризация, ранжирование. Например, для бинарной классификации логистическая регрессия — хорошая отправная точка.
  2. Объём и структура данных: Для небольших табличных данных эффективны линейные модели и ансамбли деревьев (Random Forest, Gradient Boosting). Для больших данных или неструктурированных данных (изображения, текст) рассматриваю нейронные сети.
  3. Требования к интерпретируемости: Если бизнесу нужны объяснимые предсказания, выбираю линейные модели, неглубокие деревья или SHAP/LIME для ансамблей.
  4. Ограничения продакшена: Скорость инференса, потребление памяти, возможность развертывания на edge-устройствах. LightGBM часто быстрее XGBoost для инференса.

Мой типичный рабочий процесс:

from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score
import pandas as pd

# Загружаем данные
# X_train, y_train = ...

models = {
    'Logistic Regression': LogisticRegression(max_iter=1000),
    'Random Forest': RandomForestClassifier(n_estimators=100),
    'Gradient Boosting': GradientBoostingClassifier(n_estimators=100)
}

results = {}
for name, model in models.items():
    # Использую кросс-валидацию для оценки
    cv_score = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc').mean()
    results[name] = cv_score
    print(f'{name}: AUC-ROC = {cv_score:.3f}')

# Выбираю модель с лучшим балансом метрики и сложности
best_model_name = max(results, key=results.get)
print(f'nДля дальнейшей тонкой настройки выбрана: {best_model_name}')

Окончательное решение принимаю после сравнения на hold-out тестовой выборке и, если возможно, A/B-теста в продакшене.