Overfitting простыми словами

Проверь себя · 1/3разбор после ответа
Есть две таблицы с одинаковой схемой: events_web(user_id, event_name, created_at) и events_app(user_id, event_name, created_at). Нужно получить общий поток событий для дальнейшей агрегации. Что использовать?

Зачем это знать

Overfitting — главный враг ML-модели. Работаете с прогнозом оттока, кластеризацией клиентов, рекомендательной системой — если не учитываете overfitting, получите модель, которая идеально работает на train, но бесполезна в проде.

На собеседовании middle+ аналитика или data scientist вопрос про overfitting обязателен: «как распознать, как избежать, что такое bias-variance tradeoff». Без этих знаний за стол не сесть.

В статье:

  • Что такое overfitting на интуитивном уровне.
  • Как распознать (train vs test).
  • Главные причины.
  • Способы избежать (регуляризация, cross-validation, больше данных).
  • Связь с bias-variance tradeoff.

Короткое объяснение

Overfitting — модель слишком «запомнила» train-данные, включая шум, вместо того чтобы выявить реальные паттерны. На train — отличные метрики, на новых данных — провал.

Метафора: студент зазубрил ответы на конкретные вопросы из учебника, но не понял предмет. На стандартном тесте 100%. На новом вопросе — 0%.

Признаки

Train-test gap

  • Train accuracy: 98%
  • Test accuracy: 70%

Разрыв 28 п.п. — overfitting.

Если обе близки и высокие — нормально. Если обе низкие — underfitting.

Нестабильность

Модель даёт разные предсказания для почти одинаковых входов.

Слишком сложная структура

Decision tree с тысячей листьев на 1000 строк. Нейросеть с миллионами параметров на маленьких данных.

Причины

1. Мало данных + сложная модель

1000 строк, Random Forest с дефолтными параметрами. Слишком легко запомнить каждую точку.

2. Отсутствие регуляризации

L1, L2, dropout — инструменты для контроля сложности. Без них модель уходит в overfitting.

3. Data leakage

Информация о целевой переменной попадает в признаки. Предсказания идеальные на train и провал в проде.

4. Много признаков

Сотни фич на тысячу строк — overfitting гарантирован.

Как избежать

1. Больше данных

Самое надёжное. Больше данных → модели сложнее overfit.

2. Cross-validation

K-Fold CV: разбиваем train на K частей, обучаемся на K-1, валидируемся на 1. Повторяем K раз. Усреднённая ошибка — честная оценка.

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

  • L1 (Lasso): штраф за большие веса, обнуляет ненужные признаки.
  • L2 (Ridge): штраф за большие веса, не обнуляет.

Гиперпараметр alpha / lambda подбирается через CV.

4. Ограничение сложности модели

  • Decision tree: max_depth, min_samples_leaf.
  • Нейросеть: меньше слоёв.
  • XGBoost: max_depth, min_child_weight.

5. Early stopping

В gradient boosting и нейросетях останавливаем обучение, когда ошибка на валидации начинает расти.

6. Dropout (для нейросетей)

Случайно «выключаем» часть нейронов при обучении. Модель не полагается на конкретные веса.

7. Feature selection

Убираем ненужные признаки. Меньше фич — меньше шума.

8. Ансамблевые методы

Random Forest, Gradient Boosting — усредняют много моделей, что работает как регуляризация.

Готовься к собесу аналитика как в Duolingo
10 минут в день — SQL, Python, A/B, метрики. 1700+ вопросов в Telegram
Открыть Карьерник в Telegram

Bias-variance tradeoff

Overfitting = высокий variance. Underfitting = высокий bias.

Total error = Bias² + Variance + Irreducible noise

Нужно балансировать. Слишком простая модель — bias. Слишком сложная — variance. Золото в середине.

Пример в Python

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# overfit версия
model_overfit = RandomForestClassifier(n_estimators=1000, max_depth=None)
model_overfit.fit(X_train, y_train)

print('Train:', accuracy_score(y_train, model_overfit.predict(X_train)))  # 0.99
print('Test:',  accuracy_score(y_test, model_overfit.predict(X_test)))   # 0.72

# регуляризованная
model_reg = RandomForestClassifier(n_estimators=100, max_depth=5, min_samples_leaf=10)
model_reg.fit(X_train, y_train)

print('Train:', accuracy_score(y_train, model_reg.predict(X_train)))  # 0.87
print('Test:',  accuracy_score(y_test, model_reg.predict(X_test)))   # 0.84

Во второй модели gap меньше — меньше overfitting.

На собесе

«Что такое overfitting?» Модель запомнила train, но не обобщает на новые данные.

«Как обнаружить?» Train-test gap. Большой разрыв accuracy.

«Как избежать?» Больше данных, регуляризация, CV, ограничение complexity.

«Random Forest vs Logistic Regression — какая чаще overfit?» RF, если не ограничить. LR проще, меньше риск.

Частые ошибки

1. Не делать train-test split

Обучали и тестировали на одном — 100% accuracy. Ложная уверенность.

2. Подбор гиперпараметров на test

Подбирали параметры на test — переобучились на test. Нужен отдельный validation set.

3. Data leakage

Например, нормализовать X на всём датасете (включая test) — утечка. Нормализация только на train.

4. Сравнивать только accuracy

AUC, precision, recall, F1 — разные аспекты качества. Смотрите несколько метрик.

Связанные темы

FAQ

Underfitting vs overfitting?

Underfit — обе метрики низкие. Overfit — train высокая, test низкая.

Overfitting только в ML?

Не только. В любой модели (регрессия, эконометрика) — риск.

Как узнать точный cutoff?

Learning curves (ошибка vs размер обучения). Validation curves (ошибка vs гиперпараметр).

Dropout помогает везде?

В нейросетях — да. В классическом ML не применяется.