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

Какие знаешь стратегии кросс валидации?

1.7 Middle🔥 181 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI30 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Стратегии кросс-валидации в машинном обучении

Кросс-валидация — критически важный метод оценки обобщающей способности модели, позволяющий эффективнее использовать ограниченные данные и получить более надежные оценки производительности.

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

K-Fold — наиболее популярная и универсальная стратегия. Данные делятся на k примерно равных частей (фолдов). Модель обучается k раз, каждый раз используя k-1 фолдов для обучения и 1 фолд для валидации. Финальная оценка — среднее значение метрик со всех k итераций.

from sklearn.model_selection import cross_val_score, KFold
kf = KFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=kf, scoring='accuracy')
print(f"Среднее: {scores.mean()}, Стд: {scores.std()}")

Обычно используется k=5 или k=10. Преимущества: простота, эффективное использование данных. Недостатки: вычислительная стоимость увеличивается с k.

Stratified K-Fold

Stratified K-Fold — модификация K-Fold, сохраняющая распределение классов в каждом фолде. Критична для несбалансированных датасетов. Гарантирует, что каждый фолд содержит примерно одинаковую долю каждого класса.

from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = cross_val_score(model, X, y, cv=skf, scoring='f1')

Это особенно важно для задач классификации с дисбалансом классов.

Leave-One-Out (LOO)

Leave-One-Out (LOO) — экстремальный случай K-Fold, где k=n (количество примеров). Модель обучается n раз на всех данных кроме одного примера, который используется для валидации.

from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
scores = cross_val_score(model, X, y, cv=loo, scoring='accuracy')

Преимущества: практически не расходует данные, дает несмещенную оценку. Недостатки: очень дорого вычислительно, может дать высокую дисперсию оценки на малых датасетах.

Time Series Split

Time Series Split — специальная стратегия для временных рядов. Данные делятся последовательно: тренировочный набор растет, а тестовый набор всегда находится после тренировочного. Это предотвращает "утечку информации" из будущего в прошлое.

from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=5)
for train_idx, test_idx in tscv.split(X):
    X_train, X_test = X[train_idx], X[test_idx]
    y_train, y_test = y[train_idx], y[test_idx]
    # обучение и валидация

Основная идея: модель обучается на прошлых данных и тестируется на будущих.

Shuffle Split

Shuffle Split (случайное разбиение) — случайно делит данные на тренировочный и тестовый наборы заданного размера. Выполняется несколько итераций с разными случайными разбиениями.

from sklearn.model_selection import ShuffleSplit
ss = ShuffleSplit(n_splits=10, test_size=0.2, random_state=42)
scores = cross_val_score(model, X, y, cv=ss, scoring='accuracy')

Полезна когда размер датасета очень большой.

Grouped K-Fold

Grouped K-Fold — используется когда данные содержат зависимые группы (например, несколько наблюдений от одного пациента). Гарантирует, что примеры из одной группы не разделяются между тренировочным и тестовым наборами.

from sklearn.model_selection import GroupKFold
gkf = GroupKFold(n_splits=5)
scores = cross_val_score(model, X, y, groups=groups, cv=gkf, scoring='accuracy')

Nested Cross-Validation

Nested Cross-Validation — двойная кросс-валидация, используется для гиперпараметризации модели. Внешний цикл оценивает обобщающую способность, внутренний цикл подбирает гиперпараметры.

from sklearn.model_selection import GridSearchCV
outer_cv = KFold(n_splits=5)
inner_cv = KFold(n_splits=3)
gs = GridSearchCV(model, param_grid, cv=inner_cv)
scores = cross_val_score(gs, X, y, cv=outer_cv, scoring='accuracy')

Это предотвращает переобучение гиперпараметров.

Практические рекомендации

  1. Для сбалансированной классификации — используй K-Fold (k=5 или 10)
  2. Для несбалансированной классификации — Stratified K-Fold
  3. Для временных рядов — Time Series Split
  4. Для зависимых групп — Grouped K-Fold
  5. Для больших датасетов — Shuffle Split
  6. Для малых датасетов — LOO или k=n
  7. Для подбора гиперпараметров — Nested CV

Выбор правильной стратегии кросс-валидации критичен для получения честной оценки производительности модели.

Какие знаешь стратегии кросс валидации? | PrepBro