Какие бывают схемы кросс-валидации
Кросс-валидация (cross-validation, CV) — это метод оценки обобщающей способности модели машинного обучения на независимых данных. Она заключается в многократном разделении исходного набора данных на обучающую и тестовую выборки с последующим усреднением результатов. Кросс-валидация позволяет более надёжно оценить производительность модели и уменьшить риск переобучения.
Существует множество схем кросс-валидации, каждая из которых подходит под разные типы задач, объёмы данных, наличие классового дисбаланса, временную зависимость данных и другие аспекты.
🔹 1. K-Fold Cross-Validation
Это самая базовая и часто используемая схема:
-
Данные делятся на k равных (или почти равных) частей (фолдов).
-
Модель обучается на k−1 фолдах и тестируется на оставшемся.
-
Процесс повторяется k раз, каждый раз с новым тестовым фолдом.
-
Окончательная метрика — среднее значение по всем k итерациям.
Пример:
-
K=5:
-
5 фолдов: F1, F2, F3, F4, F5.
-
Итерация 1: train на F2–F5, test на F1.
-
Итерация 2: train на F1, F3–F5, test на F2.
-
и так далее.
-
Преимущества:
-
Более стабильная оценка, чем hold-out.
-
Хорошо работает при умеренном количестве данных.
Недостатки:
- Модель обучается k раз → выше вычислительная нагрузка.
🔹 2. Stratified K-Fold
Модификация обычного K-Fold для задач классификации, особенно с дисбалансом классов.
-
При делении сохраняется пропорция классов в каждом фолде.
-
Поддерживается примерно одинаковое распределение целевой переменной.
Используется по умолчанию в sklearn для классификации.
🔹 3. Leave-One-Out (LOO, LOO-CV)
-
Частный случай K-Fold с k = n, где n — количество объектов.
-
Модель обучается n раз, каждый раз исключая один объект как тестовый.
Преимущества:
- Очень точная оценка на малых выборках.
Недостатки:
-
Крайне затратный по времени: n тренировок.
-
Высокая дисперсия оценки — каждый фолд очень мал.
🔹 4. Leave-P-Out (LPO)
-
Обобщение LOO: исключаются p объектов для теста, остальные для обучения.
-
Всего возможно C(n, p) комбинаций.
На практике почти не используется при p > 1, если n велико, из-за комбинаторного роста числа вариантов.
🔹 5. Repeated K-Fold
-
K-Fold выполняется несколько раз, каждый раз с новой случайной разбивкой.
-
Улучшает стабильность оценки и уменьшает зависимость от конкретного разбиения.
Параметры: n_splits=5, n_repeats=10 → 50 тренировок.
🔹 6. Hold-Out Validation (Train/Test Split)
-
Простое разбиение: обучающая и тестовая выборки, например, 80/20.
-
Простейший способ, но сильно зависит от того, насколько удачно произошла разбивка.
Используется:
-
Когда объём данных очень большой (и CV избыточна);
-
На первом этапе анализа.
🔹 7. Group K-Fold
-
Используется, если есть группы связанных объектов (например, пациенты, пользователи).
-
Все объекты из одной группы попадают либо в train, либо в test, но не в оба.
Применение:
-
Биомедицинские данные (все замеры одного пациента — в одном фолде);
-
Рекомендательные системы (один пользователь — одна группа);
-
Если данные зависимы внутри группы.
🔹 8. Stratified Group K-Fold
-
Совмещает группировку и стратификацию: сохраняет пропорции классов и не делит группы.
-
Особенно полезна, если классы несбалансированы и есть группы.
🔹 9. Time Series Split (TimeSeriesSplit)
-
Для временных рядов: важно учитывать хронологический порядок.
-
Обучение всегда происходит на прошлом, тест — на будущем.
Пример:
- Fold 1: train = \[1..100\], test = \[101..120\]
- Fold 2: train = \[1..120\], test = \[121..140\]
- и так далее.
Варианты:
-
Expanding window (увеличивается train).
-
Rolling window (фиксированный train и test скользят по времени).
Преимущество:
- Подходит для прогноза и сценариев, где будущее нельзя «знать заранее».
🔹 10. Blocked Time Series Split
-
В отличие от TimeSeriesSplit, где окна могут пересекаться, здесь используются непересекающиеся интервалы.
-
Больше подходит для оценки обобщающей способности в сильно автокоррелированных данных.
🔹 11. Nested Cross-Validation
-
Кросс-валидация внутри кросс-валидации.
-
Наружный цикл — для оценки обобщающей способности.
-
Внутренний — для подбора гиперпараметров.
Пример:
- Внешний 5-fold → для каждого фолда внутри происходит 3-fold для GridSearchCV.
Используется при моделировании с автоматическим подбором параметров, особенно для:
-
SVM (C, gamma);
-
XGBoost (depth, learning_rate);
-
Нейросетей.
🔹 12. Monte Carlo Cross-Validation / ShuffleSplit
-
Случайное многократное разбиение на train/test с фиксированными пропорциями (например, 80/20).
-
Не все объекты обязательно попадут в тест.
-
Вариант Repeated Hold-Out.
Параметры:
- n_splits=100, test_size=0.2.
Гибкий и быстровычисляемый метод, но возможен data leakage и неравномерное покрытие данных.
🔹 Сравнительная таблица
Схема CV | Для задач | Сохраняет классы | Учитывает группы | Для временных рядов | Стабильность |
---|---|---|---|---|---|
K-Fold | Общие | ❌ | ❌ | ❌ | Средняя |
--- | --- | --- | --- | --- | --- |
Stratified K-Fold | Классификация | ✅ | ❌ | ❌ | Хорошая |
--- | --- | --- | --- | --- | --- |
Leave-One-Out | Малые выборки | ❌ | ❌ | ❌ | Низкая |
--- | --- | --- | --- | --- | --- |
Group K-Fold | Группы | ❌ | ✅ | ❌ | Средняя |
--- | --- | --- | --- | --- | --- |
Stratified Group K-Fold | Группы + классы | ✅ | ✅ | ❌ | Хорошая |
--- | --- | --- | --- | --- | --- |
TimeSeriesSplit | Временные ряды | ❌ | ❌ | ✅ | Средняя |
--- | --- | --- | --- | --- | --- |
Blocked Time Series Split | Временные ряды | ❌ | ❌ | ✅ | Высокая |
--- | --- | --- | --- | --- | --- |
Nested CV | С гиперпараметрами | ✅ | ✅/❌ | ❌ | Высокая |
--- | --- | --- | --- | --- | --- |
Monte Carlo CV | Общие | ❌ | ❌ | ❌ | Средняя |
--- | --- | --- | --- | --- | --- |
Каждая схема кросс-валидации обладает своими преимуществами и ограничениями. Выбор конкретной схемы зависит от характеристик данных (размер, дисбаланс, зависимость, наличие групп, временная структура) и цели оценки модели (гиперпараметры, устойчивость, отбор признаков).