3.2. Настройка гиперпараметров оценивателя
Гиперпараметры — это параметры, которые не обучаются непосредственно в оценивателях. В scikit-learn они передаются в качестве аргументов конструкторам классов оценивателей. Типичные примеры: C, kernel и gamma для классификатора опорных векторов, alpha для Lasso и т. д.
Можно и рекомендуется искать в пространстве гиперпараметров значения, обеспечивающие наилучшую оценку при перекрёстной проверке.
Таким образом можно оптимизировать любой параметр, заданный при создании оценивателя. В частности, чтобы узнать названия и текущие значения всех параметров заданного оценивателя, используйте:
estimator.get_params()
Поиск включает в себя:
- оцениватель (регрессор или классификатор, например
sklearn.svm.SVC()); - пространство параметров;
- метод поиска или выборки кандидатов;
- схему перекрёстной проверки; и
- функцию оценки.
В scikit-learn предусмотрены два универсальных подхода к поиску параметров: для заданных значений GridSearchCV исчерпывающе перебирает все комбинации параметров, а RandomizedSearchCV может выбрать заданное число кандидатов из пространства параметров с указанным распределением. У обоих инструментов есть аналоги с последовательным отсечением — HalvingGridSearchCV и HalvingRandomSearchCV, — которые могут значительно быстрее находить удачную комбинацию параметров.
После описания этих инструментов мы рассмотрим рекомендации по применению этих подходов. Для некоторых моделей предусмотрены специализированные эффективные стратегии поиска параметров, описанные в разделе Альтернативы исчерпывающему поиску параметров.
Обратите внимание, что обычно лишь небольшое подмножество параметров может существенно влиять на точность прогнозирования или вычислительную производительность модели, тогда как остальные можно оставить со значениями по умолчанию. Рекомендуется ознакомиться со строкой документации класса оценивателя, чтобы лучше понять ожидаемое поведение параметров, при необходимости изучив приведённые в ней ссылки на литературу.
3.2.1. Исчерпывающий поиск по сетке
Поиск по сетке, реализованный в GridSearchCV, исчерпывающе формирует кандидатов из сетки значений параметров, заданной параметром param_grid. Например, следующий param_grid:
param_grid = [
{'C': [1, 10, 100, 1000], 'kernel': ['linear']},
{'C': [1, 10, 100, 1000], 'gamma': [0.001, 0.0001], 'kernel': ['rbf']},
]
задаёт поиск по двум сеткам: первая использует линейное ядро и значения C из [1, 10, 100, 1000], а вторая — ядро RBF и декартово произведение значений C из [1, 10, 100, 1000] и значений gamma из [0.001, 0.0001].
Экземпляр GridSearchCV реализует стандартный API оценивателя: при «обучении» на наборе данных оцениваются все возможные комбинации значений параметров и сохраняется наилучшая комбинация.
Примеры
- В примере Вложенная и невложенная перекрёстная проверка показан поиск по сетке внутри цикла перекрёстной проверки на наборе данных ирисов. Это рекомендуемый способ оценки производительности модели с помощью поиска по сетке.
- В примере Пример конвейера для извлечения признаков из текста и оценки показано, как связать параметры извлекателя признаков из текстовых документов (векторизатора подсчёта n-грамм и преобразователя TF-IDF) с классификатором (здесь — линейной SVM, обученной с помощью SGD с штрафом elastic net или L2), используя экземпляр
Pipeline.
Дополнительные примеры
- В примере Вложенная и невложенная перекрёстная проверка показан поиск по сетке внутри цикла перекрёстной проверки на наборе данных ирисов. Это рекомендуемый способ оценки производительности модели с помощью поиска по сетке.
- В примере Пример оценки по нескольким метрикам в cross_val_score и GridSearchCV показано, как использовать
GridSearchCVдля одновременной оценки по нескольким метрикам. - В примере Компромисс между сложностью модели и оценкой при перекрёстной проверке показано использование интерфейса
refit=callableвGridSearchCV. Пример показывает, как этот интерфейс позволяет гибко определять «наилучший» оцениватель. Этот интерфейс также можно использовать для оценки по нескольким метрикам. - В примере Статистическое сравнение моделей с помощью поиска по сетке показано, как выполнить статистическое сравнение результатов
GridSearchCV.
3.2.2. Случайная оптимизация параметров
Хотя использование сетки значений параметров сейчас является наиболее распространённым методом оптимизации параметров, другие методы поиска обладают более привлекательными свойствами. RandomizedSearchCV реализует случайный поиск параметров, при котором каждое значение выбирается из распределения возможных значений параметров. По сравнению с исчерпывающим поиском это даёт два основных преимущества:
- Бюджет поиска можно задавать независимо от числа параметров и возможных значений.
- Добавление параметров, не влияющих на производительность, не снижает эффективность.
Правила выборки параметров задаются с помощью словаря, очень похожего на используемый для задания параметров в GridSearchCV. Кроме того, вычислительный бюджет — число выбранных кандидатов или итераций выборки — задаётся параметром n_iter. Для каждого параметра можно задать либо распределение возможных значений, либо список дискретных вариантов (из которых значения будут выбираться равномерно):
{'C': scipy.stats.expon(scale=100), 'gamma': scipy.stats.expon(scale=.1),
'kernel': ['rbf'], 'class_weight':['balanced', None]}
В этом примере используется модуль scipy.stats, содержащий множество полезных распределений для выборки параметров, таких как expon, gamma, uniform, loguniform или randint.
В принципе, можно передать любую функцию, предоставляющую метод rvs (выборка случайной величины) для получения значения. При последовательных вызовах функция rvs должна возвращать независимые случайные выборки из возможных значений параметров.
Предупреждение
Распределения в scipy.stats до версии scipy 0.16 не позволяют задавать состояние генератора случайных чисел. Вместо этого они используют глобальное состояние генератора случайных чисел numpy, которое можно инициализировать с помощью np.random.seed или задать через np.random.set_state. Однако начиная с версии scikit-learn 0.18 модуль sklearn.model_selection задаёт состояние генератора случайных чисел, переданное пользователем, если также доступна scipy версии 0.16 или выше.
Для непрерывных параметров, таких как C выше, важно задавать непрерывное распределение, чтобы в полной мере использовать преимущества рандомизации. В этом случае увеличение n_iter всегда будет обеспечивать более тщательный поиск.
Непрерывная логарифмически равномерная случайная величина — это непрерывный аналог параметра с логарифмической шкалой. Например, чтобы задать аналог C из предыдущего примера, вместо [1, 10, 100] можно использовать loguniform(1, 100).
Как и в приведённом выше примере поиска по сетке, можно задать непрерывную случайную величину с логарифмически равномерным распределением между 1e0 и 1e3:
from sklearn.utils.fixes import loguniform
{'C': loguniform(1e0, 1e3),
'gamma': loguniform(1e-4, 1e-3),
'kernel': ['rbf'],
'class_weight':['balanced', None]}
Примеры
- Сравнение случайного поиска и поиска по сетке при подборе гиперпараметров — сравнение применения и эффективности случайного поиска и поиска по сетке.
Литература
- Bergstra, J. и Bengio, Y., Случайный поиск для оптимизации гиперпараметров, The Journal of Machine Learning Research (2012)
3.2.3. Поиск оптимальных параметров с помощью последовательного деления пополам
Scikit-learn также предоставляет оценки HalvingGridSearchCV и HalvingRandomSearchCV, которые можно использовать для поиска в пространстве параметров с помощью метода последовательного деления пополам [1] [2]. Последовательное деление пополам (SH) похоже на турнир между кандидатами — комбинациями параметров. SH представляет собой итерационный процесс отбора, в котором на первой итерации все кандидаты (комбинации параметров) оцениваются с небольшим количеством ресурсов. Лишь некоторые из этих кандидатов выбираются для следующей итерации, на которой им выделяется больше ресурсов. При подборе параметров ресурсом обычно служит количество обучающих примеров, но это также может быть произвольный числовой параметр, например n_estimators в случайном лесе.
Примечание
Выбранное увеличение объёма ресурсов должно быть достаточно большим, чтобы обеспечить значительное улучшение оценок с учётом статистической значимости.
Как показано на рисунке ниже, до последней итерации «доживает» лишь часть кандидатов. Это кандидаты, которые на всех итерациях неизменно входили в число лучших по оценкам. На каждой следующей итерации каждому кандидату выделяется всё больше ресурсов — в данном случае увеличивается число примеров.
Кратко опишем основные параметры. Подробное описание каждого параметра и их взаимодействий приведено в раскрывающемся разделе ниже. Параметр factor (> 1) определяет темп роста объёма ресурсов и темп уменьшения количества кандидатов. На каждой итерации объём ресурсов на одного кандидата умножается на factor, а количество кандидатов делится на тот же коэффициент. Наряду с resource и min_resources, параметр factor — важнейший параметр для управления поиском в нашей реализации, хотя обычно хорошо работает значение 3. Параметр factor фактически определяет количество итераций в HalvingGridSearchCV, а также количество кандидатов (по умолчанию) и итераций в HalvingRandomSearchCV. Параметр aggressive_elimination=True также можно использовать, если доступных ресурсов мало. Дополнительные возможности управления доступны при настройке параметра min_resources.
Эти оценки пока имеют статус экспериментальных: их прогнозы и API могут измениться без цикла устаревания. Чтобы использовать их, необходимо явно импортировать enable_halving_search_cv:
>>> from sklearn.experimental import enable_halving_search_cv # noqa >>> from sklearn.model_selection import HalvingGridSearchCV >>> from sklearn.model_selection import HalvingRandomSearchCV
Примеры
- Сравнение поиска по сетке и последовательного деления пополам
- Итерации последовательного деления пополам
В разделах ниже подробно рассматриваются технические аспекты последовательного деления пополам.
Выбор min_resources и количества кандидатов
Помимо factor, на поведение поиска методом последовательного деления пополам влияют два основных параметра: параметр min_resources и количество оцениваемых кандидатов (или комбинаций параметров). min_resources — это объём ресурсов, выделяемых каждому кандидату на первой итерации. Количество кандидатов задаётся напрямую в HalvingRandomSearchCV и определяется параметром param_grid в HalvingGridSearchCV.
Рассмотрим случай, когда ресурсом является количество примеров и у нас есть 1000 примеров. Теоретически при min_resources=10 и factor=2 мы можем выполнить не более 7 итераций со следующим количеством примеров: [10, 20, 40, 80, 160, 320, 640].
Однако в зависимости от количества кандидатов мы можем выполнить менее 7 итераций: если начать с небольшого количества кандидатов, на последней итерации может использоваться менее 640 примеров, то есть не все доступные ресурсы (примеры) будут задействованы. Например, если начать с 5 кандидатов, достаточно всего 2 итераций: на первой — 5 кандидатов, затем на второй — 5 // 2 = 2 кандидата, после чего мы узнаем, какой кандидат работает лучше всего (поэтому третья итерация не нужна). Мы использовали бы не более 20 примеров, что было бы расточительно, поскольку в нашем распоряжении есть 1000 примеров. С другой стороны, если начать с большого количества кандидатов, на последней итерации их может остаться много, что не всегда оптимально: это означает, что многие кандидаты будут оцениваться с использованием всех ресурсов, и процедура фактически сведётся к стандартному поиску.
В случае HalvingRandomSearchCV количество кандидатов по умолчанию задаётся таким образом, чтобы на последней итерации использовалось как можно больше доступных ресурсов. Для HalvingGridSearchCV количество кандидатов определяется параметром param_grid. Изменение значения min_resources повлияет на возможное количество итераций и, как следствие, также скажется на оптимальном количестве кандидатов.
При выборе min_resources также следует учитывать, легко ли отличить хорошие кандидаты от плохих при небольшом объёме ресурсов. Например, если для различения хороших и плохих параметров требуется много примеров, рекомендуется высокое значение min_resources. С другой стороны, если различие очевидно даже при небольшом количестве примеров, может быть предпочтительно низкое значение min_resources, поскольку это ускорит вычисления.
Обратите внимание: в приведённом выше примере на последней итерации не используется максимально возможный объём ресурсов: доступно 1000 примеров, но используется не более 640. По умолчанию и HalvingRandomSearchCV, и HalvingGridSearchCV стараются использовать на последней итерации как можно больше ресурсов при условии, что их объём должен быть кратен и min_resources, и factor (это условие станет понятным в следующем разделе). HalvingRandomSearchCV достигает этого, выбирая нужное количество кандидатов, а HalvingGridSearchCV — правильно задавая min_resources.
Объём ресурсов и количество кандидатов на каждой итерации
На каждой итерации i каждому кандидату выделяется определённый объём ресурсов, который мы обозначим n_resources_i. Эта величина определяется параметрами factor и min_resources следующим образом (factor строго больше 1):
n_resources_i = factor**i * min_resources,
или, что эквивалентно:
n_resources_{i+1} = n_resources_i * factor
где min_resources == n_resources_0 — объём ресурсов, используемый на первой итерации. factor также определяет долю кандидатов, которые будут отобраны для следующей итерации:
n_candidates_i = n_candidates // (factor ** i)
или, что эквивалентно:
n_candidates_0 = n_candidates
n_candidates_{i+1} = n_candidates_i // factor
Таким образом, на первой итерации мы используем min_resources ресурсов n_candidates раз. На второй итерации мы используем min_resources *
factor ресурсов n_candidates // factor раз. На третьей итерации объём ресурсов на кандидата снова увеличивается, а количество кандидатов уменьшается. Этот процесс продолжается до тех пор, пока не будет достигнут максимальный объём ресурсов на кандидата или пока не будет найден лучший кандидат. Лучший кандидат определяется на той итерации, на которой оценивается не более factor кандидатов (пояснение см. ниже).
Рассмотрим пример с min_resources=3 и factor=2, начиная с 70 кандидатов:
|
|
|---|---|
3 (=min_resources) | 70 (=n_candidates) |
3 * 2 = 6 | 70 // 2 = 35 |
6 * 2 = 12 | 35 // 2 = 17 |
12 * 2 = 24 | 17 // 2 = 8 |
24 * 2 = 48 | 8 // 2 = 4 |
48 * 2 = 96 | 4 // 2 = 2 |
Можно заметить, что:
- процесс останавливается на первой итерации, на которой оцениваются
factor=2кандидата: лучший кандидат выбирается из этих двух. Дополнительная итерация не требуется, поскольку на ней оценивался бы только один кандидат (а именно лучший, которого мы уже определили). Поэтому обычно мы хотим, чтобы на последней итерации оценивалось не болееfactorкандидатов. Если на последней итерации оценивается болееfactorкандидатов, она превращается в обычный поиск (как вRandomizedSearchCVилиGridSearchCV). - каждое значение
n_resources_iкратно иfactor, иmin_resources(что следует из приведённого выше определения).
Объём ресурсов, используемый на каждой итерации, можно найти в атрибуте n_resources_.
Выбор ресурса
По умолчанию ресурс определяется количеством образцов. То есть на каждой итерации для обучения будет использоваться всё больше образцов. Однако можно вручную указать параметр, используемый в качестве ресурса, с помощью параметра resource. Ниже приведён пример, в котором ресурс определяется количеством оценщиков случайного леса:
>>> from sklearn.datasets import make_classification
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.experimental import enable_halving_search_cv # noqa
>>> from sklearn.model_selection import HalvingGridSearchCV
>>> import pandas as pd
>>> param_grid = {'max_depth': [3, 5, 10],
... 'min_samples_split': [2, 5, 10]}
>>> base_estimator = RandomForestClassifier(random_state=0)
>>> X, y = make_classification(n_samples=1000, random_state=0)
>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5,
... factor=2, resource='n_estimators',
... max_resources=30).fit(X, y)
>>> sh.best_estimator_
RandomForestClassifier(max_depth=5, n_estimators=24, random_state=0)
Обратите внимание, что нельзя задать бюджет для параметра, входящего в сетку параметров.
Использование всех доступных ресурсов
Как упоминалось выше, количество ресурсов, используемых на каждой итерации, зависит от параметра min_resources. Если доступно много ресурсов, но поиск начинается с малого их количества, некоторые ресурсы могут быть потрачены впустую (то есть не использованы):
>>> from sklearn.datasets import make_classification
>>> from sklearn.svm import SVC
>>> from sklearn.experimental import enable_halving_search_cv # noqa
>>> from sklearn.model_selection import HalvingGridSearchCV
>>> import pandas as pd
>>> param_grid= {'kernel': ('linear', 'rbf'),
... 'C': [1, 10, 100]}
>>> base_estimator = SVC(gamma='scale')
>>> X, y = make_classification(n_samples=1000)
>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5,
... factor=2, min_resources=20).fit(X, y)
>>> sh.n_resources_
[20, 40, 80]
В процессе поиска будет использовано не более 80 ресурсов, тогда как максимальное количество доступных ресурсов равно n_samples=1000. Здесь имеем min_resources = r_0 = 20.
Для HalvingGridSearchCV параметр min_resources по умолчанию имеет значение ‘exhaust’. Это означает, что min_resources автоматически задаётся таким образом, чтобы на последней итерации можно было использовать максимально возможное количество ресурсов в пределах ограничения max_resources:
>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, ... factor=2, min_resources='exhaust').fit(X, y) >>> sh.n_resources_ [250, 500, 1000]
Здесь min_resources автоматически получил значение 250, благодаря чему на последней итерации используются все ресурсы. Точное используемое значение зависит от количества параметров-кандидатов, от max_resources и от factor.
Для HalvingRandomSearchCV исчерпать ресурсы можно двумя способами:
- задать
min_resources='exhaust', как и дляHalvingGridSearchCV; - задать
n_candidates='exhaust'.
Эти варианты взаимоисключающие: для использования min_resources='exhaust' необходимо знать количество кандидатов, а для n_candidates='exhaust', соответственно, требуется знать min_resources.
Как правило, использование всех доступных ресурсов позволяет получить лучший итоговый параметр-кандидат и требует немного больше времени.
3.2.3.1. Агрессивное исключение кандидатов
С помощью параметра aggressive_elimination можно заставить процесс поиска завершиться с количеством кандидатов на последней итерации меньше factor.
Пример кода для агрессивного исключения
В идеале на последней итерации нужно оценить factor кандидатов. Тогда останется только выбрать лучшего. Если доступных ресурсов мало по сравнению с количеством кандидатов, на последней итерации может потребоваться оценить более factor кандидатов:
>>> from sklearn.datasets import make_classification
>>> from sklearn.svm import SVC
>>> from sklearn.experimental import enable_halving_search_cv # noqa
>>> from sklearn.model_selection import HalvingGridSearchCV
>>> import pandas as pd
>>> param_grid = {'kernel': ('linear', 'rbf'),
... 'C': [1, 10, 100]}
>>> base_estimator = SVC(gamma='scale')
>>> X, y = make_classification(n_samples=1000)
>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5,
... factor=2, max_resources=40,
... aggressive_elimination=False).fit(X, y)
>>> sh.n_resources_
[20, 40]
>>> sh.n_candidates_
[6, 3]
Поскольку нельзя использовать более max_resources=40 ресурсов, процесс должен остановиться на второй итерации, на которой оценивается более factor=2 кандидатов.
При использовании aggressive_elimination процесс исключит необходимое количество кандидатов, используя min_resources ресурсов:
>>> sh = HalvingGridSearchCV(base_estimator, param_grid, cv=5, ... factor=2, ... max_resources=40, ... aggressive_elimination=True, ... ).fit(X, y) >>> sh.n_resources_ [20, 20, 40] >>> sh.n_candidates_ [6, 3, 2]
Обратите внимание, что на последней итерации остаются 2 кандидата: на первых итерациях было исключено достаточно кандидатов с использованием n_resources =
min_resources = 20.
3.2.3.2. Анализ результатов с помощью атрибута cv_results_
Атрибут cv_results_ содержит полезную информацию для анализа результатов поиска. Его можно преобразовать в фрейм данных pandas с помощью df =
pd.DataFrame(est.cv_results_). Атрибут cv_results_ классов HalvingGridSearchCV и HalvingRandomSearchCV аналогичен атрибуту классов GridSearchCV и RandomizedSearchCV, но содержит дополнительную информацию о процессе последовательного отсечения.
Пример (усечённого) выходного фрейма данных:
iter | n_resources | mean_test_score | params | |
|---|---|---|---|---|
0 | 0 | 125 | 0.983667 | {‘criterion’: ‘log_loss’, ‘max_depth’: None, ‘max_features’: 9, ‘min_samples_split’: 5} |
1 | 0 | 125 | 0.983667 | {‘criterion’: ‘gini’, ‘max_depth’: None, ‘max_features’: 8, ‘min_samples_split’: 7} |
2 | 0 | 125 | 0.983667 | {‘criterion’: ‘gini’, ‘max_depth’: None, ‘max_features’: 10, ‘min_samples_split’: 10} |
3 | 0 | 125 | 0.983667 | {‘criterion’: ‘log_loss’, ‘max_depth’: None, ‘max_features’: 6, ‘min_samples_split’: 6} |
… | … | … | … | … |
15 | 2 | 500 | 0.951958 | {‘criterion’: ‘log_loss’, ‘max_depth’: None, ‘max_features’: 9, ‘min_samples_split’: 10} |
16 | 2 | 500 | 0.947958 | {‘criterion’: ‘gini’, ‘max_depth’: None, ‘max_features’: 10, ‘min_samples_split’: 10} |
17 | 2 | 500 | 0.951958 | {‘criterion’: ‘gini’, ‘max_depth’: None, ‘max_features’: 10, ‘min_samples_split’: 4} |
18 | 3 | 1000 | 0.961009 | {‘criterion’: ‘log_loss’, ‘max_depth’: None, ‘max_features’: 9, ‘min_samples_split’: 10} |
19 | 3 | 1000 | 0.955989 | {‘criterion’: ‘gini’, ‘max_depth’: None, ‘max_features’: 10, ‘min_samples_split’: 4} |
Каждая строка соответствует определённой комбинации параметров (кандидату) и итерации. Итерация указана в столбце iter. Столбец n_resources показывает, сколько ресурсов было использовано.
В приведённом выше примере лучшая комбинация параметров — {'criterion':
'log_loss', 'max_depth': None, 'max_features': 9, 'min_samples_split': 10}, поскольку она достигла последней итерации (3) и получила наивысшую оценку: 0.96.
Ссылки
3.2.4. Советы по поиску параметров
3.2.4.1. Указание целевой метрики
По умолчанию при поиске параметров для оценки набора параметров используется функция score оценщика. Это sklearn.metrics.accuracy_score для классификации и sklearn.metrics.r2_score для регрессии. Для некоторых задач лучше подходят другие функции оценки (например, при несбалансированной классификации оценка accuracy часто неинформативна); рекомендации см. в разделе Какую функцию оценки следует использовать?. Альтернативную функцию оценки можно задать с помощью параметра scoring большинства средств поиска параметров; подробности см. в разделе Параметр scoring: определение правил оценки модели.
3.2.4.2. Указание нескольких метрик для оценки
GridSearchCV и RandomizedSearchCV позволяют указать несколько метрик для параметра scoring.
Оценку по нескольким метрикам можно задать как список строк с именами предопределённых оценок или как словарь, сопоставляющий имя оценщика с функцией оценки и/или именами предопределённых оценщиков. Подробности см. в разделе Использование оценки по нескольким метрикам.
При указании нескольких метрик параметру refit необходимо присвоить метрику (строку), для которой будет найден best_params_ и использован для построения best_estimator_ на всём наборе данных. Если повторное обучение модели не требуется, задайте refit=False. Если оставить для параметра refit значение по умолчанию None, при использовании нескольких метрик возникнет ошибка.
Пример использования см. в разделе Демонстрация оценки по нескольким метрикам с помощью cross_val_score и GridSearchCV.
HalvingRandomSearchCV и HalvingGridSearchCV не поддерживают оценку по нескольким метрикам.
3.2.4.3. Составные оценщики и пространства параметров
GridSearchCV и RandomizedSearchCV позволяют выполнять поиск по параметрам составных или вложенных оценщиков, таких как Pipeline, ColumnTransformer, VotingClassifier или CalibratedClassifierCV, используя специальный синтаксис <estimator>__<parameter>:
>>> from sklearn.model_selection import GridSearchCV
>>> from sklearn.calibration import CalibratedClassifierCV
>>> from sklearn.ensemble import RandomForestClassifier
>>> from sklearn.datasets import make_moons
>>> X, y = make_moons()
>>> calibrated_forest = CalibratedClassifierCV(
... estimator=RandomForestClassifier(n_estimators=10))
>>> param_grid = {
... 'estimator__max_depth': [2, 4, 6, 8]}
>>> search = GridSearchCV(calibrated_forest, param_grid, cv=5)
>>> search.fit(X, y)
GridSearchCV(cv=5,
estimator=CalibratedClassifierCV(estimator=RandomForestClassifier(n_estimators=10)),
param_grid={'estimator__max_depth': [2, 4, 6, 8]})
Здесь <estimator> — имя параметра вложенного оценщика, в данном случае estimator. Если метаоценщик создан как коллекция оценщиков, например pipeline.Pipeline, то <estimator> указывает на имя оценщика; см. раздел Доступ к вложенным параметрам. На практике уровней вложенности может быть несколько:
>>> from sklearn.pipeline import Pipeline
>>> from sklearn.feature_selection import SelectKBest
>>> pipe = Pipeline([
... ('select', SelectKBest()),
... ('model', calibrated_forest)])
>>> param_grid = {
... 'select__k': [1, 2],
... 'model__estimator__max_depth': [2, 4, 6, 8]}
>>> search = GridSearchCV(pipe, param_grid, cv=5).fit(X, y)
Сведения о поиске параметров в конвейерах см. в разделе Pipeline: объединение оценщиков в цепочку.
3.2.4.4. Выбор модели: разработка и оценка
Выбор модели путём оценки различных наборов параметров можно рассматривать как способ использовать размеченные данные для «обучения» параметров сетки.
При оценке полученной модели важно использовать отложенные образцы, которые не участвовали в поиске по сетке: рекомендуется разделить данные на набор для разработки (передаваемый экземпляру GridSearchCV) и набор для оценки, используемый для вычисления метрик качества.
Это можно сделать с помощью вспомогательной функции train_test_split.
3.2.4.5. Параллельное выполнение
Средства поиска параметров независимо оценивают каждую комбинацию параметров на каждом фолде данных. Вычисления можно выполнять параллельно, используя ключевое слово n_jobs=-1. Подробности см. в сигнатуре функции, а также в статье глоссария о параметре n_jobs.
3.2.4.6. Устойчивость к сбоям
Некоторые наборы параметров могут привести к сбою при fit одного или нескольких фолдов данных. По умолчанию оценка для таких наборов будет np.nan. Это поведение можно изменить: задайте error_score="raise", чтобы при неудачной подгонке возникало исключение, или, например, error_score=0, чтобы назначить другое значение оценки комбинациям параметров, для которых произошёл сбой.
3.2.5. Альтернативы полному перебору параметров
3.2.5.1. Кросс-валидация, специфичная для модели
Некоторые модели могут подгонять данные для диапазона значений некоторого параметра почти так же эффективно, как и для одного значения этого параметра. Эту особенность можно использовать для более эффективной кросс-валидации при выборе модели по данному параметру.
Чаще всего для такой стратегии подходит параметр, задающий силу регуляризации. В этом случае говорят, что для оценщика вычисляется траектория регуляризации.
Список таких моделей:
| Модель Elastic Net с итеративной подгонкой вдоль траектории регуляризации. |
| Модель регрессии методом наименьших углов с кросс-валидацией. |
| Линейная модель Lasso с итеративной подгонкой вдоль траектории регуляризации. |
| Lasso с кросс-валидацией и использованием алгоритма LARS. |
| Классификатор логистической регрессии с кросс-валидацией (также известный как logit, MaxEnt). |
| Многозадачный ElasticNet с нормой L1/L2 и встроенной кросс-валидацией. |
| Многозадачная модель Lasso с комбинированной нормой L1/L2 в качестве регуляризатора. |
Модель ортогонального жадного алгоритма с кросс-валидацией (OMP). | |
| Регрессия Ridge со встроенной кросс-валидацией. |
| Классификатор Ridge со встроенной кросс-валидацией. |
3.2.5.2. Информационный критерий
Некоторые модели позволяют получить аналитическую формулу оптимальной оценки параметра регуляризации на основе теории информации, вычислив одну траекторию регуляризации (вместо нескольких, необходимых при кросс-валидации).
Список моделей, использующих информационный критерий Акаике (AIC) или байесовский информационный критерий (BIC) для автоматического выбора модели:
| Модель Lasso, подогнанная с помощью Lars с использованием BIC или AIC для выбора модели. |
3.2.5.3. Оценки по объектам вне выборки
При использовании ансамблевых методов на основе бэггинга, то есть при создании новых обучающих наборов выборкой с возвращением, часть обучающего набора остаётся неиспользованной. Для каждого классификатора в ансамбле исключается своя часть обучающего набора.
Эту исключённую часть можно использовать для оценки ошибки обобщения без отдельной проверочной выборки. Такая оценка получается «бесплатно», поскольку дополнительные данные не требуются, и её можно использовать для выбора модели.
В настоящее время эта возможность реализована в следующих классах:
Классификатор на основе случайного леса. | |
Регрессор на основе случайного леса. | |
Классификатор на основе сверхслучайных деревьев. | |
| Регрессор на основе сверхслучайных деревьев. |
| Градиентный бустинг для классификации. |
| Градиентный бустинг для регрессии. |
© 2007–2026 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.9/modules/grid_search.html