Наборы для обучения, проверки и тестирования объясняются простым английским языком.

Возможно, вы уже знакомы с обучающими и тестовыми наборами. При обучении моделей ML и DL вы часто разбиваете весь набор данных на обучающий и тестовый наборы.

Это связано с тем, что вам нужен отдельный набор тестов для оценки вашей модели на невидимых данных, чтобы увеличить обобщающие возможности модели.

Мы не тестируем нашу модель на тех же данных, которые использовались для обучения. Если мы это сделаем, модель попытается запомнить данные и не будет обобщать новые невидимые данные.

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

Машинное обучение — это очень многократный процесс, — Эндрю Нг.

Машинное обучение — это не разовый процесс. Вам нужно поэкспериментировать с разными моделями, установив разные значения для гиперпараметров, прежде чем найти лучшую модель, которую вы ищете.

Здесь в игру вступает набор проверки.

Набор для обучения, набор для проверки и набор для тестирования

Обучение, тестирование и проверка являются ключевыми этапами рабочего процесса машинного обучения. Для каждого шага нам нужен отдельный набор данных. Таким образом, входной набор данных разделен на следующие части.

  • Обучающий набор. Это самая большая часть набора данных. Учебный набор используется для обучения (подгонки) модели. Параметры модели изучают свои значения (правила или шаблоны) из обучающих данных. Другими словами, обучающий набор используется для подгонки параметров модели к фиксированной комбинации гиперпараметров.
  • Проверочный набор. Процесс обучения нашей модели не является разовым процессом. Мы должны обучить несколько моделей, пробуя разные комбинации гиперпараметров. Затем мы оцениваем производительность каждой модели на проверочном наборе. Таким образом, проверочный тест полезен для настройки гиперпараметров или выбора лучшей модели из разных моделей. В некоторых контекстах набор для проверки также называется набором для разработки.
  • Тестовый набор. После процесса настройки мы выбираем лучшую модель с оптимальным сочетанием гиперпараметров. Мы измеряем производительность этой модели с помощью набора тестов.

Несложно понять роль обучающих и тестовых наборов. Возможно, вы еще не знакомы с ролью проверочного набора — название сегодняшней статьи.

Давайте посмотрим на пример.

Допустим, мы хотим обучить классификатор случайного леса на наборе данных, попробовав разные значения гиперпараметров n_estimators и max_depth.

from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(n_estimators=?, max_depth=?)

Значение по умолчанию для n_estimators — 100, а для max_depth — None. Но нас не интересуют эти значения по умолчанию. Вместо этого мы хотим попробовать следующие значения.

  • n_estimators: 100, 500, 1000 (3 разных значения)
  • max_depth: 2, 3, 5, 10 (4 разных значения)

Существует 12 (3 x 4) различных комбинаций гиперпараметров. Это означает, что мы создадим 12 различных классификаторов случайного леса, одновременно рассматривая каждую комбинацию гиперпараметров. Например,

rf_clf_1 = RandomForestClassifier(n_estimators=100, max_depth=2)

Мы обучаем первую модель на тренировочном наборе, оцениваем ее производительность на проверочном наборе, записываем оценку производительности и откладываем ее в сторону.

rf_clf_2 = RandomForestClassifier(n_estimators=100, max_depth=3)

Мы обучаем вторую модель на том же тренировочном наборе, оцениваем ее производительность на том же проверочном наборе, записываем ее оценку производительности и оставляем ее в стороне.

Точно так же мы обучаем все 12 моделей и записываем показатели производительности. Затем мы выбираем модель с лучшим показателем производительности и записываем значения ее гиперпараметров. Допустим, эти значения гиперпараметров — n_estimators=500 и max_depth=3.

rf_clf_best = RandomForestClassifier(n_estimators=500, max_depth=3)

Наконец, мы оцениваем эту модель на тестовом наборе.

Таким образом, обучающий набор используется для подбора параметров модели, проверочный набор используется для настройки гиперпараметров модели. Наконец, мы используем тестовый набор для оценки лучшей модели.

Можно спросить, зачем нам отдельный набор валидации. Можем ли мы настроить гиперпараметры модели с помощью обучающего набора вместо использования отдельного проверочного набора? Ответ заключается в том, что мы также проводим какое-то тестирование с использованием проверочного теста, и тестирование не должно проводиться на тех же данных, которые используются для обучения.

Использование проверочных и тестовых наборов повысит способность модели обобщать новые невидимые данные.

Кроме того, обратите внимание, что набор проверки не требуется (избыточен), если вы не собираетесь настраивать модель, пробуя различные комбинации гиперпараметров. В этом случае вы можете продолжить процесс обучения, используя только обучающие и тестовые наборы.

Как создавать обучающие, проверочные и тестовые наборы

Теперь вы знакомы с использованием обучающих, проверочных и тестовых наборов. В этом разделе мы обсудим, как создавать эти наборы в Python.

Мы собираемся обсудить 3 различных метода создания обучающих, проверочных и тестовых наборов.

1. Использование функции Scikit-learn train_test_split() дважды

Возможно, вы уже знакомы с функцией Scikit-learn train_test_split(). Здесь мы используем его дважды для создания обучающих, проверочных и тестовых наборов. Вот как это сделать.

Во-первых, мы создаем обучающий набор, выделяя 70% выборок в исходном наборе данных. Таким образом, train_size равен 0,70.

from sklearn.model_selection import train_test_split
X_train, X_rem, y_train, y_rem = train_test_split(X, y,
                                                  train_size=0.70)

Учебный набор включает части X_train и y_train. Части X_rem и y_rem относятся к оставшемуся набору данных, который используется для создания проверочных и тестовых наборов на следующем шаге.

X_valid, X_test, y_valid, y_test = train_test_split(X_rem,y_rem,
                                                    test_size=0.15)

Набор проверки включает части X_valid и y_valid. Части X_test и y_test принадлежат набору тестов. Здесь мы использовали test_size=0.15. Это означает, что мы получаем 15% выборок в исходном наборе данных для каждого набора проверки и тестирования.

2. Использование функции train_valid_test_split() Fast-ML

В приведенном выше методе вам нужно дважды вызвать функцию train_test_split(), чтобы создать наборы для обучения, проверки и тестирования. Используя функцию train_valid_test_split() в библиотеке Fast-ML, вы можете создать все наборы одним вызовом функции!

X_train, y_train, X_valid, y_valid, X_test, y_test = train_valid_test_split(X, y, train_size=0.70, valid_size=0.15, test_size=0.15)

3. Использование функций Scikit-learn GridSearchCV() и RandomizedSearchCV()

Здесь нам не нужно явно создавать набор проверки, поскольку эти функции создают его за кулисами вместе с перекрестной проверкой k-fold.

Во-первых, нам нужно разделить набор данных на обучающие и тестовые наборы с помощью функции Scikit-learn train_test_split().

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.15)

Тестовый набор содержит 15 % выборок исходного набора данных, а обучающий набор содержит 85 % выборок.

Затем мы выполняем функцию GridSearchCV() или RandomizedSearchCV() с обучающим набором.

from sklearn.model_selection import GridSearchCV
gs = GridSearchCV(cv=5)
gs.fit(X_train, y_train)

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

Установив cv=5 в функции GridSearchCV(), алгоритм разбивает обучающий набор на 5 частей, каждая из которых имеет 17% (85/5) выборок. На каждой итерации одна кратность сохраняется в качестве проверочного набора, как показано на следующей диаграмме.

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

Если вы не знакомы с перекрестной проверкой k-fold, поиском по сетке или случайным поиском, прочитайте следующие статьи, написанные мной.





Насколько большими должны быть наборы данных для обучения, проверки и тестирования?

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

  • Объем ваших данных
  • Насколько хорошо должна работать модель
  • Обнаружение небольших изменений в показателе эффективности

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

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

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

По умолчанию Scikit-learn для размера набора тестов составляет 25% от исходных данных.

Для небольших наборов данных с сотнями или тысячами строк лучше использовать 0.8 : 0.1 : 0.1 или 0.7 : 0.15 : 0.15 для обучения, проверки и тестовых наборов.

Для больших наборов данных с миллионами или миллиардами строк вам не нужно выделять больший процент данных для проверки и тестовых наборов. Лучше использовать 0.98 : 0.01 : 0.01 или 0.96 : 0.02 : 0.02 для обучения, проверки и тестовых наборов.

Набор для проверки (разработки) должен быть достаточно большим, чтобы обнаруживать различия между алгоритмами, которые вы испытываете — Эндрю Нг.

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

Краткое содержание

Теперь у вас есть четкое представление об обучении, проверке и наборах тестов. Подводя итог, отметьте следующие вещи.

  • Учебный набор используется для обучения модели (параметры обучения)
  • Набор проверки используется для настройки гиперпараметров.
  • Тестовый набор используется для окончательной оценки лучшей модели.
  • Набор проверки не требуется (избыточен), если вы не собираетесь выполнять настройку гиперпараметров.
  • Функции GridSearchCV() и RandomizedSearchCV() создают набор проверки за кулисами. Таким образом, нам не нужно явно создавать набор проверки при использовании этих функций.

Это конец сегодняшней статьи. Если у вас есть какие-либо вопросы относительно этой статьи, пожалуйста, дайте мне знать в разделе комментариев.

Спасибо за прочтение!

До встречи в следующей статье! Как всегда всем приятного обучения!

Становиться участником

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



Подпишитесь на мою рассылку

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



Рукшан Прамодита
2022–04–11