Как улучшить стабильность ML-модели?

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

Ответ

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

1. Работа с данными и признаками:

  • Удаление мультиколлинеарности: Использовал VIF (Variance Inflation Factor) для отсева сильно коррелирующих признаков, что стабилизировало коэффициенты в линейных моделях.
  • Обработка выбросов: Применял RobustScaler или методы на основе межквартильного размаха (IQR), чтобы шумные точки меньше влияли на обучение.

2. Регуляризация:

  • Для линейных моделей всегда добавлял L2-регуляризацию (Ridge) или L1 (Lasso) для штрафа за большие веса, что снижает дисперсию.
    from sklearn.linear_model import RidgeCV
    # Ridge с кросс-валидацией для подбора alpha
    stable_model = RidgeCV(alphas=[0.1, 1.0, 10.0])
    stable_model.fit(X_train, y_train)

3. Использование ансамблевых методов:

  • Бэггинг: RandomForest — моя первая линия защиты для повышения стабильности. Он агрегирует множество деревьев, обученных на бутстрап-выборках, значительно снижая дисперсию по сравнению с одним деревом.

4. Надежная валидация:

  • Вместо простого раздела на train/test использовал RepeatedStratifiedKFold для получения более надежной оценки дисперсии метрик модели.

5. Контроль сложности модели:

  • В градиентном бустинге (XGBoost, LightGBM) активно использовал параметры max_depth, min_child_weight и subsample, а также раннюю остановку (early stopping) на валидационной выборке, чтобы предотвратить переобучение.