← Назад к вопросам

Как обнаружить переобучение?

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: аугментация данных

Эти инструменты позволяют вовремя обнаружить и предотвратить переобучение на ранних этапах разработки модели.

Как обнаружить переобучение? | PrepBro