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

Валидационные данные (Validation Data)

in

Валидационные данные (Validation Data, Holdout Data – "удержанные" данные) – это часть Датасета (Dataset), основа для проверки работоспособности Модели (Model) Машинного обучения (ML). Является одной из составляющих разделенного набора данных наряду с Тренировочными (Train Data) и Тестовыми (Test Data) данными.

Типы разделений датасета 

Пример. Мы создаем модель, предсказывающую потребление электроэнергии в городе. Если на тренировочных данных она, подобно человеческому мозгу, учится видеть скачки потребления электричества, то на тестовой Дата-сайентист (Data Scientist) проверяет качество обучения. Но зачем же нужна валидационная часть?

Когда модель пытается улучшиться, она подыскивает оптимальные значения Гиперпараметров (Hyperparameter). В этом случае существует вероятность Переобучения (Overfitting): модель слишком подробно учитывает особенности информации, на которой обучилась, и при переходе на другие реальные данные будет малоэффективна. Чтобы решить эту проблему, мы можем создать дополнительную валидационную часть датасета, и проверять качество модели на любом подходящем этапе разработки.

В основе всех методов проверки лежит разделение данных при обучении модели. Принцип прост: мы случайным образом разбиваем данные в пропорции 70 : 30, причем большая часть отводится тренировочным данным, а меньшая – тестовым. Но что если в одно подмножество тренировочных данных попали энергопотребители только определенного возраста или уровня дохода? Эта систематическая ошибка называется Смещением выборки (Sampling Bias). В результате неслучайной Выборки (Sampling) из Генеральной совокупности (Population) вероятность включения одних типов Наблюдений (Observation) в выборку ниже, чем у других, что приводит к искаженному восприятию реальности моделью.

Виды валидации

Выделяют следующие методы проверки:

  • Разделение данных (Train / Test Split)
  • k-блочная кросс-валидация (k-Fold Cross Validation)
  • Поэлементная кросс-валидация (LOOCV)
  • Кросс-валидация по отдельным группам (Leave-One-Group-Out Cross-Validation)
  • Кросс-валидация Временных рядов (Time Series)
  • Тест знаковых рангов Уилкоксона (Wilcoxon Signed-Rank Test)
  • Тест Макнемара (McNemar’s Test)
  • Парный T-тест 5x2CV (5x2CV Paired T-Test)
  • Комбинированный F-тест 5x2CV (5x2CV Combined F-Test)

Посмотрим, как работает одна из этих техник.

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

Чтобы свести к минимуму систематическую ошибку выборки, мы изменим формат разделения данных Вместо того, чтобы делать одно разбиение на тренировочную и тестовую части, мы сделаем их много и проверим модель на каждой комбинации:

Преимущество заключается в том, что все наблюдения используются как для обучения, так и для проверки, а каждое наблюдение используется один раз для проверки. Обычно мы разбиваем датасет на 5 или 10 частей: это обеспечивает баланс между вычислительной сложностью и точностью.

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

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

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

Создадим игрушечный размеченный датасет, где X – матрица 4 х 2, состоящая из Переменных-предикторов (Predictor Variable), а yЦелевая переменная (Target Variable), классы, к которым принадлежит то или иное наблюдение:

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])

Применим k-блочную кросс-валидацию в две итерации:

kf = KFold(n_splits = 2)

Выведем индексы тренировочных и тестовых данных для каждой из двух итераций:

for train_index, test_index in kf.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]

Поскольку датасет скромный, то вариантов разбиений немного: то в тестовую часть попадают 2-й и 3-й наблюдения, то 0-й и 1-й.

Тренировочные данные: [2 3] Тестовые данные: [0 1]
Тренировочные данные: [0 1] Тестовые данные: [2 3]

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

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

Фото: @shotbycerqueira