🔴 Сложный ⏱️ 25 минут

Кросс-валидация: как честно оценить модель

Кросс-валидация: как честно оценить модель

🎯 Зачем это нужно?

Представь: ты готовишься к ЕГЭ, решаешь пробники и получаешь 95 баллов 🎉. Приходишь на реальный экзамен - а там 60 баллов… Знакомо? Так происходит, когда модель “зубрит” тренировочные данные, но плохо работает на новых.

Реальные примеры: 📱 Netflix тестирует рекомендации на разных группах пользователей 🏥 Медицинская диагностика - AI должен работать на пациентах из разных больниц
🚗 Беспилотники тренируют на дорогах Калифорнии, но тестируют в снегах Канады

📚 История вопроса

В 1930-х статистик Рональд Фишер заметил: “Если тестируешь гипотезу на тех же данных, на которых её придумал - обманываешь себя!” 🤔

Современную кросс-валидацию придумали в 1960-х для экономических моделей. А в ML она стала стандартом после работ 1980-х годов.

Интересный факт: ImageNet (база картинок для AI) специально разделили так, чтобы модели не могли “подсмотреть” ответы!

💡 Интуиция

Плохой подход: Студент учит математику по 100 задачам, а потом решает эти же 100 задач на экзамене. Результат: 100% правильных ответов! Но это обман - он не понял математику, а просто запомнил.

Хороший подход: Разделяем 100 задач на группы:

  • 📘 Обучение (60 задач): изучаем методы решения
  • 📗 Валидация (20 задач): проверяем, понимаем ли мы
  • 📕 Тест (20 задач): финальная честная проверка

Но что если в валидационной выборке случайно попались лёгкие задачи? Кросс-валидация решает эту проблему!

[МЕДИА: image_01] Описание: Схема разделения данных на train/validation/test с примером экзамена Промпт: “educational illustration showing data split for machine learning, three colored sections representing train/validation/test sets, student exam analogy, modern clean style, blue and orange colors”

📐 Формальное определение

K-fold кросс-валидация:

  1. Разделяем данные на K равных частей (обычно K=5 или K=10)
  2. K раз обучаем модель: каждый раз одну часть оставляем для валидации, остальные K-1 для обучения
  3. Усредняем результаты K экспериментов

Формула качества: CV_score = (1/K) × Σᵢ₌₁ᴷ score_i

где score_i - качество модели на i-й валидационной части.

Виды кросс-валидации:

  • Leave-One-Out (LOO): K = n (размер выборки) - для малых данных
  • Stratified K-fold: сохраняет пропорции классов в каждой части
  • Time Series Split: для временных рядов (нельзя заглядывать в будущее!)

🔍 Примеры с разбором

Пример 1: Классификация спама (5-fold CV)

Данные: 1000 писем (500 спам + 500 не спам)

Разбиение на 5 частей по 200 писем каждая:

Fold 1: [письма 1-200]   ← валидация, остальное - обучение
Fold 2: [письма 201-400] ← валидация, остальное - обучение  
Fold 3: [письма 401-600] ← валидация, остальное - обучение
Fold 4: [письма 601-800] ← валидация, остальное - обучение
Fold 5: [письма 801-1000] ← валидация, остальное - обучение

Результаты:

  • Fold 1: accuracy = 0.85
  • Fold 2: accuracy = 0.90
  • Fold 3: accuracy = 0.87
  • Fold 4: accuracy = 0.83
  • Fold 5: accuracy = 0.89

Финальная оценка: CV_score = (0.85 + 0.90 + 0.87 + 0.83 + 0.89) / 5 = 0.868

Бонус: Стандартное отклонение = 0.025 показывает стабильность модели!

[МЕДИА: image_02] Описание: Визуализация 5-fold кросс-валидации с результатами по каждому fold Промпт: “5-fold cross-validation diagram, dataset split into 5 colored sections, rotation showing each fold as validation, accuracy scores for each fold, bar chart of results, educational style”

Пример 2: Предсказание цен на жильё

Задача: Предсказать стоимость квартиры по площади, району, этажу…

Проблема: Просто разделить данные случайно нельзя! Цены в Москве и Владивостоке сильно отличаются.

Решение: Stratified CV по регионам

  • В каждом fold сохраняем пропорцию квартир из разных городов
  • Так модель учится на разнообразных данных

Результат:

  • Обычный CV: RMSE = 500,000₽ (переоценка качества!)
  • Stratified CV: RMSE = 750,000₽ (честная оценка)

🎮 Практика

Базовый уровень 🟢

Задание 1: У тебя есть датасет из 200 отзывов о фильмах (100 положительных, 100 отрицательных). Как правильно разделить их для 4-fold CV?

Задание 2: Модель получила accuracy [0.82, 0.85, 0.79, 0.88, 0.84] на 5-fold CV. Вычисли среднее качество и стандартное отклонение.

Задание 3: Почему нельзя использовать обычный K-fold для временных рядов? Приведи пример.

Задание 4: В каких случаях лучше использовать большое K (например, 10), а в каких - маленькое (например, 3)?

Продвинутый уровень 🟡

Задание 5: Ты обучаешь модель для медицинской диагностики. Данные собраны в 10 больницах, но в разных количествах. Какой вид CV выберешь и почему?

Задание 6: Модель A показывает CV_score = 0.85±0.02, модель B - CV_score = 0.83±0.08. Какую выберешь для production?

Задание 7: При 10-fold CV получили результаты: [0.90, 0.85, 0.92, 0.45, 0.88, 0.91, 0.87, 0.89, 0.86, 0.90]. Что не так с данными?

Задание 8: Как можно “сломать” кросс-валидацию и получить завышенные результаты? Приведи 2 способа.

Челлендж 🔴

Задание 9: Придумай стратегию валидации для модели, которая должна работать в разных странах, но у тебя есть данные только из России и США.

Задание 10: У тебя есть 1000 временных рядов продаж (по дням за 2 года). Как организовать честную валидацию для прогноза на следующий месяц?

Задание 11: Модель для рекомендаций музыки. В данных есть пользователи 13-65 лет, но 80% - это люди 18-25 лет. Как учесть это в валидации?

⚠️ Частые ошибки

Ошибка: Делать feature engineering на полном датасете, потом CV ✅ Правильно: Feature engineering отдельно внутри каждого fold 💡 Почему: Иначе информация из валидационной выборки “просочится” в обучение

Ошибка: Использовать обычный K-fold для временных рядов ✅ Правильно: TimeSeriesSplit - обучение только на прошлом 💡 Почему: В реальности мы не знаем будущее!

Ошибка: Выбирать лучшие гиперпараметры по CV, потом на этих же fold’ах оценивать качество ✅ Правильно: Nested CV или отдельная test выборка 💡 Почему: Иначе оценка качества завышена - мы “подгляделись”

Ошибка: Игнорировать большую дисперсию результатов CV ✅ Правильно: Анализировать стандартное отклонение и outlier fold’ы 💡 Почему: Нестабильная модель = проблемы в production

Ошибка: Использовать маленькое K для небольших данных ✅ Правильно: При малых данных использовать LOOCV или большое K 💡 Почему: Иначе мало данных для обучения в каждом fold’е

🎓 Главное запомнить

Суть: CV даёт честную оценку качества модели на “невиданных” данных ✅ Формула: CV_score = (1/K) × Σᵢ₌₁ᴷ score_i
Применение: Выбор моделей, настройка гиперпараметров, оценка качества

🔗 Связь с другими темами

Откуда пришли: Урок 305 (Train/Validation/Test split) - базовое разделение данных Куда ведём: Следующие уроки - Grid Search (поиск гиперпараметров), ансамбли моделей Связано с: Метрики качества, переобучение, статистические тесты

Понял тему? Закрепи в боте! 🚀

Попрактикуйся на задачах и получи персональные рекомендации от AI

💪 Начать тренировку
💬 Есть вопрос? Спроси бота!