Ответ
Переобучение (overfitting) — это ситуация, когда модель машинного обучения чрезмерно подстраивается под обучающую выборку, включая её шум и случайные флуктуации, и теряет способность обобщать знания на новые, ранее не виденные данные.
Как я диагностирую переобучение:
- График обучения: Строю кривые обучения (learning curves), которые показывают метрики (например, accuracy или loss) на обучающей и валидационной выборках в зависимости от количества эпох или сложности модели.
- Большой разрыв в метриках: Высокая точность на трейне (например, 99%) и значительно более низкая на валидации/тесте (например, 70%) — классический признак.
Методы борьбы, которые я применяю на практике:
- Регуляризация:
from sklearn.linear_model import Ridge # L2-регуляризация в линейной модели model = Ridge(alpha=1.0) # alpha — сила регуляризации - Упрощение модели: Уменьшение глубины дерева, количества нейронов/слоев.
- Аугментация данных (для CV/NLP): Искусственное увеличение обучающей выборки.
- Dropout (для нейросетей): Случайное "выключение" нейронов во время обучения.
- Ансамблирование: Использование методов вроде бэггинга (Random Forest), которые по своей природе менее склонны к переобучению.
Пример с деревом решений:
from sklearn.tree import DecisionTreeClassifier
# Модель, склонная к переобучению (неограниченная сложность)
overfit_tree = DecisionTreeClassifier()
# Модель с контролем сложности (менее склонна к переобучению)
generalizable_tree = DecisionTreeClassifier(
max_depth=5,
min_samples_leaf=10,
max_features='sqrt'
)
Главная цель — найти баланс между смещением (bias) и дисперсией (variance) модели.