Cross-Validation
Кросс-валидация обучает и оценивает модель на k чередующихся разбиениях одного набора данных, чтобы оценить способность к обобщению. Разбираем этапы K-fold, варианты, утечку данных и код.
Перекрестная проверка оценивает, насколько хорошо модель будет работать на неизвестных данных: модель несколько раз обучают и проверяют на разных разбиениях одного набора данных, а затем объединяют полученные оценки. При перекрестной проверке с k блоками данные делятся на k равных частей — блоков; каждый блок по очереди становится валидационной выборкой, а модель обучается на остальных k − 1 блоках. Среднее значение k оценок служит оценкой производительности, а их разброс показывает, насколько эта оценка зависит от того, какие примеры попали в валидационную выборку. Перекрестная проверка — стандартный метод оценки, когда данных слишком мало для надежной оценки по одной отложенной выборке; ее широко используют для сравнения алгоритмов и настройки гиперпараметров, не затрагивая тестовые данные.
Как работает перекрестная проверка с k блоками#
Набор данных один раз перемешивают и делят на k блоков, обычно 5 или 10. В каждом из k раундов обучают новую модель на k − 1 блоках и оценивают ее на оставшемся блоке, поэтому каждый пример ровно один раз используется для валидации и k − 1 раз — для обучения. Вычисляют среднее значение k оценок и указывают его вместе со стандартным отклонением. После того как перекрестная проверка помогла выбрать модель или набор гиперпараметров, итоговую модель обычно заново обучают на всех обучающих данных с выбранными настройками. Крайний вариант — перекрестная проверка с исключением одного примера, где k равно числу примеров: в каждом раунде для обучения используется максимум данных, но моделей приходится обучать столько же, сколько есть примеров.
Как интерпретировать результаты перекрестной проверки#
Разброс значений по блокам не менее информативен, чем их среднее. Приведенный ниже скрипт для scikit-learn выполняет перекрестную проверку с 5 блоками на встроенном наборе данных о раке молочной железы:
from sklearn.datasets import load_breast_cancer
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import StratifiedKFold, cross_val_score
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
# 569 labeled tumor samples with 30 features each
X, y = load_breast_cancer(return_X_y=True)
# The scaler sits inside the pipeline, so each round fits it on that round's training folds only
model = make_pipeline(StandardScaler(), LogisticRegression(max_iter=1000))
# 5 stratified folds: each sample is validated exactly once
folds = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
scores = cross_val_score(model, X, y, cv=folds)
print("Fold accuracies:", scores.round(3))
print(f"Mean {scores.mean():.3f} +/- {scores.std():.3f}")Точность по пяти блокам находится в диапазоне от 0.956 до 1.000; среднее значение равно 0.979, а стандартное отклонение — 0.014. При одном разбиении 80/20 результатом могло бы стать любое из этих пяти чисел; диапазон составляет 4.4 процентного пункта. Размещение масштабировщика внутри конвейера исключает валидационный блок из вычисления статистик предобработки данных; предварительное масштабирование всего набора данных привело бы к утечке данных из каждого валидационного блока в обучающую выборку.
Выбор варианта перекрестной проверки#
Обычная перекрестная проверка с k блоками предполагает, что примеры независимы и взаимозаменяемы. Если это не так, случайное разбиение приводит к утечке информации или формирует блоки, не соответствующие задаче:
- Стратифицированная перекрестная проверка с k блоками: сохраняет в каждом блоке пропорции классов, соответствующие пропорциям во всем наборе данных. Это важно, когда в одном из блоков иначе может не оказаться примеров редкого класса.
- Групповая k-кратная проверка: все примеры одной группы, например одного пациента, видео или полевого участка, остаются в одной части, поэтому модель никогда не проверяется на почти дубликатах обучающих изображений. Стратифицированная групповая k-кратная проверка сочетает оба ограничения.
- Разбиение временного ряда: модель обучается только на прошлом и проверяется на следующем за ним периоде; в каждом раунде обучающее окно расширяется, поскольку при перемешивании данных, упорядоченных по времени, модель увидит будущее.
- Вложенная перекрестная проверка: во внешнем блоке выполняется внутренний цикл перекрестной проверки для настройки гиперпараметров, поэтому оценка по внешнему циклу не завышается из-за настройки на тех же блоках, по которым рассчитывается.
Перекрестная проверка для глубокого обучения#
Обучение глубокой сети k раз увеличивает вычислительные затраты в k раз, поэтому для больших наборов данных, таких как ImageNet и COCO, используют одно фиксированное валидационное разбиение, которого уже достаточно для стабильной оценки. Перекрестная проверка полезна для небольших наборов данных изображений размером от нескольких сотен до нескольких тысяч изображений, когда в одном валидационном разбиении может остаться лишь несколько примеров каждого класса. В руководстве Ultralytics по перекрестной проверке с k блоками набор данных для обнаружения объектов делится на пять блоков с помощью KFold из scikit-learn; для каждого блока создаются списки обучающих и валидационных изображений и YAML-файл набора данных, а затем обучается отдельная модель YOLO26. Поскольку на изображениях для обнаружения объектов обычно присутствует несколько классов, разбить их на стратифицированные блоки по одной метке нельзя, поэтому в руководстве также фиксируется отношение числа валидационных меток к числу обучающих для каждого класса в каждом блоке.
Перекрестная проверка и связанные термины#
- Проверка на отложенной выборке: одно разбиение, например 80/20, с однократной оценкой. Требуется один запуск обучения; этот подход подходит для больших наборов данных, а результат зависит от того, какие примеры попали в валидационное разбиение.
- Бутстрэп: обучающие выборки формируются случайным отбором с возвращением, а каждая модель оценивается на примерах, не вошедших в соответствующую выборку. При перекрестной проверке с k блоками данные делятся без возвращения, поэтому каждый пример попадает ровно в один блок.
- Оценка на тестовом наборе: перекрестная проверка помогает выбрать модель и настройки. Отдельный тестовый набор, не участвующий ни в одном блоке, дает итоговую оценку выбранной модели.










