TATECHATLAS
◎ Русский
Математика и модели

Переобучение и обучающие кривые: как разобрать разрыв без утечки данных

Сравнивайте обучение и валидацию, помещайте предобработку в pipeline и не используйте итоговый тест для выбора параметров.

В этом материале

Если модель намного лучше работает на обучающих данных, чем на новых проверочных примерах, возможно переобучение. Разрыв является диагностическим признаком, а не готовым объяснением: важны способ разделения, изменение распределения, утечка и размер выборки. Начните с разделения, отражающего будущую работу модели, поместите обучаемую предобработку в pipeline и сравните простой базовый вариант. Обучающие кривые покажут изменение оценок при увеличении обучающей выборки. Сложность выбирайте на данных разработки, а независимый итоговый тест оставьте для финальной оценки, вместо постоянного подбора параметров по нему.

Отделите переобучение от других причин

Для метрики, где больше означает лучше, например accuracy, высокая оценка на обучении и заметно более низкая на валидации указывают на проблему обобщения. Если обе оценки низкие, причины могут быть в модели или признаках. Не объявляйте переобучение по одному числу или удачному разделению. Проверьте размер выборки, разметку и соответствие проверочных примеров будущей работе. Изменившаяся аудитория данных требует другого разбора, чем запоминание деталей внутри сопоставимых выборок.

Выберите разделение под будущую задачу

Определите, что означает будущий прогноз: новые независимые примеры, новые клиенты или более поздние наблюдения. Случайное разделение подходит не всегда. Повторные измерения одного объекта могут потребовать группировки, а прогноз будущего - временного разделения. Стратификация сохраняет пропорции классов, но не устраняет зависимость между объектами или утечку по времени. Учебный код использует стратифицированные блоки на синтетической классификации. Для реальных данных сначала проверьте, соответствуют ли предположения этого способа вашему сценарию применения.

Обучайте предобработку внутри pipeline

Разделяйте данные до обучения любого преобразования, которое извлекает из них параметры. Масштабирование, заполнение пропусков и отбор признаков могут передать информацию из валидации, если обучены на всей выборке. Pipeline позволяет внутри перекрёстной проверки обучать scaler на обучающей части и применять его к проверочной. Но он не исправляет признаки, которые сами раскрывают ответ или недоступны в момент прогноза. Поэтому проверяйте смысл и время появления каждого признака так же внимательно, как настройки модели.

Читайте две обучающие кривые вместе

Обучающая кривая вычисляет оценки обучения и валидации для нескольких размеров обучающей части. Читайте обе линии, а не только лучшую точку. Устойчивый большой разрыв может указывать на высокую вариативность, а близкие низкие оценки - на недостаточные признаки или возможности модели. Дополнительные данные иногда помогают, но кривая не обещает конкретный прирост. В примере строки массивов оценок соответствуют размерам обучения, столбцы - блокам валидации. Средние значения кратко описывают результаты этих блоков.

import numpy as np
from sklearn.datasets import make_classification
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, learning_curve
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

# Illustrative synthetic classification data.
X, y = make_classification(
    n_samples=500, n_features=20,
    n_informative=5, n_redundant=5, random_state=42
)
model = make_pipeline(
    StandardScaler(), LogisticRegression(max_iter=1000)
)
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
sizes, training_scores, validation_scores = learning_curve(
    model, X, y, cv=cv,
    train_sizes=np.linspace(0.2, 1.0, 5), scoring="accuracy"
)
print(sizes)
print(training_scores.mean(axis=1))
print(validation_scores.mean(axis=1))

Сравните базовый вариант и метрику

До обсуждения красивой оценки сравните подходящий простой базовый вариант. При дисбалансе классов высокая accuracy может отражать угадывание частого класса вместо полезного обнаружения редкого. Выбирайте метрику по решению, которое поддерживает модель, и помните направление улучшения. В учебном коде accuracy нужна для демонстрации API на синтетических данных. Полученный вывод не доказывает, что она подходит для любой реальной задачи классификации. Требования к ошибкам разных типов надо определить отдельно от удобства построения графика.

Меняйте сложность и регуляризацию осознанно

Проверяйте небольшой заранее выбранный набор изменений сложности или регуляризации по одному протоколу разработки. Для LogisticRegression уменьшение C усиливает регуляризацию, а max_iter задаёт предел итераций оптимизации, не её силу. Также важны масштаб признаков и сходимость. Меняйте один содержательный фактор за раз и сравнивайте валидацию, а не стремитесь улучшить только обучение. Более простая модель иногда лучше обобщает, но такой вывод должен опираться на представительные проверочные данные, а не на ожидание красивой формы кривой.

Смотрите разброс между блоками валидации

Смотрите отдельные оценки блоков вместе со средним значением. Большой разброс может означать чувствительность результата к выбранным примерам или разную сложность частей данных. Стандартное отклонение этих оценок описывает разброс, но автоматически не становится доверительным интервалом. Обучающие части перекрёстной проверки пересекаются, поэтому результаты не являются независимыми повторениями эксперимента. Используйте вариативность как повод проверить протокол, размер выборки и группы, а не как готовое доказательство точной границы ошибки для всей будущей совокупности.

Оставьте итоговую оценку вне подбора

Зафиксируйте выбранные признаки и параметры перед итоговой оценкой на отложенных данных. Если постоянно смотреть тест при выборе настроек, он становится частью подбора и теряет независимость. Запишите версию данных, определения признаков, правила разделения, random state, метрику и версии программ. Код создаёт синтетическую выборку и выводит рассчитанные сводки, но здесь не заявлена конкретная оценка или измерение производительности. Воспроизводимый процесс помогает понять, улучшилась ли модель или просто изменился способ её проверки.

Что проверить

  • Выбирайте валидацию под будущие примеры, группы и временные периоды.
  • Обучайте предобработку только на обучающих частях, желательно внутри pipeline.
  • Читайте обучение и валидацию вместе с базовой оценкой и разбросом блоков.
  • Подбирайте параметры на данных разработки, сохраняя итоговый тест независимым.

Кривые зависят от качества данных, разделения, модели и метрики. Они подсказывают возможные причины, но не доказывают, что увеличение выборки или регуляризации решит задачу. Синтетический пример является учебным и не запускался как измерительный тест.

Источники

  1. scikit-learn: learning and validation curves ↗
  2. scikit-learn: learning_curve API ↗
  3. scikit-learn: data leakage and pipelines ↗
  4. scikit-learn: cross-validation ↗
  5. scikit-learn: LogisticRegression ↗
Наверх ↑