Рубрики
Без рубрики

Техника оптимизации гиперпараметра для повышения производительности модели обучения машины

Автор оригинала: Davis David.

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

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

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

Прежде чем определить оптимизацию HyperParameter, вам нужно понять, что является гиперпарамером.

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

Примером гиперпараметров в случайном алгоритме леса является количество оценок ( n_EStimators ), максимальная глубина ( max_depth ) и критерий. Эти параметры являются Настраиваемый И может напрямую повлиять на то, насколько хорошо моделирует поезда.

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

Этот процесс играет жизненно важную роль в точности прогнозирования алгоритма машинного обучения. Поэтому оптимизация гиперпараметра считается Wresidiese Часть моделей обучения на строительной машине.

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

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

Как оптимизировать гиперпараметры

Поиск сетки

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

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

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

Случайный поиск

Этот метод работает немного по-другому: Случайные Комбинации значений гиперпараметров используются для поиска лучшего решения для созданной модели.

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

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

Альтернативные методы оптимизации гиперпараметра

Теперь я познакомим вас с несколькими альтернативными и передовыми методами/методами оптимизации гиперпараметра. Они могут помочь вам получить лучшие параметры для данной модели.

Мы посмотрим на следующие методы:

  1. Гиперопт
  2. Scikit Оптимизация
  3. Optuna

Гиперопт

HyperOpt – это мощная библиотека Python для оптимизации гиперпараметра, разработанной Джеймсом Бергистром.

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

HyperOpt имеет четыре важных функция, которые вам нужно знать, чтобы запускать вашу первую оптимизацию.

Поиск пространства

HyperOpt имеет разные функции для указания диапазонов для входных параметров. Они называются стохастическими поисковыми пространствами. Наиболее распространенные варианты для поискового пространства являются:

  • HP.Choice (этикетка, варианты) – Это может быть использовано для категориальных параметров. Он возвращает один из вариантов, которые должны быть списком или кортеж. Пример: HP.Choice («критерий», [«Джини», «энтропия»,])
  • HP.randint (этикетка, верхний) – Это может быть использовано для целочисленных параметров. Он возвращает случайное целое число в диапазоне (0, верхних). Пример: hp.randint ("max_features", 50)
  • HP.uniform (этикетка, низкая, высокая) – Это возвращает значение равномерно между Низкий и Высокий Отказ Пример: HP.Uniform («MAX_LEAF_NODES», 1,10)

Другой вариант, который вы можете использовать:

  • HP.NOMMAL (метка, му, сигма) -Это возвращает реальное значение, которое обычно распространяется со средним SU и стандартным отклонением Sigma
  • hp.qnormal (метка, мю, сигма, q) – Это возвращает значение, как раунд (нормальный (MU, SIGMA)/Q) * Q
  • HP.Lognormal (этикетка, му, сигма) – Это возвращает значение, нарисованное в соответствии с EXP (нормальный (MU, SIGMA))
  • hp.qlognormal (этикетка, му, сигма, q) – Это возвращает значение, как раунд (Exp (нормальный (MU, SIGMA))/Q) * Q

Вы можете узнать больше об вариантах поиска SPARY здесь.

Просто быстрое примечание: каждое оптимизируемое стохастическое выражение имеет метку (например, n_eStimators) в качестве первого аргумента. Эти этикетки используются для возврата вариантов параметра к абонеру во время процесса оптимизации.

Объективная функция

Это функция минимизации, которая получает значения гиперпараметра в качестве входа из пространства поиска и возвращает потери.

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

Оптимизатор решит, какие значения снова проверить и повторяют. Вы узнаете, как создавать объективные функции в практическом примере.

фамилия

Функция FMIN – это функция оптимизации, которая итерации на различные наборы алгоритмов и их гиперператеров, а затем минимизирует объективную функцию.

FMIN принимает пять входов, которые являются:

  • Объективная функция для минимизации
  • В определенном пространстве поиска
  • Алгоритм поиска для использования, такого как случайные поиски, TPE (оценщики деревьев Parzen) и адаптивный TPE Примечание: HyperOpt.rand.suggest и HyperOpt.tpe.suggest Обеспечить логику для последовательного поиска гиперпараметра пространства
  • Максимальное количество оценок
  • И объект испытаний (необязательно)

Пример:

from hyperopt import fmin, tpe, hp,Trials

trials = Trials()

best = fmin(fn=lambda x: x ** 2,
    		space= hp.uniform('x', -10, 10),
    		algo=tpe.suggest,
    		max_evals=50,
    		trials = trials)

print(best)

Испытания объекта

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

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

from hyperopt import Trials 

trials = Trials()

Теперь, когда вы понимаете важные особенности HyperOpt, посмотрим, как его использовать. Вы будете следовать этим шагам:

  • Инициализировать пространство, над которым для поиска
  • Определите объективную функцию
  • Выберите алгоритм поиска для использования
  • Запустите функцию HyperOpt
  • Проанализируйте выходы оценки, хранящиеся в Испытания объекта

Гиперпот на практике

В этом практическом примере мы будем использовать Набор мобильных цен. Наша задача состоит в том, чтобы создать модель, которая будет предсказать, как высокая цена мобильного устройства будет: 0 ( Низкая стоимость ), 1 ( средняя стоимость ), 2 ( Высокая стоимость ) или 3 ( очень высокая стоимость ).

Установить HyperOpt.

Вы можете установить HyperOpt из Pypi, запустив эту команду:

pip install hyperopt

Затем импортируйте следующие важные пакеты, в том числе HyperOpt:

# import packages 
import numpy as np 
import pandas as pd 
from sklearn.ensemble import RandomForestClassifier 
from sklearn import metrics
from sklearn.model_selection import cross_val_score
from sklearn.preprocessing import StandardScaler 
from hyperopt import tpe, hp, fmin, STATUS_OK,Trials
from hyperopt.pyll.base import scope

import warnings
warnings.filterwarnings("ignore")

Набор данных

Давайте загрузим набор данных из каталога данных. Чтобы получить больше информации о наборе данных, читать об этом здесь.

# load data 
data = pd.read_csv("data/mobile_price_data.csv")

Проверьте первые пять рядов набора данных:

#read data 
data.head()

Как видите, в нашем наборе данных у нас есть разные функции с численными значениями.

Давайте посмотрим на форму набора данных.

#show shape
data.shape

Мы получаем следующее:

(2000, 21)

В этом наборе данных у нас есть 2000 строк и 21 колонны Отказ Теперь давайте понять список функций, которые у нас есть в этом наборе данных.

#show list of columns 
list(data.columns)

[«Battery_Power», «Blue», «Clock_speed», «dual_sim ‘,’ fc ‘,’ four_g ‘,’ int_memory ‘,’ m_dep ‘,’ mobile_wt ‘,’ n_cores ‘,’ pc ‘,’ px_height ‘ px_width ‘, «Ram», «SC_H», «SC_W», «Talk_Time», «THRE_G», «TOUCK_SCREEN», «WiFi», «Price_range»]

Вы можете найти значение каждого имени столбца здесь Отказ

Разделение набора данных в целевую функцию и независимые функции

Это проблема классификации. Таким образом, мы теперь будем разделить целевую функцию и независимые функции из набора данных. Наша целевая функция – Price_range Отказ

# split data into features and target 
X = data.drop("price_range", axis=1).values 
y = data.price_range.values

Предварительная обработка данных набора

Далее мы стандартизируем независимые функции, используя Стандартный планшет Метод от Scikit – учиться.

# standardize the feature variables 
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

Определите пространство параметра для оптимизации

Мы будем использовать три гиперпараметра Случайный алгоритм леса : n_estimators, max_depth, и Критерий Отказ

space = {
    "n_estimators": hp.choice("n_estimators", [100, 200, 300, 400,500,600]),
    "max_depth": hp.quniform("max_depth", 1, 15,1),
    "criterion": hp.choice("criterion", ["gini", "entropy"]),
}

Мы установили разные значения в вышеуказанных выбранных гиперпараметрах. Теперь мы определим объективную функцию.

Определение функции для минимизации (объективная функция)

Наша функция, которую мы хотим минимизировать, называется hyperparamter_tuning Отказ Алгоритм классификации для оптимизации его гиперпараметра – Случайное лес Отказ

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

# define objective function

def hyperparameter_tuning(params):
    clf = RandomForestClassifier(**params,n_jobs=-1)
    acc = cross_val_score(clf, X_scaled, y,scoring="accuracy").mean()
    return {"loss": -acc, "status": STATUS_OK}

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

Тонкая настройка модели

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

# Initialize trials object
trials = Trials()

best = fmin(
    fn=hyperparameter_tuning,
    space = space, 
    algo=tpe.suggest, 
    max_evals=100, 
    trials=trials
)

print("Best: {}".format(best))

100% | ████████████████████████████████████████████████████████ ██████████ |. 100/100 [10:30 <00:00, 6.30, 6.30)/Пробный, Лучший потери: -0.8915] Лучше всего: {«Критерий»: 1, «Max_Depth»: 11.0, «N_EStimators»: 2}.

После выполнения оптимизации HyperParamter потери – это – 0,8915 Отказ Это означает, что производительность модели имеет точность 89,15% Используя n_estimators ,, и В случайном лесном классификаторе.

Проанализируйте результаты, используя объект испытаний

Объект испытаний может помочь нам осматривать все значения возврата, которые были рассчитаны во время эксперимента.

(а) испытания. Это показывает список словарей, возвращаемых «объективным» во время поиска.

trials.results

[{«потеря»: -0.879000000000000001, «Статус»: «ОК»}, {«потеря»: -0.877, «Статус»: «ОК»}, {«потеря»: -0.768, «Состояние»: «ОК» }, {«Потеря»: -0.8205, «Состояние»: «ОК»}, {«потеря»: -0,872000000000000001, «Состояние»: «ОК»}, {«потеря»: -0.883, «Состояние»: ‘ОК ‘}, {«Потеря»: -0.855499999999999999999999999, «Статус»: «ОК»}, {«потеря»: -0.878999999999999, «Статус»: «ОК»}, {«потеря»: -0.595, «Состояние»:’ ОК’},…….]

(б) испытания. Это показывает список потерь (поплавок для каждого пробного исследования «ОК»).

trials.losses()

-0.8790000000000001, -0.877, -0.768, -0.8205, -0.872000000000000001, -0,8800000000001, -0,883, -0.855499999999999999999999999999999999999999999, -0.595, -0.8777000000000001, -0,877, ………]

(c) Trials.Statuseses () Это показывает список строк состояния.

trials.statuses()

[«ОК», «ОК», «ОК», «ОК», «ОК», «Хорошо», «ОК», «ОК», «ОК», «ОК», «ОК», «ОК» ОК, «ОК», «ОК», «ОК», «ОК», «ОК», «ОК», ……….]

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

Теперь, когда вы знаете, как реализовать HyperOpt, давайте узнаем вторую альтернативную методику оптимизации гиперпараметра Scikit-оптимизировать Отказ

Scikit-оптимизировать

Scikit-Optimize – это еще одна библиотека Python Python с открытым исходным кодом для оптимизации гиперпараметра. Он реализует несколько методов для последовательной оптимизации на основе модели.

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

Scikit-Optimize построен на вершине Scipy, Numpy и Scikit – учиться.

Scikit-Optimize имеет как минимум четыре важных функция, которые вам нужно знать, чтобы запускать вашу первую оптимизацию. Давайте сейчас посмотрим на них.

Космос

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

  • Реальный – Это размер поискового пространства, который может принимать любую реальную ценность. Вам нужно определить нижнюю границу и верхнюю границу, и оба включены. Пример: Реальный (низкий = 0,2, .9,)
  • Целое число – Это размер поискового пространства, который может принимать целочисленные значения. Пример: Целое число (низкое = 3 ,,)
  • Категорично – Это размер поискового пространства, который может принимать категорические значения. Пример: Категорично ("Джини", "Энтропия"], Имя = "Критерий")

Примечание. В каждом пространстве поиска вы должны определить имя гиперпараметра для оптимизации, используя Имя аргумент

Bayessearchcv.

Класс BayessearchCV предоставляет интерфейс, похожий на Gridsearchcv или RandomizedSearchCV Но он выполняет оптимизацию байесов на гиперпараметрах.

BayessearchCV реализует « Fit », а «Оценка » и другие общие методы, такие как прогнозировать (), predict_proba (), решение_function (), преобразование () и inverse_transform () Если они будут реализованы в использованном оценке.

В отличие от GridSearchCV, не все значения параметров опробоваются. Скорее фиксированное количество параметров параметров выбирается из указанных распределений. Количество параметров параметров, которые пробовали, дается N_ITR.

Обратите внимание, что Вы узнаете, как реализовать BayessearchCV в практическом примере ниже.

Объективная функция

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

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

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

Оптимизатор

Это функция, которая выполняет процесс оптимизации Cayesian HyperParamemeter. Функция оптимизации итерации на каждой модели и пространстве поиска для оптимизации, а затем минимизирует объективную функцию.

Существуют различные функции оптимизации, предоставляемые библиотекой Scikit-оптимизации, такие как:

  • dummy_minimize – Случайный поиск по равномерной выборке в пределах данных границ.
  • forest_minimize – последовательная оптимизация с использованием деревьев решений.
  • gbrt_minimize – последовательная оптимизация с использованием градиента повышенных деревьев.
  • gp_minimize – Оптимизация байесов с использованием гауссовских процессов. Примечание. Мы реализуем GP_Minimize в практическом примере ниже.

Другие функции, которые вы должны учиться, так как следует следующие:

Scikit – оптимизировать на практике

Теперь, когда вы знаете важные особенности Scikit-оптимизации, давайте посмотрим на практический пример. Мы будем использовать тот же набор набора данных Набор мобильных цен что мы использовали с гипероптом.

Установить Scikit-оптимизировать

Scikit-Optimize требует следующей версии Python и пакеты:

  • Python.6.
  • Numpy.13.3)
  • Scipy.19.1)
  • Джобликс.11)
  • Scikit-Learn.20.
  • matplotlib.0.0.

Вы можете установить последнюю версию с помощью этой команды:

pip install scikit-optimize

Затем импортируйте важные пакеты, в том числе Scikit-оптимизировать:

# import packages
import numpy as np
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from sklearn.model_selection import cross_val_score 
from sklearn.preprocessing import StandardScaler
from skopt.searchcv import BayesSearchCV
from skopt.space import Integer, Real, Categorical 
from skopt.utils import use_named_args
from skopt import gp_minimize

import warnings

warnings.filterwarnings("ignore")

Первый подход

В первом подходе мы будем использовать Bayessearchcv Для выполнения оптимизации гиперпараметра для случайного алгоритма леса.

Определите пространство поиска

Мы настроим следующие гиперпараметры случайной лесной модели:

  • n_eStimators – количество деревьев в лесу.
  • max_depth – максимальная глубина дерева.
  • Критерий – Функция для измерения качества раскола.
# define search space 
params = {
    "n_estimators": [100, 200, 300, 400],
    "max_depth": (1, 9),
    "criterion": ["gini", "entropy"],
}

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

Определите конфигурацию BayessearchCV

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

Класс может быть использован таким же образом, как Scikit-Survey (GRIDSearchcv и RandomizeSearchcv).

# define the search
search = BayesSearchCV(
    estimator=rf_classifier,
    search_spaces=params,
    n_jobs=1,
    cv=5,
    n_iter=30,
    scoring="accuracy",
    verbose=4,
    random_state=42
)

Тонкая настройка модели

Затем мы выполняем поиск, передавая предварительно обработанные функции и целевую функцию (Price_range).

# perform the search
search.fit(X_scaled,y)

Вы можете найти лучший результат, используя Best_score_ атрибут и лучшие параметры, используя Best_params_ атрибут из Поиск Отказ

# report the best result

print(search.best_score_)
print(search.best_params_)

Обратите внимание, что текущая версия Scikit-оптимизации (0.7.4) не совместима с последними версиями Scikit Survey (0.23.1 и 0.23.2). Поэтому, когда вы запускаете процесс оптимизации, используя этот подход, вы можете получить такие ошибки:

TypeError: object.__init__() takes exactly one argument (the instance to initialize)

Вы можете найти больше информации об этой ошибке в их учетной записи GitHub.

Я надеюсь, что они решат эту проблему несовместимости очень скоро.

Второй подход

Во втором подходе мы впервые определяем пространство поиска, используя космические методы, предоставленные Scikit-Optimize, которые являются Категорично и целое число.

# define the space of hyperparameters to search
search_space = list()
search_space.append(Categorical([100, 200, 300, 400], name='n_estimators'))
search_space.append(Categorical(['gini', 'entropy'], name='criterion'))
search_space.append(Integer(1, 9, name='max_depth'))

Мы установили разные значения в вышеуказанных выбранных гиперпараметрах. Затем мы определим объективную функцию.

Определение функции для минимизации (объективная функция)

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

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

# define the function used to evaluate a given configuration

@use_named_args(search_space)
def evaluate_model(**params):
    # configure the model with specific hyperparameters
    clf = RandomForestClassifier(**params, n_jobs=-1)
    acc = cross_val_score(clf, X_scaled, y, scoring="accuracy").mean()

use_named_args () Декоратор позволяет вашей объективной функции получать параметры в качестве аргументов ключевых слов. Это особенно удобно, когда вы хотите установить параметры оценки Scikit-Learn.

Помните, что Scikit-оптимизировать минимизировать функцию, поэтому я добавляю отрицательный знак в соотношение

Тонкая настройка модели

Наконец, мы прекрасно настроим модель, используя gp_minimize Метод (он использует на основе Gaussian на основе процесса оптимизации) от Scikit-оптимизации. Затем мы распечатаем лучшие потери с его значениями гиперпараметра.

# perform optimization

result = gp_minimize(
    func=evaluate_model,
    dimensions=search_space,
    n_calls=30,
    random_state=42,
    verbose=True,
    n_jobs=1,
)

Выход: Итерация №: 1 началось. Оценка функции в случайной точке. Итерация №: 1 закончилась. Оценка сделана в случайной точке. Время, сделанное: 8.6910 Полученное значение функции: -0.8585 Текущий минимум: -0,8585 Итерация №: 2 началась. Оценка функции в случайной точке. Итерация №: 2 закончилась. Оценка сделана в случайной точке. Время, сделанное: 4.5096 Полученное значение функции: -0.7680 Текущий минимум: -0,8585 ………………….

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

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

# summarizing finding:

print('Best Accuracy: %.3f' % (result.fun)) 
print('Best Parameters: %s' % (result.x))
Best Accuracy: -0.882
Best Parameters: [300, 'entropy', 9]

После выполнения оптимизации HyperParameter потерю является -0,882 Отказ Это означает, что производительность модели имеет точность 88,2% Используя n_eStimators, max_depth, и В случайном лесном классификаторе.

Наш результат не сильно отличается от гиперопта в первой части (точность 89,15% ).

Распечатать значения функции

Вы можете распечатать все значения функций на каждой итерации, используя func_vals Атрибут от объекта Optimizeresult (результат).

print(result.func_vals)

Выход: Массив ([- 0,8665, -0.7765, -0.7485, -0,86, -0,872, -0.545, -0,81, -0.7725, -0.8115, -0,8705, -0.8685, -0,879, -0,816, -0,8815, – 0,8645, -0.8745, -0.867, -0,8785, -0,878, -0,878, -0,8785, -0.874, -0.875, -0.8785, -0.868, -0.8815, -0.877, -0,879, -0.8705, -0.8745 ]))

Участок сходимости следов

Мы можем использовать Plot_Convergence Метод от Scikit – оптимизировать, чтобы с участием одного или нескольких следов конвергенции. Нам просто нужно пройти объект Optimizeresult (результат) в методе Plot_Convergence.

# plot convergence 

from skopt.plots import plot_convergence

plot_convergence(result) 

Участок показывает функциональные значения на разных итерациях во время процесса оптимизации.

Теперь, когда вы знаете, как реализовать Scikit-оптимизировать, давайте узнаем третий и окончательный альтернативный метод оптимизации HyperParameter под названием Оптуна.

Optuna

Optuna – это еще один Python Python Python для оптимизации гиперпараметра, который использует байесовский метод для автоматизации пространства поиска гиперпараметров. Рамки были разработаны японской компанией AI под названием «Предпочтительные сети».

Optuna проще реализовать и использовать, чем HyperOpt. Вы также можете указать, как долго должен длиться процесс оптимизации.

Optuna имеет как минимум пять важных функций, которые вам нужно знать, чтобы запускать вашу первую оптимизацию.

Поисковые пространства

Optuna предоставляет различные варианты для всех типов гиперпараметра. Наиболее распространенные варианты выбора являются следующими:

  • Категорические параметры – использует Trials.suggest_categrical () метод. Вам необходимо предоставить имя параметра и его варианты.
  • Целые параметры использует Trials.suggest_int () метод. Вам необходимо предоставить имя параметра, низкое и высокое значение.
  • Параметры поплавок использует Trials.suggest_float () метод. Вам необходимо предоставить имя параметра, низкое и высокое значение.
  • Непрерывные параметры использует Trials.suggest_uniform () метод. Вам необходимо предоставить имя параметра, низкое и высокое значение.
  • Дискретные параметры использует Trials.suggest_discrete_uniform () метод. Вам необходимо предоставить имя параметра, низкое значение, высокое значение и шаг дискретизации.

Методы оптимизации (пробоотборники)

Optuna имеет разные способы выполнения процесса оптимизации гиперпараметра. Наиболее распространенными методами являются:

  • Гридсамплер Он использует поиск сетки. Испытания предлагают все комбинации параметров в данном пространстве поиска во время исследования.
  • RandomSampler Он использует случайную выборку. Этот пробоотборник основан на независимой выборке.
  • Tpesampler Он использует алгоритм TPE (Tree-Structured Parzen Parzen).
  • CMAESSAMPLER – Он использует алгоритм CMA-ES.

Объективная функция

Объективная функция работает так же, как в методах HyperOpt и Scikit-оптимизации. Единственное отличие состоит в том, что Optuna позволяет вам определять пространство поиска и целью в одной функции.

Пример:

def objective(trial):
    # Define the search space
    criterions = trial.suggest_categorical('criterion', ['gini', 'entropy'])
    max_depths = trial.suggest_int('max_depth', 1, 9, 1)
    n_estimators = trial.suggest_int('n_estimators', 100, 1000, 100)

    clf = sklearn.ensemble.RandomForestClassifier(n_estimators=n_estimators,
                                 criterion=criterions,
                                 max_depth=max_depths,
                                 n_jobs=-1)
                                 
    score = cross_val_score(clf, X_scaled, y, scoring="accuracy").mean()

    return score

(г) исследование

Исследование соответствует задаче оптимизации (набор испытаний). Если вам нужно запустить процесс оптимизации, вам необходимо создать объект исследования и передавать объективную функцию для метода, называемого Оптимизировать () и установить количество испытаний следующим образом:

study = optuna.create_study()
study.optimize(objective, n_trials=100)

create_study () Метод позволяет вам выбрать, хотите ли вы Максимизировать или минимизировать Ваша объективная функция.

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

Обратите внимание, что вы узнаете, как реализовать это в практическом примере ниже.

Визуализация

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

Вот некоторые из методов, которые вы можете использовать.

  • plot_contour () – Этот метод задает параметры отношения в качестве контурного участия в исследовании.
  • plot_intermidiate_values () Этот метод задает промежуточные значения всех испытаний в исследовании.
  • plot_optimization_history () Этот метод графикирует историю оптимизации всех испытаний в исследовании.
  • plot_param_imports () Этот метод графики гиперпараметрического значения и их ценностей.
  • plot_edf () Этот метод задает объективное значение EDF (эмпирическая функция распределения) исследования.

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

Оптуна на практике

Теперь, когда вы знаете важные особенности Optuna, в этом практическом примере мы будем использовать тот же набор данных ( DataSet мобильной цен ), который мы использовали в предыдущих двух методах выше.

Установить optuna

Вы можете установить последний выпуск с:

pip install optuna

Затем импортируйте важные пакеты, включая Optuna:

# import packages 
import numpy as np 
import pandas as pd 
from sklearn.ensemble import RandomForestClassifier 
from sklearn import metrics 
from sklearn.model_selection import cross_val_score 
from sklearn.preprocessing import StandardScaler 
import joblib 

import optuna 
from optuna.samplers import TPESampler


import warnings
warnings.filterwarnings("ignore")

Определите поисковое пространство и цель в одной функции

Как я объяснил выше, Optuna позволяет вам определить поисковое пространство и цель в одной функции.

Мы определим промежутки поиска для следующих гиперфераметров случайной лесной модели:

  • n_eStimators – количество деревьев в лесу.
  • max_depth – максимальная глубина дерева.
  • Критерий – Функция для измерения качества раскола.
# define the search space and the objecive function


def objective(trial):
    # Define the search space
    criterions = trial.suggest_categorical('criterion', ['gini', 'entropy'])
    max_depths = trial.suggest_int('max_depth', 1, 9, 1)
    n_estimators = trial.suggest_int('n_estimators', 100, 1000, 100)

    clf = RandomForestClassifier(n_estimators=n_estimators,
                                 criterion=criterions,
                                 max_depth=max_depths,
                                 n_jobs=-1)
    score = cross_val_score(clf, X_scaled, y, scoring="accuracy").mean()

    return score

Мы будем использовать trial.suggest_categrical () Метод определить пространство поиска для Критерий и Trial.suggest_int () для обоих max_depth и n_eStimators Отказ

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

Создать учебный объект

Затем мы создаем объект исследования, который соответствует задаче оптимизации. Create-Custrial () Метод позволяет нам предоставить название исследования, направление оптимизации ( максимизировать или минимизировать ), а метод оптимизации, который мы хотим использовать.

# create a study object 

study = optuna.create_study(study_name="randomForest_optimization",
                            direction="maximize",
                            sampler=TPESampler())

В нашем случае мы назвали наш учебный объект RandomForest_optimization Отказ Направление оптимизации – Максимизировать (что означает, что чем выше оценка, тем лучше) и метод оптимизации используется TPESAMPLER ().

Тонкая настройка модели

Чтобы запустить процесс оптимизации, нам нужно пройти объективную функцию и количество испытаний в Оптимизировать () Метод из исследуемого объекта, который мы создали.

Мы установили количество пробных испытаний 10 (но вы можете изменить номер, если вы хотите запустить больше испытаний).

# pass the objective function to method optimize()

study.optimize(objective, n_trials=10)

O выход:

Затем мы можем распечатать лучшую точность и значения выбранных используемых гиперпараметров.

Чтобы показать лучшие значения HyperParameters:

print(study.best_params)

Выход: {«критерий»: «энтропия», «MAX_DEPTH»: 8, «N_ESTIMATORS»: 700}

Показать лучший результат или точность:

print(study.best_value)

Выход: 0.871499999999999.

Наш лучший результат составляет около 87,15%.

История оптимизации участка

Мы можем использовать plot_optimization_history () Метод от oppuna, чтобы построить историю оптимизации всех испытаний в исследовании. Нам просто нужно пройти оптимизированный объект исследования в методе.

optuna.visualization.plot_optimization_history(study)

Участок показывает лучшие значения на разных испытаниях во время процесса оптимизации.

Участок гиперпараметрического имкументации

Optuna предоставляет метод под названием plot_param_imports () с участием гиперпараметрического значения. Нам просто нужно пройти оптимизированный объект исследования в методе.

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

Сохранить и загружать HyperParameter поиск

Вы можете сохранить и загружать HyperParameter поиска, используя Джобликс упаковка.

Во-первых, мы сохраним гиперпараметритр поиска в каталоге oppuna_searches.

# save your hyperparameter searches 

joblib.dump(study, 'optuna_searches/study.pkl')

Тогда, если вы хотите загрузить HyperParameter поиск из каталога Optuna_Searchs, вы можете использовать нагрузка () Метод от Joblib.

# load your hyperparameter searches

study = joblib.load('optuna_searches/study.pkl')

Обертывание

Поздравляем, вы доверяли это до конца статьи!

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

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

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

Вы можете скачать набор данных и все ноутбуки, используемые в этой статье здесь: https://github.com/davisy/hyperparameter-optimation-Techniques.

Если вы узнали что-то новое или наслаждались чтением этой статьи, пожалуйста, поделитесь этим, чтобы другие могли его увидеть. До этого увидимся в моей следующей статье!. Я также можно добраться в Twitter @Davis_mcdavid