Кросс-валидация — это метод оценки обобщающей способности модели машинного обучения, при котором исходные данные многократно разделяются на обучающую и тестовую подвыборки. В отличие от простого разделения на train/test, кросс-валидация использует все доступные данные для обучения и тестирования, что даёт более надёжную оценку качества.
Как это работает
Наиболее распространённый вариант — k-fold кросс-валидация. Данные случайно разбиваются на k равных частей (фолдов). Затем модель обучается k раз: на каждом шаге одна часть используется как тестовая, а остальные k-1 — как обучающие. После всех итераций ошибки усредняются.
Например, при k=5 данные делятся на 5 частей. Модель обучается 5 раз, каждый раз тестируясь на одной из частей. Итоговая метрика — среднее по всем фолдам. Это позволяет снизить дисперсию оценки и избежать зависимости от одного случайного разбиения.
Зачем это нужно
Кросс-валидация даёт более точную оценку того, как модель будет работать на новых данных. Она особенно полезна при ограниченном объёме данных, когда жалко выделять большую тестовую выборку. Также кросс-валидация применяется для выбора гиперпараметров и сравнения разных моделей.
Примеры
- Выбор гиперпараметров: при подборе глубины дерева решений или количества нейронов в слое кросс-валидация позволяет выбрать значение, которое даёт наилучшее среднее качество на всех фолдах.
- Сравнение моделей: чтобы выбрать между логистической регрессией и градиентным бустингом, можно сравнить их средние ошибки, полученные с помощью 10-кратной кросс-валидации.
- Оценка на малых данных: в медицинских исследованиях, где выборка пациентов мала, кросс-валидация позволяет эффективно использовать каждый пример.
- Leave-one-out (LOO): частный случай, когда k равно числу наблюдений. Модель обучается на всех данных, кроме одного объекта, который используется для теста. Применяется для очень маленьких выборок.
Формула или метрика
Средняя ошибка кросс-валидации вычисляется как:
CV = (1/k) * Σ_{i=1}^{k} L(y_i, f_{-i}(x_i))
где L — функция потерь, f_{-i} — модель, обученная без i-го фолда, y_i — истинные ответы на i-м фолде, x_i — признаки i-го фолда.
Типичные ошибки
- Игнорирование временной структуры: для временных рядов нельзя случайно перемешивать данные, иначе модель будет использовать будущее для предсказания прошлого. Нужна специальная кросс-валидация с расширяющимся окном.
- Утечка данных: если при разбиении не учитывать группы (например, один пациент может попасть и в train, и в test), оценка будет завышена. Требуется GroupKFold.
- Слишком маленькое k: при k=2 оценка становится нестабильной, так как каждый фолд содержит половину данных. Обычно выбирают k=5 или 10.
- Применение после отбора признаков: если отбор признаков проводился на всех данных до кросс-валидации, это приводит к утечке и переоптимистичной оценке.
Как улучшить
- Используйте стратификацию для несбалансированных классов (StratifiedKFold), чтобы сохранить пропорции классов в каждом фолде.
- Для временных рядов применяйте TimeSeriesSplit, чтобы избежать утечки из будущего.
- Повторяйте кросс-валидацию с разными случайными разбиениями (RepeatedKFold) для снижения дисперсии оценки.
- При большом дисбалансе классов комбинируйте кросс-валидацию с методами ресемплинга внутри каждого фолда.
- Всегда выделяйте отдельную тестовую выборку для финальной оценки, если данных достаточно.