Вы подписаны на Машинное обучение доступно
Отлично! завершите оплату для полного доступа к Машинное обучение доступно
Снова приветствуем Вас! Вы успешно авторизовались
Успех! Аккаунт активирован, и Вы имеете полный доступ к контенту.
Поэлементная кросс-валидация (LOOCV)

Поэлементная кросс-валидация (LOOCV)

in

Поэлементная кросс-валидация (Leave-One-Out Cross Validation) – разновидность проверки обобщающей способности Модели (Model)Машинного обучения (ML), использующая множественные сплиты на Тренировочные данные (Train Data) и Тестовые данные (Test Data).

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

Самый распространенный способ измерить это – использовать Среднеквадратическую ошибку (MSE), которая рассчитывается следующим образом:

$$MSE = \frac{1}{n} × \sum_{i=1}^n (y_i - \widetilde{y}_i)^2$$
$$MSE\space{}{–}\space{Среднеквадратическая}\space{ошибка,}$$
$$n\space{}{–}\space{количество}\space{наблюдений,}$$
$$y_i\space{}{–}\space{фактическая}\space{координата}\space{наблюдения,}$$
$$\widetilde{y}_i\space{}{–}\space{предсказанная}\space{координата}\space{наблюдения,}$$

На практике мы используем следующую последовательность для расчета этой метрики:

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

Тестовая MSE дает нам представление о том, насколько хорошо модель будет работать с данными, которые она ранее не видела, то есть данными, которые не использовались для обучения.

Однако недостатком использования только одного набора тестирования является то, что тестовая MSE может сильно различаться в зависимости от того, какие Наблюдения (Observation) использовались в наборах для обучения и тестирования.

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

Этот общий метод известен как Перекрестная проверка (Cross Validation), а одна его конкретная форма – как Поэлементная кросс-валидация. LOOCV использует следующий подход для оценки модели:

  • Разделим набор данных на обучающий и тестовый наборы, используя все наблюдения, кроме одного, как часть обучающего набора:

Обратите внимание: мы оставляем только одно наблюдение «за пределами» обучающей выборки. Именно потому метод получил такое название.

  • Построим модель, используя только данные из обучающей выборки:
  • Используем модель, чтобы предсказать значение для того самого последнего тестового наблюдения, и вычислить MSE:
  • Наконец, мы повторяем этот процесс n раз (где n –- общее количество наблюдений в наборе), каждый раз исключая разные наблюдения.

Напоследок, мы вычисляем среднее значение MSE.

Плюсы и минусы LOOCV

Поэлементная кросс-валидация обладает следующими преимуществами:

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

Однако метод имеет следующие недостатки:

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

К счастью, современные вычисления стали настолько эффективными в большинстве областей, что LOOCV – гораздо более разумный метод для использования по сравнению с тем, что было много лет назад.

Обратите внимание, что LOOCV можно использовать как в Регрессии (Regression), так и в Классификации (Classification). Для задач регрессии он вычисляет тестовую MSE как среднеквадратичную разницу между предсказаниями и наблюдениями, тогда как в задачах классификации он вычисляет тестовую MSE как процент наблюдений, правильно классифицированных во время n повторных подгонок модели.

LOOCV: Scikit-learn

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

import numpy as np
import sklearn
from sklearn.model_selection import LeaveOneOut

Сгенерируем небольшой Датасет (Dataset), инициализируем метод LeaveOneOut и создадим один сплит на обучающее и тестовое наблюдения:

# Предикторы
X = np.array([[1, 2], [3, 4]])
# Цедевая переменная
y = np.array([1, 2])

loo = LeaveOneOut()
loo.get_n_splits(X)

Метод get_n_splits() сообщает, ко всему прочему, число наблюдений:

2

Теперь запустим классификацию для первого и второго сплитов, то есть определим дважды, к какому классу какой список внутри X относится:

for train_index, test_index in loo.split(X):
    print("Тренировка:", train_index, "Тест:", test_index)
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    print(X_train, X_test, y_train, y_test)

Модель перекрестно прошлась по всем наблюдениям и безошибочно классифицировала пару [3, 4] как запись класса 2, а [1, 2] как запись класса 1:

Тренировка: [1] Тест: [0]
[[3 4]] [[1 2]] [2] [1]
Тренировка: [0] Тест: [1]
[[1 2]] [[3 4]] [1] [2]

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

Автор оригинальной статьи: Zach, scikit-learn.org