Что такое гиперпараметры, как выбирать значения гиперпараметров и стоят ли они вашего времени

В этом посте я подробно рассмотрю настройку гиперпараметров для моделей случайной классификации лесов с использованием нескольких пакетов scikit-learn для классификации и выбора моделей. Я буду анализировать наборы данных о качестве вина из Репозитория машинного обучения UCI. Для этого поста я объединил отдельные наборы данных для красного и белого вина и назначил им дополнительный столбец, чтобы различать цвет вина, где 0 представляет красное вино, а 1 представляет белое вино. Цель этой классификационной модели - определить, является ли вино красным или белым. Чтобы оптимизировать эту модель для создания наиболее точных прогнозов, я сосредоточусь исключительно на настройке и выборе гиперпараметров.

Что такое гиперпараметр?

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

  1. n_estimators: параметр n_estimators указывает количество деревьев в лесу модели. Значение по умолчанию для этого параметра - 10, что означает, что в случайном лесу будет построено 10 различных деревьев решений.

2. max_depth: параметр max_depth указывает максимальную глубину каждого дерева. Значение по умолчанию для max_depth - None, что означает, что каждое дерево будет расширяться до тех пор, пока каждый лист не станет чистым. Чистый лист - это тот, где все данные на листе принадлежат одному и тому же классу.

3. min_samples_split: параметр min_samples_split указывает минимальное количество выборок, необходимых для разделения внутреннего конечного узла. Значение по умолчанию для этого параметра - 2, что означает, что внутренний узел должен иметь как минимум две выборки, прежде чем его можно будет разделить для получения более конкретной классификации.

4. min_samples_leaf: Параметр min_samples_leaf указывает минимальное количество выборок, которое требуется для конечного узла. Значение по умолчанию для этого параметра - 1, что означает, что каждый лист должен иметь как минимум 1 образец, который он классифицирует.

Дополнительную документацию по гиперпараметрам RandomForestClassifier () можно найти здесь.

Как настроить гиперпараметры?

Гиперпараметры можно настроить вручную при вызове функции, создающей модель.

forest = RandomForestClassifier(random_state = 1, n_estimators = 10, min_samples_split = 1)

Как выбрать гиперпараметры для настройки?

Перед тем, как начать настройку гиперпараметров, я выполнил разделение на тренировку / тест 80/20 на моих данных. Различные гиперпараметры будут протестированы на обучающем наборе, и после выбора оптимизированных значений параметров модель будет построена с использованием выбранных параметров и набора для тестирования, а затем будет протестирована на обучающем наборе, чтобы увидеть, насколько точна модель. умеет классифицировать сорта вина.

forest = RandomForestClassifier(random_state = 1)
modelF = forest.fit(x_train, y_train)
y_predF = modelF.predict(x_test)

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

Кривые проверки

Есть несколько разных способов выбрать гиперпараметры для настройки вашей модели. Хороший способ визуальной проверки потенциально оптимизированных значений гиперпараметров модели - это проверка кривой. Кривая проверки может быть нанесена на график, чтобы показать, насколько хорошо модель работает с разными значениями одного гиперпараметра. Следующий код был запущен для создания четырех проверочных кривых, показанных здесь, со значениями param_name и param_range, скорректированными соответственно для каждого из четырех параметров, которые мы исследуем.

train_scoreNum, test_scoreNum = validation_curve(
                                RandomForestClassifier(),
                                X = x_train, y = y_train, 
                                param_name = 'n_estimators', 
                                param_range = num_est, cv = 3)

Эта кривая проверки была создана со значениями [100, 300, 500, 750, 800, 1200] в качестве различных значений, которые должны быть протестированы для n_estimators. На этом изображении мы видим, что при тестировании значений наилучшее значение оказывается равным 750. Важно отметить, что, несмотря на большую разницу между оценкой обучения и перекрестной проверки, обучающая выборка имела средняя точность 100% для каждой из трех перекрестных проверок, а набор перекрестной проверки имел точность от 99,5% до 99,6% для всех значений n_estimators, что показывает, что эта модель очень точна независимо от количества оценок использовал.

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

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

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

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

forestVC = RandomForestClassifier(random_state = 1,
                                  n_estimators = 750,
                                  max_depth = 15, 
                                  min_samples_split = 5,  min_samples_leaf = 1) 
modelVC = forestVC.fit(x_train, y_train) 
y_predVC = modelVC.predict(x_test)

Эта модель дала точность 0,993076923077, что было более точным, чем наша первая модель, но только на 0,0015.

Исчерпывающий поиск по сетке

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

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

n_estimators = [100, 300, 500, 800, 1200]
max_depth = [5, 8, 15, 25, 30]
min_samples_split = [2, 5, 10, 15, 100]
min_samples_leaf = [1, 2, 5, 10] 

hyperF = dict(n_estimators = n_estimators, max_depth = max_depth,  
              min_samples_split = min_samples_split, 
             min_samples_leaf = min_samples_leaf)

gridF = GridSearchCV(forest, hyperF, cv = 3, verbose = 1, 
                      n_jobs = -1)
bestF = gridF.fit(x_train, y_train)

Для выполнения кода, показанного здесь, потребовалось более 25 минут, но были выбраны гиперпараметры, которые имели 100% точность при прогнозировании обучающих моделей. В результате получены следующие «лучшие» гиперпараметры: max_depth = 15, min_samples_leaf = 1, min_samples_split = 2, n_estimators = 500.

И снова был запущен новый классификатор случайного леса с использованием этих значений в качестве входных параметров гиперпараметров.

forestOpt = RandomForestClassifier(random_state = 1, max_depth = 15,     n_estimators = 500, min_samples_split = 2, min_samples_leaf = 1)
                                   
modelOpt = forestOpt.fit(x_train, y_train)
y_pred = modelOpt.predict(x_test)

Эта модель также дала точность 0,993076923077 при тестировании с использованием набора для тестирования.

Стоит ли настраивать гиперпараметры?

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

Самое главное, что стоит отметить, - это общее улучшение точности. Гиперпараметры, выбранные на основе результатов поиска по сетке и кривой проверки, дали такую ​​же точность, когда модель была применена к нашему набору тестирования: 0,993076923077. Это улучшило точность нашей исходной модели при тестировании, установленном на 0,0015. Учитывая, что на выполнение исчерпывающего поиска по сетке по нашим 4 желаемым гиперпараметрам ушло более 25 минут, возможно, в данном случае это не стоило того времени. Кроме того, два из «оптимизированных» значений гиперпараметров, предоставленные нам нашим поиском по сетке, были такими же, как значения по умолчанию для этих параметров для классификатора случайного леса scikit-learn. Глядя на матрицы путаницы для каждой из двух оптимизированных моделей, мы видим, что обе привели к одинаковому количеству неверных прогнозов как для красных, так и для белых вин, как показано здесь:

Заключение

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

Ключевые термины / идеи: гиперпараметры, кривая проверки, исчерпывающий поиск по сетке, перекрестная проверка.