На этом шаге мы рассмотрим общие принципы организации такой проверки.
Еще одна весьма распространенная настройка для перекрестной проверки применяется, когда данные содержат сильно взаимосвязанные между собой группы. Допустим, вы хотите построить систему распознавания эмоций по фотографиям лиц и для этого вы собрали набор изображений 100 человек, в котором каждый человек сфотографирован несколько раз, чтобы зафиксировать разные эмоции. Цель заключается в том, чтобы построить классификатор, который сможет правильно определить эмоции людей, не включенных в этот набор изображений. В данном случае для оценки качества работы классификатора вы можете использовать традиционную стратифицированную перекрестную проверку. Однако, вполне вероятно, что фотографии одного и того же человека попадут как в обучающий, так и в тестовый наборы. По сравнению с совершенно новым лицом классификатору намного проще будет определить эмоции по лицу, которое уже встречалось ему в обучающем наборе. Чтобы точно оценить способность модели обобщать результат на новые лица, необходимо убедиться в том, что обучающий и тестовый наборы содержат изображения разных людей.
Для решения этой задачи мы можем воспользоваться GroupKFold, принимающий в качестве аргумента массив groups. С помощью него мы указываем, какой человек изображен на снимке. В данном случае массив groups указывает группы данных, которые не следует разбивать при создании обучающего и тестового наборов, при этом их не следует путать с метками классов.
Подобные группы данных часто встречаются в медицинской практике, когда у вас, возможно, есть несколько наблюдений по одному и тому же пациенту, но вы заинтересованы в обобщении результатов на новых пациентов. Аналогично в задачах распознавания речи у вас может быть несколько записей одного и того же человека, но вас интересует точность распознавания речи новых людей.
Ниже приведен пример с использованием синтетического набора данных, группировка данных задана массивом groups. Набор данных состоит из 12 точек данных, и для каждой точки массив groups задает группу (допустим, пациента), к которой относится эта точка. У нас существуют четыре группы, первые три примера принадлежат к первой группе, следующие четыре примера принадлежат ко второй группе и так далее:
[In 15]: from sklearn.model_selection import GroupKFold # создаем синтетический набор данных X, y = make_blobs(n_samples=12, random_state=0) # предположим, что первые три примера относятся к одной и той же группе, # затем следующие четыре и так далее. groups = [0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3] scores = cross_val_score(logreg, X, y, groups, cv=GroupKFold(n_splits=3)) print("Значения правильности перекрестной проверки:\n{}".format(scores)) Значения правильности перекрестной проверки: [0.75 0.6 0.66666667]
Примеры не нужно сортировать по группам, мы сделали это в иллюстративных целях. Разбиения, вычисляемые на основе этих меток, показаны на рисунке 1.
Видно, что при выполнении разбиении каждая группа полностью попадает либо в обучающий набор, либо в тестовый набор:
[In 16]:
mglearn.plots.plot_group_kfold()
Рис.1. Разбиение на основе меток групп с помощью GroupKFold
В библиотеке scikit-learn есть и другие стратегии разбиения данных для перекрестной проверки, которые предполагают еще большее разнообразие вариантов использования (вы можете найти их в руководстве пользователя по scikit-learn). Однако стандартные стратегии KFold, StratifiedKFold и GroupKFold на сегодняшний день используются чаще всего.
Со следующего шага мы начнем рассматривать решетчатый поиск.