Условие
Train ROC AUC = 0.95, validation = 0.74. Это что и что с этим делать?
Решение
Подход
Большой gap train vs val — overfitting. Underfitting — наоборот, оба низкие. Используем диагностические инструменты:
- Learning curves: train/val score vs train size.
- Overfit: train высокая, val низкая, gap не схлопывается.
- Underfit: обе низкие и плоские.
- Validation curve: метрика vs гиперпараметр.
- Bias-variance decomposition.
Реализация
from sklearn.model_selection import learning_curve
import numpy as np
import matplotlib.pyplot as plt
def diagnose(model, X, y, cv=5):
sizes, train_sc, val_sc = learning_curve(
model, X, y, cv=cv, scoring='roc_auc',
train_sizes=np.linspace(0.1, 1.0, 10), n_jobs=-1
)
train_m = train_sc.mean(axis=1)
val_m = val_sc.mean(axis=1)
plt.plot(sizes, train_m, label='train')
plt.plot(sizes, val_m, label='val')
gap = train_m[-1] - val_m[-1]
if gap > 0.05 and train_m[-1] > 0.8:
return 'overfitting'
if train_m[-1] < 0.7 and val_m[-1] < 0.7:
return 'underfitting'
return 'ok'Лечение overfitting
- Больше данных (если возможно).
- Регуляризация: L1/L2, max_depth, min_samples_leaf, dropout.
- Уменьшение модели: меньше параметров, меньше деревьев.
- Early stopping по val.
- Data augmentation (CV/NLP).
- Feature selection / PCA / удаление leakage-фичей.
Лечение underfitting
- Больше фичей, feature engineering.
- Менее регуляризация, глубже модель.
- Сменить семейство моделей (linear → tree → boosting).
- Проверить, нет ли scaling-проблем.
Подводные камни
- Train AUC 0.95 vs val 0.74 — может быть leakage, а не «честный» overfit. Проверьте, что split правильный (по user/time).
- Маленький val (n<500) даёт большой шум в оценке — gap может быть случайным.
- Imbalanced classes: AUC может быть высоким и при overfit, и при random для маловероятного класса.
- «Регуляризация мощнее» — типичный совет, но без cross-val выбор λ — это p-hacking на validation.
Эталонный ответ
Train≫val → overfitting. Диагностика — learning curve (gap не схлопывается), validation curve (метрика vs гиперпараметр). Лечение: регуляризация, ранний стоп, больше данных, меньшая capacity. До регуляризации — проверить leakage в split.