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

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

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

После завершения этого урока, вы будете знать:

  • Как использовать k-fold кросс-валидацию для оценки квалификации модели на новых данных.
  • общие тактики, которые можно использовать, чтобы выбрать значение k для набора данных.
  • широко используемые вариации на перекрестной проверки, такие как стратифицированы (stratified) и repeated, которые доступны в библиотеки scikit-learn.

Урок состоит из 5 частей:

  • k-Fold Кросс-Валидация
  • Конфигурация k
  • Рабочий пример
  • Работы с API кросс-валидации
  • Вариации на кросс-валидации

k-Fold кросс-Валидация


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

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

Перекрестная проверка в основном используется в прикладном машинном обучении для оценки квалификации модели машинного обучения на не используемых данных. То есть использовать ограниченную выборку (test sample) для оценки того, как модель будет работать в целом при использовании ее при прогнозирования на данных, не используемых во время обучения модели.

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

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

  1. Перемешайте датасет случайным образом

2.  Разделите датасет на k-групп

3.  Для каждой уникальной выборки:

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

4. Обобщите параметры качества модели с помощью выборки оценки моделей

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

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

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

Конфигурация параметра k


Значение k должно быть тщательно выбрано для выборки данных.

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

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

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

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

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

Рабочий пример


Чтобы сделать процедуру перекрестной проверки конкретной, давайте посмотрим на пример спроработанных.

Представьте, что у нас есть выборка данных с 6 наблюдениями:

[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]

Первым шагом является выбор значения для k для определения количества выборок, используемых для разделения данных. Здесь мы будем использовать значение k=3. Это означает, что мы будем тасовать данные, а затем разделить данные на 3 группы. Поскольку у нас есть 6 наблюдений, каждая группа будет иметь равно 2 наблюдения.

Например:

subset1: [0,5, 0,2]
subset2: [0,1, 0,3]
subset3: [0,4, 0,6]

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

Три модели обучаются и оцениваются с каждой раз дается шанс быть протянутой набор испытаний.

Например:

  • Модель1: обучаем на subset1 и subset2, тестируем на subset3
  • Модель2: обучаем на subset2 и subset3, тестируем на subset1
  • Модель3: обучаем на subset1 и subset3, тестируем на subset2

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

Оценки качества собираются для каждой модели и суммируются для использования.

API кросс-валидации

Мы не должны осуществлять k-fold проверки вручную. Библиотека scikit-learn предоставляет реализацию, которая поможет разделить датасет .

Метод KFold() из библиотеки scikit-learn может быть использован. Он принимает в качестве аргументов количество выборок на которое надо разбить датасет, следует ли перетасовывать датасет, и числовую затравку для псевдослучайного генератора чисел, используемого до перетасовки датасета.

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

kfold = KFold(3, True, 1)

Функция split() может быть вызвана на классе, в котором в качестве аргумента приводится выборка данных. При повторном вызове, split() будет возвращать выборки данных на которых идет обучение и тестовый выборка. В частности, возвращаются массивы, содержащие индексы, в исходный датасет, в  можно указываются ссылки как на обучаемую выборку, так и на тестовую выборку на каждой итерации.

Например, мы можем перечислить разделения индексов для выборки данных с помощью созданного экземпляра KFold следующим образом:

Перечисление выборок

#перечисление выборок датасета
for train, test in kfold.split(data):
	print('train: %s, test: %s' % (train, test))

Мы можем связать все это вместе с нашим датасетом, используемым в примере из предыдущего раздела.

# scikit-learn k-fold кросс-валидация
from numpy import arrayfrom
sklearn.model_selection import KFold
# датасет
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
# подготовьте кросс валидацию
kfold = KFold(3, True, 1)
# перечисление выборок датасета
for train, test in kfold.split(data):
	print('train: %s, test: %s' % (data[train], data[test]))

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

train: [0.1 0.4 0.5 0.6], test: [0.2 0.3]
train: [0.2 0.3 0.4 0.6], test: [0.1 0.5]
train: [0.1 0.2 0.3 0.5], test: [0.4 0.6]

Реализация перекрестной проверки k-fold в scikit-learn предоставляется в качестве компонентной операции в рамках более широких методов, таких как гиперпараметры модели поиска сетки и оценка модели на наборе данных.

Тем не менее, класс KFold может быть использован непосредственно для того, чтобы разделить набор данных до моделирования, чтобы все модели использовали одни и те же разделения данных. Это особенно полезно, если вы работаете с очень большим датасетом. Использование одних и тех же разделений между алгоритмами может иметь преимущества для статистических тестов, которые вы можете выполнить на данных позже.

Вариации на кросс-валидацию


Существует ряд вариаций процедуры перекрестной проверки k-fold.

Три часто используемых варианта:

  • Обучение / Тест выборка: Самая крайность, это когда k = 2 (не 1) так, что одна выборка идет на обучение и одна и тест для оценки модели.
  • LOOCV: Другая крайность, когда k равен общему размеру наблюдений в датасете. По-английски это называется leave-one-out cross-validation, или LOOCV для краткости.
  • Стратифицированная выборка (stratified): разделение данных на складки может регулироваться такими критериями, чтобы каждая выборка имела одинаковую пропорцию наблюдений с заданным категоричным значением, например значением класса. Это называется стратифицированной перекрестной проверкой.
  • Повторяющаяся выборка (repeated): k-fold перекрестная валидация повторяется n раз, и датасет перетасовывается на каждой итерации, что приводит к иной выборки данных.

Библиотека scikit-learn предоставляет набор реализации перекрестной проверки

Подведем итог


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

В частности, вы узнали:

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

Полезные ссылки: