Spec-Zone.ru › scikit-learn

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 оценщика: при «обучении» на наборе данных все возможные комбинации значений параметров оцениваются, и лучшая комбинация сохраняется.

Примеры

  • См. Вложенная против невложенной перекрестной проверки для примера поиска по сетке в цикле перекрестной проверки на наборе данных iris. Это наилучшая практика для оценки производительности модели с помощью поиска по сетке.
  • См. Пример конвейера для извлечения текстовых признаков и оценки для примера использования поиска по сетке, объединяющего параметры из извлекателя признаков текстовых документов (векторизатор n-грамм и трансформатор TF-IDF) с классификатором (здесь линейная SVM, обученная с помощью SGD с штрафом elastic net или L2) с помощью экземпляра Pipeline.
Дополнительные примеры
  • См. Вложенная против невложенной перекрестной проверки для примера поиска по сетке в цикле перекрестной проверки на наборе данных iris. Это наилучшая практика для оценки производительности модели с помощью поиска по сетке.
  • См. Демонстрация оценки по нескольким метрикам в 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 всегда приведет к более точному поиску.

Непрерывная случайная величина log-uniform — это непрерывная версия параметра с логарифмическим шагом. Например, чтобы указать эквивалент C из примера выше, можно использовать loguniform(1, 100) вместо [1, 10, 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. and Bengio, Y., Случайный поиск для оптимизации гиперпараметров, Журнал машинного обучения (2012)

3.2.3. Поиск оптимальных параметров с помощью последовательного удвоения

Scikit-learn также предоставляет оценщики HalvingGridSearchCV и HalvingRandomSearchCV, которые можно использовать для поиска параметрического пространства с помощью последовательного удвоения [1] [2]. Последовательное удвоение (SH) похоже на турнир среди кандидатов по сочетаниям параметров. SH — это итерационный процесс выбора, где все кандидаты (сочетания параметров) оцениваются с небольшим количеством ресурсов на первой итерации. Только некоторые из этих кандидатов выбираются для следующей итерации, которой будет выделено больше ресурсов. Для подбора параметров ресурс обычно представляет собой количество обучающих выборок, но это также может быть произвольный числовой параметр, например, n_estimators в случайном лесу.

Примечание

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

Как показано на рисунке ниже, только подмножество кандидатов «выживает» до последней итерации. Это кандидаты, которые последовательно занимали место среди кандидатов с наилучшими результатами на всех итерациях. На каждой итерации каждому кандидату выделяется всё больше ресурсов, здесь — количество выборок.

../_images/sphx_glr_plot_successive_halving_iterations_001.png

Мы здесь кратко описываем основные параметры, но каждый параметр и их взаимодействия описаны более подробно в разделе ниже. Параметр 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].

Но в зависимости от количества кандидатов, мы можем выполнить меньше итераций: если мы начнем с малого количества кандидатов, последняя итерация может использовать меньше 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 кандидатов:

n_resources_i

n_candidates_i

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 кандидатов: лучший кандидат — лучший из этих 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, с дополнительной информацией, связанной с процессом последовательного урезания.

Пример (усечённой) таблицы результатов:

итерация

n_resources

среднее_значение_теста

параметры

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.

Ссылки

[1]

K. Jamieson, A. Talwalkar, Non-stochastic Best Arm Identification and Hyperparameter Optimization, in proc. of Machine Learning Research, 2016.

[2]

L. Li, K. Jamieson, G. DeSalvo, A. Rostamizadeh, A. Talwalkar, Hyperband: A Novel Bandit-Based Approach to Hyperparameter Optimization, in Machine Learning Research 18, 2018.

3.2.4. Советы по поиску параметров

3.2.4.1. Указание целевого метрики

По умолчанию, поиск параметров использует функцию score оценщика для оценки набора параметров. Это метрики sklearn.metrics.accuracy_score для классификации и sklearn.metrics.r2_score для регрессии. Для некоторых приложений другие функции оценки более подходят (например, в случае несбалансированной классификации метрика точности часто неинформативна). Альтернативную функцию оценки можно указать с помощью параметра 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. Перекрёстная проверка, специфичная для модели

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

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

Вот список таких моделей:

linear_model.ElasticNetCV(*[, l1_ratio, ...])

Модель упругой сети с итеративной подгонкой вдоль пути регуляризации.

linear_model.LarsCV(*[, fit_intercept, ...])

Модель регрессии наименьших углов с перекрёстной проверкой.

linear_model.LassoCV(*[, eps, n_alphas, ...])

Линейная модель Лассо с итеративной подгонкой вдоль пути регуляризации.

linear_model.LassoLarsCV(*[, fit_intercept, ...])

Модель Лассо с перекрёстной проверкой, использующая алгоритм LARS.

linear_model.LogisticRegressionCV(*[, Cs, ...])

Классификатор логистической регрессии с перекрёстной проверкой (также известный как logit, MaxEnt).

linear_model.MultiTaskElasticNetCV(*[, ...])

Многозадачная упругая сеть L1/L2 с встроенной перекрёстной проверкой.

linear_model.MultiTaskLassoCV(*[, eps, ...])

Многозадачная модель Лассо, обученная с использованием смешанной нормы L1/L2 в качестве регуляризатора.

linear_model.OrthogonalMatchingPursuitCV(*)

Модель ортогонального подбора с перекрёстной проверкой (OMP).

linear_model.RidgeCV([alphas, ...])

Регрессия Риджа со встроенной перекрёстной проверкой.

linear_model.RidgeClassifierCV([alphas, ...])

Классификатор Риджа со встроенной перекрёстной проверкой.

3.2.5.2. Критерий информации

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

Вот список моделей, которые могут использовать критерий Акаике (AIC) или байесовский критерий информации (BIC) для автоматического выбора модели:

linear_model.LassoLarsIC([criterion, ...])

Модель Лассо, подобранная с помощью LARS, используя BIC или AIC для выбора модели.

3.2.5.3. Оценки вне выборки

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

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

В настоящее время это реализовано в следующих классах:

ensemble.RandomForestClassifier([...])

Классификатор случайного леса.

ensemble.RandomForestRegressor([...])

Регрессор случайного леса.

ensemble.ExtraTreesClassifier([...])

Классификатор дополнительных деревьев.

ensemble.ExtraTreesRegressor([n_estimators, ...])

Регрессор дополнительных деревьев.

ensemble.GradientBoostingClassifier(*[, ...])

Градиентный бустинг для классификации.

ensemble.GradientBoostingRegressor(*[, ...])

Градиентный бустинг для регрессии.

© 2007–2025 The scikit-learn developers
Licensed under the 3-clause BSD License.
https://scikit-learn.org/1.6/modules/grid_search.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API