3 min read

k-блочная кросс-валидация (k-Fold Cross Validation)

k-блочная кросс-валидация (k-Fold Cross Validation)
Фото: Erik-Jan Leusink / Unsplash

k-блочная кросс-валидация (k-блочная перекрестная проверка) – процедура, используемая для оценки навыков Моделей (Model) Машинного обучения (ML) на новых данных.

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

Существуют общие тактики, которые вы можете использовать для выбора значения k для вашего набора данных. Существуют широко используемые варианты перекрестной проверки, такие как стратифицированная и повторная кросс-валидация, которые доступны в scikit-learn.

Кросс-валидация, или перекрестная проверка — это процедура повторной выборки, используемая для оценки моделей машинного обучения на ограниченной Выборке (Sample) данных.

Процедура имеет единственный параметр, называемый k, который означает количество групп, на которые должна быть разбита данная выборка данных. Таким образом, эту процедуру часто называют k-кратной перекрестной проверкой. Когда выбрано конкретное значение k, его можно использовать вместо k в ссылке на модель, например, k=10 становится 10-кратной перекрестной проверкой.

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

Общая процедура выглядит следующим образом:

  • Перемешайте набор данных случайным образом
  • Разделите набор на k групп. Для каждой уникальной группы:
  • Выделите группу записей в качестве Тестовых данных (Test Data)
  • Возьмите оставшиеся группы в качестве Тренировочных данных (Train Data)
  • Обучите модель на тренировочных и оцените ее эффективность на тестовых данных
  • Сохраните значение оценки и сбросьте модель до исходного состояния для следующей итерации
  • Установите средний уровень навыка модели.

Важно отметить, что каждое наблюдение в выборке данных относится к отдельной группе и остается в этой группе на протяжении всей процедуры. Это означает, что каждому образцу предоставляется возможность использоваться в наборе удержания 1 раз и использоваться для обучения модели k-1 раз.

Этот подход предполагает случайное разделение набора наблюдений на k групп (складок) примерно одинакового размера. Первая складка рассматривается как проверочный набор, и обучение проходит на оставшихся k-1 частях.

Также важно, чтобы любая подготовка данных перед подгонкой модели происходила в выборке, а не в более широком наборе данных. Это также относится к любой настройке Гиперпараметров (Hyperparameter). Невыполнение этих условий может привести к Утечке данных (Data Leakage) и оптимистичной оценке навыков модели.

Несмотря на все усилия статистических методистов, пользователи часто делают недействительными свои результаты, непреднамеренно взглянув на тестовые данные.

Результаты k-блочной кросс-валидации часто суммируются со средним значением оценки навыков модели. Также рекомендуется включать меру дисперсии оценок навыков, например Стандартное отклонение (Standard Deviation).

Конфигурация k

Значение k должно быть тщательно подобрано.

Плохо выбранное значение k может привести к неправильному представлению о навыках модели, например, оценка с высокой Дисперсией (Variance), которая может сильно измениться в зависимости от данных, используемых для соответствия модели, или высокое систематическое Смещение (Bias).

Три общие тактики выбора значения для k заключаются в следующем:

  • Представительная: значение для k выбирается таким образом, чтобы каждая обучающая / тестовая группа выборок данных была достаточно большой, чтобы быть статистически репрезентативной для более широкого набора данных.
  • k = 10:  значение, которое, как было установлено в ходе экспериментов, обычно гарантирует низкое смещение и небольшую дисперсию.
  • k = n: значение k фиксируется равным n, где n — это размер набора данных, чтобы дать каждой тестовой выборке возможность быть использованной в наборе данных удержания. Такой подход называется Поэлементной кросс-валидацией (LOOCV).

Выбор k обычно равен 5 или 10, но формального правила нет. По мере того, как k становится больше, разница в размере между обучающим набором и подмножествами повторной выборки становится меньше. По мере уменьшения этой разницы смещение уменьшается.

Значение k = 10 очень распространено в области прикладного машинного обучения и рекомендуется, если вы пытаетесь выбрать значение для своего набора данных.

Подводя итог, можно сказать, что существует компромисс между смещением и дисперсией, связанный с выбором k в k-кратной кросс-валидации. Как правило, с учетом этих соображений выполняется k-кратная перекрестная проверка с использованием k = 5 или k = 10, поскольку эмпирически было показано, что эти значения дают оценки частоты ошибок теста, которые не страдают ни чрезмерно высоким смещением, ни очень высокой дисперсией.

Если выбрано значение k, не разделяющее выборку данных равномерно, то одна группа будет содержать оставшуюся часть примеров. Предпочтительно разделить выборку данных на k групп с одинаковым количеством выборок, чтобы все выборки оценок навыков модели были эквивалентны.

k-блочная кросс-валидация: Sklearn

Давайте посмотрим, как k-блочная кросс-валидация реализована в SkLearn. Для начала импортируем необходимые библиотеки:

import numpy as np
from numpy import array
from sklearn.model_selection import KFold

Инициализируем два массива X и y, содержащие значения Предикторов (Predictor Variable) и Целевой переменной (Target Variable). Затем инициализируем сущность валидатор KFold, который разделит этот набор на две части:

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = KFold(n_splits=2)
kf.get_n_splits(X)
print(kf)

Система отобразит некоторые настройки валидатора, как то: режим случайной выборки и перемешивание:

KFold(n_splits=2, random_state=None, shuffle=False)

Обучим модель на имеющихся данных:

for train_index, test_index in kf.split(X):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]

Посмотрим, какие метки класса модель назначит тестовым данным. Поскольку классов всего 4 (0, 1, 2 и 3), то в каждой строке выходных данных должны фигурировать все они, что и происходит:

TRAIN: [2 3] TEST: [0 1]
TRAIN: [0 1] TEST: [2 3]

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.