Поэлементная кросс-валидация (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.
Поэлементная кросс-валидация обладает следующими преимуществами:
Однако метод имеет следующие недостатки:
К счастью, современные вычисления стали настолько эффективными в большинстве областей, что LOOCV – гораздо более разумный метод для использования по сравнению с тем, что было много лет назад.
Обратите внимание, что LOOCV можно использовать как в Регрессии (Regression), так и в Классификации (Classification). Для задач регрессии он вычисляет тестовую MSE как среднеквадратичную разницу между предсказаниями и наблюдениями, тогда как в задачах классификации он вычисляет тестовую MSE как процент наблюдений, правильно классифицированных во время n повторных подгонок модели.
Давайте посмотрим, как поэлементная кросс-валидация реализована в 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
© Лена Капаца. Все права защищены.