← Назад к вопросам
Как обнаружить переобучение?
1.8 Middle🔥 231 комментариев
#Машинное обучение#Метрики и оценка моделей
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как обнаружить переобучение?
Переобучение (overfitting) — одна из главных проблем в машинном обучении, когда модель слишком хорошо запоминает обучающий набор данных, но плохо обобщает на новые данные. Вот основные способы его обнаружить.
1. Анализ графиков обучения
Самый простой и эффективный способ — отслеживать метрики на тренировочном и валидационном наборах:
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 4))
# График функции потерь
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='Тренировочная потеря')
plt.plot(history.history['val_loss'], label='Валидационная потеря')
plt.xlabel('Эпоха')
plt.ylabel('Потеря')
plt.legend()
plt.title('Функция потерь')
# График точности
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='Тренировочная точность')
plt.plot(history.history['val_accuracy'], label='Валидационная точность')
plt.xlabel('Эпоха')
plt.ylabel('Точность')
plt.legend()
plt.title('Точность модели')
plt.tight_layout()
plt.show()
Признаки переобучения:
- Тренировочная потеря продолжает снижаться, валидационная начинает расти
- Разрыв между тренировочной и валидационной метриками увеличивается
2. Сравнение метрик на разных наборах
Вычислите метрики качества на тренировочном, валидационном и тестовом наборах:
from sklearn.metrics import accuracy_score, f1_score
def evaluate_model(model, X_train, y_train, X_val, y_val, X_test, y_test):
y_pred_train = model.predict(X_train)
y_pred_val = model.predict(X_val)
y_pred_test = model.predict(X_test)
train_acc = accuracy_score(y_train, y_pred_train)
val_acc = accuracy_score(y_val, y_pred_val)
test_acc = accuracy_score(y_test, y_pred_test)
print(f'Тренировка: {train_acc:.3f}')
print(f'Валидация: {val_acc:.3f}')
print(f'Тест: {test_acc:.3f}')
acc_gap = train_acc - val_acc
if acc_gap > 0.15:
print(f'Возможно переобучение! Разрыв: {acc_gap:.2%}')
return train_acc, val_acc, test_acc
3. Кривые валидации (Learning Curves)
Кривые обучения показывают, как улучшается производительность по мере увеличения размера набора данных:
from sklearn.model_selection import learning_curve
import numpy as np
train_sizes, train_scores, val_scores = learning_curve(
model, X, y,
cv=5,
scoring='accuracy',
train_sizes=np.linspace(0.1, 1.0, 10),
n_jobs=-1
)
Интерпретация:
- Если кривые валидации растут вместе с тренировочной — модель обучается правильно
- Если валидация выходит на плато, а тренировка продолжает расти — переобучение
4. Cross-validation
from sklearn.model_selection import cross_val_score
scores = cross_val_score(model, X, y, cv=5, scoring='accuracy')
print(f'Среднее: {scores.mean():.3f} (+/- {scores.std():.3f})')
if scores.std() > 0.05:
print('Высокая дисперсия — возможно переобучение')
Ключевые признаки переобучения
- Разрыв между тренировочной и валидационной метриками > 10-15%
- Тренировочная метрика продолжает расти, валидационная стабилизируется
- На тестовом наборе результаты значительно хуже
- Высокая дисперсия при кросс-валидации
Как избежать переобучения
- Регуляризация: L1/L2 штрафы, Dropout
- Ранняя остановка: мониторить валидационные метрики
- Больше данных: увеличение размера набора помогает
- Simplification модели: меньше параметров
- Увеличение noise: аугментация данных
Эти инструменты позволяют вовремя обнаружить и предотвратить переобучение на ранних этапах разработки модели.