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

Что такое кросс-валидация и какие её виды существуют?

1.0 Junior🔥 131 комментариев
#Машинное обучение

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

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

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

Кросс-валидация: определение и виды

Кросс-валидация — это метод оценки производительности модели машинного обучения путём разбиения исходного датасета на несколько частей и последовательной тренировки и тестирования модели на каждой из них. Это позволяет получить более надежную оценку обобщающей способности (generalization ability) модели, чем простое разбиение на train/test.

Основные виды кросс-валидации

1. K-Fold Cross-Validation

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

from sklearn.model_selection import cross_val_score, KFold
from sklearn.ensemble import RandomForestClassifier

kfold = KFold(n_splits=5, shuffle=True, random_state=42)
model = RandomForestClassifier()
scores = cross_val_score(model, X, y, cv=kfold, scoring=accuracy)
print(f"Средняя точность: {scores.mean():.3f} (+/- {scores.std():.3f})")

Оптимальное значение k обычно 5 или 10. При k=n это становится Leave-One-Out CV, что вычислительно дорого, но дает объективную оценку.

2. Stratified 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)

3. 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]
    # обучение и оценка

4. Leave-One-Out Cross-Validation (LOOCV)

Специальный случай k-fold, где k равно числу образцов. Каждый объект один раз используется как тестовый. Очень точная, но вычислительно затратная.

5. 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)

Зачем нужна кросс-валидация

  • Стабильность оценки: Уменьшает влияние случайного разбиения на результаты
  • Эффективность данных: Позволяет использовать все данные для обучения и оценки
  • Выявление переобучения: Если разница между CV и train accuracy велика, модель переобучена
  • Выбор гиперпараметров: Кросс-валидация часто используется в GridSearchCV

Практический пример

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

param_grid = {C: [0.1, 1, 10], kernel: [linear, rbf]}
grid_search = GridSearchCV(SVC(), param_grid, cv=5, scoring=f1)
grid_search.fit(X_train, y_train)
print(f"Лучшие параметры: {grid_search.best_params_}")
print(f"Лучший CV скор: {grid_search.best_score_:.3f}")

Кросс-валидация — неотъемлемая часть правильного pipeline машинного обучения, обеспечивающая надёжные и воспроизводимые результаты.