NB Перекрестная проверка (кросс-валидация) не является способом построения модели, которую можно применить к новым данным. Перекрестная проверка не возвращает модель. При вызове cross_val_score строится несколько внутренних моделей, однако цель перекрестной проверки заключается только в том, чтобы оценить обобщающую способность данного алгоритма, обучив на определенном наборе данных.
В простейшем случае данные разбиваются на обучающий и тестовый наборы. Это производится для выяснения насколько хорошо модель обобщает результат на новые, ранее неизвестные данные. Представляет интерес не качество подгонки модели к обучающим данным, а правильность ее прогнозов для данных, не участвовавших в обучении.
Перекрестная проверка представляет собой статистический метод оценки обобщающей способности, который является более устойчивым и основательным, чем разбиение данных на обучающий и тестовый наборы.
В перекрестной проверке данные разбиваются несколько раз и строится несколько моделей. Наиболее часто используемый вариант перекрестной проверки – k-блочная кросс-проверка (k-fold cross-validation). Обучающая выборка разбивается на k непересекающихся одинаковых по объему частей. Производится k итераций. На каждой итерации происходит следующее:
- Модель обучается на k−1 части обучающей выборки;
- Модель тестируется на части обучающей выборки, которая не участвовала в обучении.
Каждая из k частей единожды используется для тестирования.
Для каждого из этих разбиений (splits) данных на обучающий и тестовый наборы вычисляется правильность.
Как правило, k=10 (5 в случае малого размера выборки).
Функция cross_val_score
В scikit-learn перекрестная проверка реализована с помощью функции cross_val_score модуля model_selection. Аргументами функции cross_val_score являются оцениваемая модель, обучающие данные и фактические метки (или значения).
Если существует относительно высокий разброс значений правильности, вычисленных для блоков, то подобный результат может означать, что модель сильно зависит от конкретных блоков, использованных для обучения, а также это может быть обусловлено небольшим размером набора данных.
Стратегии перекрестной проверки
Библиотека scikit-learn предлагает использовать для классификации стратифицированную k-блочную перекрестную проверку (stratified k-fold cross-validation). В стратифицированной перекрестной проверке данные разбиваются таким образом, чтобы пропорции классов в каждом блоке в точности соответствовали пропорциям классов в наборе данных,
Библиотека scikit-learn позволяет значительно точнее настроить процесс перекрестной проверки, используя в качестве параметра cv генератор разбиений перекрестной проверки (cross-validation splitter).
Перемешивание данных
Вместо стратификации возможно перемешивание данных и нарушение порядка сортировки примеров. Для этого генератору KFold передается параметр shuffle=True. Для повторяемости результата может быть зафиксирован параметр random_state.
Перекрестной проверки – исключение по одному
Еще один часто используемый метод перекрестной проверки – исключение по одному (leave-one-out). Перекрестную проверку с исключением по одному можно представить в виде k-блочной перекрестной проверки, в которой каждый блок представляет собой отдельный пример. Подход занимает много времени при работе с большими наборами данных, однако иногда позволяет получить более точные оценки на небольших наборах данных:
NB В случае классификации cross_val_score выдаст набор из нулей и единиц (правильно или не правильно определен класс единственного примера). В случае регрессии, для единственного примера вычисление коэффициента детерминации не представляется возможным.
Перекрестная проверка со случайными перестановками при разбиении
Гибкой стратегией перекрестной проверки является перекрестная проверка со случайными перестановками при разбиении (shuffle-split cross-validation).
В этом виде проверки каждое разбиение выбирает train_size точек для обучающего набора и test_size точек для тестового набора (при этом обучающее и тестовое подмножества не пересекаются). Точки выбираются с возвращением. Разбиение повторяется n_splits раз.
Чтобы задать абсолютные размеры обучающего и тестового подмножеств можно использовать для train_size и test_size целочисленные значения, либо числа с плавающей точкой, чтобы задать доли от общей выборки.
Метод позволяет использовать на каждой итерации лишь часть данных (значения train_size и test_size необязательно должны в сумме давать 1). Подобное прореживание полезно при работе с большими наборами данных.
Существует также стратифицированный вариант ShuffleSplit, названный StratifiedShuffleSplit, который позволяет получить более надежные результаты при решении задач классификации.
Перекрестная проверка с использованием групп
Эта распространенная настройка для перекрестной проверки применяется, когда данные содержат сильно взаимосвязанные между собой группы.
В этом случае рекомендуется воспользоваться GroupKFold, принимающий в качестве аргумента массив groups. С помощью этого массива указывается принадлежность примеров к какой-либо группе.
NB При выполнении разбиении каждая группа полностью попадает либо в обучающий набор, либо в тестовый набор
В библиотеке scikit-learn имеются и другие стратегии разбиения данных для перекрестной проверки. Однако стандартные стратегии KFold, StratifiedKFold и GroupKFold используются чаще всего.