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

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

Ответ

Основной инструмент борьбы с переобучением в линейных моделях — регуляризация, которая штрафует модель за слишком большие веса.

1. Ridge-регрессия (L2-регуляризация): Добавляет к функции потерь штраф, пропорциональный сумме квадратов весов. Сжимает коэффициенты, но не обнуляет.

from sklearn.linear_model import Ridge
ridge = Ridge(alpha=1.0)  # alpha — сила регуляризации
ridge.fit(X_train, y_train)
# Коэффициенты становятся меньше, но не нулевые

2. Lasso-регрессия (L1-регуляризация): Добавляет штраф, пропорциональный сумме модулей весов. Обнуляет коэффициенты у наименее важных признаков, выполняя отбор признаков.

from sklearn.linear_model import Lasso
lasso = Lasso(alpha=0.01, max_iter=10000)
lasso.fit(X_train, y_train)
# Многие коэффициенты будут равны 0

3. ElasticNet: Комбинация L1 и L2 регуляризации. Параметр l1_ratio контролирует их соотношение.

4. Робастная регрессия: Для защиты от выбросов (крайнего шума) используют модели, менее чувствительные к ним, например, HuberRegressor или RANSAC.

from sklearn.linear_model import HuberRegressor
huber = HuberRegressor(epsilon=1.35)  # epsilon определяет, что считать выбросом
huber.fit(X_train, y_train)

5. Предобработка данных: Всегда необходима: масштабирование признаков (StandardScaler) для корректной работы регуляризации и обработка выбросов.