Как правильнее подбирать параметры модели (RandomizedSearchCV,.GridSearchCV) или же вручную
Столкнулся с задачей подбора параметров для модели lightgbm, соответсвенно возникает вопрос, каким способом лучше всего их подбирать? Использовал метод RandomizedSearchCV, в течение 10 часов подбирались параметры, а толку от этого нет, точность такая же как и при ручном вводе параметров наугад. +/- смысл параметров понятен, какие отвечают за переобучение, какие за точность и скорость обучения, но вот не совсем понятно, если подбирать вручную то по одному или по парам, или еще варианты? Ниже превожу пример как я реализовал подбор параметров:
SEED = 4 NFOLDS = 2 kf = KFold(n_splits= NFOLDS, shuffle=False) parameters = < 'num_leaves': np.arange(100,500,100), 'min_child_weight': np.arange(0.01,1,0.01), 'feature_fraction': np.arange(0.1,0.4,0.01), 'bagging_fraction':np.arange(0.3,0.5,0.01), 'min_data_in_leaf': np.arange(100,1500,10), 'objective': ['binary'], 'max_depth': [-1], 'learning_rate':np.arange(0.001,0.02,0.001), "boosting_type": ['gbdt'], "bagging_seed": np.arange(10,42,5), "metric": ['auc'], "verbosity": [1], 'reg_alpha': np.arange(0.3,1,0.2), 'reg_lambda': np.arange(0.37,0.39,0.001), 'random_state': [425], 'n_estimators': [500], >model = lightgbm.LGBMClassifier() RSCV = RandomizedSearchCV(model,parameters,scoring='roc_auc',cv=kf.split(train),n_iter=30,verbose=50) RSCV.fit(train,label)
Отслеживать
149k 12 12 золотых знаков 59 59 серебряных знаков 132 132 бронзовых знака
sklearn.model_selection .RandomizedSearchCV¶
class sklearn.model_selection. RandomizedSearchCV ( estimator , param_distributions , * , n_iter = 10 , scoring = None , n_jobs = None , refit = True , cv = None , verbose = 0 , pre_dispatch = ‘2*n_jobs’ , random_state = None , error_score = nan , return_train_score = False ) [source] ¶
Randomized search on hyper parameters.
RandomizedSearchCV implements a “fit” and a “score” method. It also implements “score_samples”, “predict”, “predict_proba”, “decision_function”, “transform” and “inverse_transform” if they are implemented in the estimator used.
The parameters of the estimator used to apply these methods are optimized by cross-validated search over parameter settings.
In contrast to GridSearchCV, not all parameter values are tried out, but rather a fixed number of parameter settings is sampled from the specified distributions. The number of parameter settings that are tried is given by n_iter.
If all parameters are presented as a list, sampling without replacement is performed. If at least one parameter is given as a distribution, sampling with replacement is used. It is highly recommended to use continuous distributions for continuous parameters.
Read more in the User Guide .
New in version 0.14.
Parameters : estimator estimator object
An object of that type is instantiated for each grid point. This is assumed to implement the scikit-learn estimator interface. Either estimator needs to provide a score function, or scoring must be passed.
param_distributions dict or list of dicts
Dictionary with parameters names ( str ) as keys and distributions or lists of parameters to try. Distributions must provide a rvs method for sampling (such as those from scipy.stats.distributions). If a list is given, it is sampled uniformly. If a list of dicts is given, first a dict is sampled uniformly, and then a parameter is sampled using that dict as above.
n_iter int, default=10
Number of parameter settings that are sampled. n_iter trades off runtime vs quality of the solution.
scoring str, callable, list, tuple or dict, default=None
Strategy to evaluate the performance of the cross-validated model on the test set.
If scoring represents a single score, one can use:
- a single string (see The scoring parameter: defining model evaluation rules );
- a callable (see Defining your scoring strategy from metric functions ) that returns a single value.
If scoring represents multiple scores, one can use:
- a list or tuple of unique strings;
- a callable returning a dictionary where the keys are the metric names and the values are the metric scores;
- a dictionary with metric names as keys and callables a values.
If None, the estimator’s score method is used.
n_jobs int, default=None
Number of jobs to run in parallel. None means 1 unless in a joblib.parallel_backend context. -1 means using all processors. See Glossary for more details.
Changed in version v0.20: n_jobs default changed from 1 to None
refit bool, str, or callable, default=True
Refit an estimator using the best found parameters on the whole dataset.
For multiple metric evaluation, this needs to be a str denoting the scorer that would be used to find the best parameters for refitting the estimator at the end.
Where there are considerations other than maximum score in choosing a best estimator, refit can be set to a function which returns the selected best_index_ given the cv_results . In that case, the best_estimator_ and best_params_ will be set according to the returned best_index_ while the best_score_ attribute will not be available.
The refitted estimator is made available at the best_estimator_ attribute and permits using predict directly on this RandomizedSearchCV instance.
Also for multiple metric evaluation, the attributes best_index_ , best_score_ and best_params_ will only be available if refit is set and all of them will be determined w.r.t this specific scorer.
See scoring parameter to know more about multiple metric evaluation.
Changed in version 0.20: Support for callable added.
cv int, cross-validation generator or an iterable, default=None
Determines the cross-validation splitting strategy. Possible inputs for cv are:
- None, to use the default 5-fold cross validation,
- integer, to specify the number of folds in a (Stratified)KFold ,
- CV splitter ,
- An iterable yielding (train, test) splits as arrays of indices.
For integer/None inputs, if the estimator is a classifier and y is either binary or multiclass, StratifiedKFold is used. In all other cases, KFold is used. These splitters are instantiated with shuffle=False so the splits will be the same across calls.
Refer User Guide for the various cross-validation strategies that can be used here.
Changed in version 0.22: cv default value if None changed from 3-fold to 5-fold.
verbose int
Controls the verbosity: the higher, the more messages.
- >1 : the computation time for each fold and parameter candidate is displayed;
- >2 : the score is also displayed;
- >3 : the fold and candidate parameter indexes are also displayed together with the starting time of the computation.
Controls the number of jobs that get dispatched during parallel execution. Reducing this number can be useful to avoid an explosion of memory consumption when more jobs get dispatched than CPUs can process. This parameter can be:
- None, in which case all the jobs are immediately created and spawned. Use this for lightweight and fast-running jobs, to avoid delays due to on-demand spawning of the jobs
- An int, giving the exact number of total jobs that are spawned
- A str, giving an expression as a function of n_jobs, as in ‘2*n_jobs’
random_state int, RandomState instance or None, default=None
Pseudo random number generator state used for random uniform sampling from lists of possible values instead of scipy.stats distributions. Pass an int for reproducible output across multiple function calls. See Glossary .
error_score ‘raise’ or numeric, default=np.nan
Value to assign to the score if an error occurs in estimator fitting. If set to ‘raise’, the error is raised. If a numeric value is given, FitFailedWarning is raised. This parameter does not affect the refit step, which will always raise the error.
return_train_score bool, default=False
If False , the cv_results_ attribute will not include training scores. Computing training scores is used to get insights on how different parameter settings impact the overfitting/underfitting trade-off. However computing the scores on the training set can be computationally expensive and is not strictly required to select the parameters that yield the best generalization performance.
New in version 0.19.
Changed in version 0.21: Default value was changed from True to False
Attributes : cv_results_ dict of numpy (masked) ndarrays
A dict with keys as column headers and values as columns, that can be imported into a pandas DataFrame .
For instance the below given table
sklearn.model_selection.RandomizedSearchCV
classsklearn.model_selection.RandomizedSearchCV(оценщик, param_distributions, *, n_iter=10, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch=’2*n_jobs’, random_state=None, error_score=nan, return_train_score=False) [source]
Рандомизированный поиск по гиперпараметрам.
RandomizedSearchCV реализует метод «подгонки» и «оценки». Он также реализует «предсказание» “score_samples”,, «преобразование» “predict_proba”, “decision_function”, и “inverse_transform”, если они реализованы в используемом средстве оценки.
Параметры оценщика, используемого для применения этих методов, оптимизируются перекрестным поиском по настройкам параметров.
В отличие от GridSearchCV, проверяются не все значения параметров, а выбирается фиксированное количество значений параметров из указанных распределений. Количество пробных настроек параметров определяется n_iter..
Если все параметры представлены в виде списка, выполняется выборка без замены. Если хотя бы один параметр задан в виде распределения, используется выборка с замещением. Настоятельно рекомендуется использовать непрерывные распределения для непрерывных параметров.
Подробнее читайте в User Guide .
Новое в версии 0.14.
Parameters: estimatorestimator object
Объект этого типа создается для каждой точки сетки. Предполагается, что это реализует интерфейс оценщика scikit-learn. Либо оценщик должен предоставить функцию score , либо должен быть передан scoring .
param_distributionsdict или список диктов
Словарь с именами параметров ( str ) в виде ключей и распределений или списков параметров, которые нужно попробовать. Дистрибутивы должны предоставлять метод rvs для выборки (например, из scipy.stats.distributions).. Если задан список, он выбирается единообразно. Если дан список словарей, сначала выбирается единообразно словарь, а затем параметр выбирается с использованием этого словаря, как указано выше.
n_iterint, default=10
Количество выбранных настроек параметров. n_iter предлагает компромисс между временем выполнения и качеством решения.
scoringstr, вызываемый, список, кортеж или словарь, default=None
Стратегия оценки производительности модели с перекрестной проверкой на тестовом наборе.
Если scoring представляет одну оценку, можно использовать:
- одна строка (см. The scoring parameter: defining model evaluation rules );
- вызываемый объект (см. Defining your scoring strategy from metric functions ), который возвращает одно значение.
Если scoring представляет несколько оценок, можно использовать:
- список или кортеж уникальных строк;
- вызываемый объект, возвращающий словарь, где ключами являются имена метрик, а значениями являются оценки метрик;
- словарь с именами метрик в качестве ключей и вызываемыми значениями.
Если None, используется метод оценки оценщика.
n_jobsint, default=None
Количество заданий для параллельного выполнения. None означает 1, если только в контексте joblib.parallel_backend . -1 означает использование всех процессоров. Дополнительные сведения см. в Glossary .
Изменено в версии v0.20: n_jobs по умолчанию изменено с 1 на None
refitbool, str или вызываемый, default=True
Подберите оценщик, используя наилучшие найденные параметры для всего набора данных.
Для оценки нескольких метрик это должен быть str , обозначающий счетчик, который будет использоваться для поиска наилучших параметров для переоснащения оценщика в конце.
В тех случаях, когда при выборе наилучшего оценщика учитываются другие соображения, помимо максимального балла, refit может быть настроен на функцию, которая возвращает выбранный best_index_ с учетом cv_results . В этом случае best_estimator_ и best_params_ будут установлены в соответствии с возвращенным best_index_ , а атрибут best_score_ будет недоступен.
Обновленный оценщик доступен в атрибуте best_estimator_ и позволяет использовать predict непосредственно в этом экземпляре RandomizedSearchCV .
Также для оценки нескольких метрик атрибуты best_index_ , best_score_ и best_params_ будут доступны только в том случае, если установлен refit , и все они будут определены w.r.t этим конкретным счетчиком.
См. параметр scoring , чтобы узнать больше об оценке нескольких показателей.
Изменено в версии 0.20: Добавлена поддержка callable.
cvint, генератор перекрестной проверки или итерируемый объект, default=None
Определяет стратегию разделения перекрестной проверки. Возможные входные данные для cv:
- None, чтобы использовать 5-кратную перекрестную проверку по умолчанию,
- целое число, чтобы указать количество складок в (Stratified)KFold ,
- CV splitter,
- Итерируемый выход (поезд, тест) разбивается на массивы индексов.
Для входных данных integer/None, если средство оценки является классификатором, а y является либо бинарным, либо мультиклассовым, используется StratifiedKFold . Во всех остальных случаях используется К25387К. Эти разделители создаются с помощью shuffle=False , поэтому разделения будут одинаковыми для вызовов.
См. User Guide для различных стратегий перекрестной проверки, которые можно использовать здесь.
В версии 0.22: изменено значение cv по умолчанию, если None изменилось с 3-кратного на 5-кратное.
verboseint
Контролирует многословность: чем выше, тем больше сообщений.
pre_dispatchint, или стр, default=’2*n_jobs’
Управляет количеством заданий, которые отправляются во время параллельного выполнения. Уменьшение этого числа может быть полезно, чтобы избежать резкого увеличения потребления памяти, когда отправляется больше заданий, чем может обработать CPUs. Этот параметр может быть:
- None, и в этом случае все задания создаются и порождаются немедленно. Используйте это для легких и быстро выполняемых заданий, чтобы избежать задержек из-за создания заданий по запросу.
- Целое число, указывающее точное количество созданных заданий.
- Строка, дающая выражение как функцию n_jobs,, как в ‘2*n_jobs’.
Состояние генератора псевдослучайных чисел, используемое для случайной равномерной выборки из списков возможных значений вместо распределений scipy.stats. Передайте int для воспроизводимого вывода при нескольких вызовах функций. См. Glossary .
error_score «поднять» или числовое значение, default=np.nan
Значение, которое присваивается оценке, если при подборе оценщика возникает ошибка. Если установлено значение «поднять», возникает ошибка. Если задано числовое значение, поднимается FitFailedWarning. Этот параметр не влияет на шаг переоснащения, который всегда вызывает ошибку.
return_train_scorebool, default=False
Если False атрибут cv_results_ не будет включать в себя результаты обучения. Вычисление оценок обучения используется для получения информации о том, как различные настройки параметров влияют на компромисс overfitting/underfitting. Однако вычисление оценок на обучающем наборе может быть дорогостоящим в вычислительном отношении и не является строго обязательным для выбора параметров, обеспечивающих наилучшую производительность обобщения.
Новое в версии 0.19.
Изменено в версии 0.21:. Значение по умолчанию изменено с True на False .
Attributes: cv_results_dict numpy (маскированный) ndarrays
Диктовка с ключами в качестве заголовков столбцов и значениями в виде столбцов, которые можно импортировать в pandas DataFrame .
Например, приведенная ниже таблица
Настройка гиперпараметров
Гиперпараметр (англ. hyperparameter) — параметр, который не настраивается во время обучения модели. Пример гиперпараметра — шаг градиентного спуска, он задается перед обучением. Пример параметров — веса градиентного спуска, они изменяются и настраиваются во время обучения.
Для подбора гиперпараметров необходимо разделить датасет на три части:
- тренировочный набор данных (англ. training set), для обучения модели
- валидационный набор данных (англ. validation set), для расчета ошибки и выбора наилучшей модели
- тестовый набор данных (англ. test set), для тестирования выбранной модели
Зачем нам нужен и валидационный, и тестовый набор? Дело в том, что модель может переучиться на валидационном наборе данных. Для выявления переобучения используется тестовый набор данных.
Рассмотрим модель KNeighborsClassifier из библиотеки sklearn. Все “параметры” данной модели (loss, penalty, alpha и т.д), с точки зрения машинного обучения, являются гиперпараметрами, так как задаются до начала обучения.
class sklearn.linear_model.SGDClassifier(loss='hinge', penalty='l2', alpha=0.0001, l1_ratio=0.15, fit_intercept=True, max_iter=1000, tol=0.001, shuffle=True, verbose=0, epsilon=0.1, n_jobs=None, random_state=None, learning_rate='optimal', eta0=0.0, power_t=0.5, early_stopping=False, validation_fraction=0.1, n_iter_no_change=5, class_weight=None, warm_start=False, average=False)
Поиск по сетке
Общая информация
Поиск по сетке (англ. Grid search) принимает на вход модель и различные значения гиперпараметров (сетку гиперпараметров). Далее, для каждого возможного сочетания значений гиперпараметров, метод считает ошибку и в конце выбирает сочетание, при котором ошибка минимальна.
Поиск по сетке в Sklearn: использование
Пример использования GridSearch из библиотеки scikit-learn:
- Создание экземпляра класса SGDClassifier (из sklearn)
- Создание сетки гиперпараметров. В данном случае будем подбирать коэффициент регуляризации, шаг градиентного спуска, количество итераций и параметр скорости обучения.
- Создание экземпляра класса кросс-валидации
- Создание экземпляра GridSearch (из sklearn). Первый параметр — модель, второй — сетка гиперпараметров, третий — функционал ошибки (используемый для контроля качества моделей по технике кросс-валидации), четвертый — кросс-валидация (можно задать количество фолдов, а можно передать экземпляр класса кросс — валидации)
- Запуск поиска по сетке.
classifier = linear_model.SGDClassifier(random_state = 0, tol=1e-3)
parameters_grid =
cv = model_selection.StratifiedShuffleSplit(n_splits=10, test_size = 0.2) grid_cv = model_selection.GridSearchCV(classifier, parameters_grid, scoring = 'accuracy', cv = cv) grid_cv.fit(train_data, test_data)
Out: GridSearchCV(cv=StratifiedShuffleSplit(n_splits=10, random_state=0, test_size=0.2, train_size=None), error_score=nan, estimator=SGDClassifier(alpha=0.0001, average=False, class_weight=None, early_stopping=False, epsilon=0.1, eta0=0.0, fit_intercept=True, l1_ratio=0.15, learning_rate='optimal', loss='hinge', max_iter=1000, n_iter_no_change=5, n_jobs=None, penalty='l2. 'eta0': array([1.00000000e-05, 1.64285714e-05, 2.28571429e-05, 2.92857143e-05, 3.57142857e-05, 4.21428571e-05, 4.85714286e-05, 5.50000000e-05, 6.14285714e-05, 6.78571429e-05, 7.42857143e-05, 8.07142857e-05, 8.71428571e-05, 9.35714286e-05, 1.00000000e-04]), 'learning_rate': ['optimal', 'constant', 'invscaling'], 'max_iter': array([5, 6, 7, 8, 9])>, pre_dispatch='2*n_jobs', refit=True, return_train_score=False, scoring='accuracy', verbose=0)
Поиск по сетке в Sklearn: важные атрибуты
- best_estimator_ — лучшая модель
- best_score_ — ошибка, полученная на лучшей модели.
- best_params_ — гиперпараметры лучшей модели
print(grid_cv.best_estimator_)
Out: SGDClassifier(alpha=4.857142857142857e-05, average=False, class_weight=None, early_stopping=False, epsilon=0.1, eta0=1e-05, fit_intercept=True, l1_ratio=0.15, learning_rate='optimal', loss='hinge', max_iter=6, n_iter_no_change=5, n_jobs=None, penalty='l2', power_t=0.5, random_state=0, shuffle=True, tol=0.001, validation_fraction=0.1, verbose=0, warm_start=False)
print(grid_cv.best_score_)
Out: 0.9099999999999999
print(grid_cv.best_params_)
Out:
- cv_results_ — результаты всех моделей.
print(grid_cv.cv_results_)
Out:
print(grid_cv.cv_results_['param_max_iter'].data)
Out: array([5, 6, 7, . 7, 8, 9], dtype=object)
Реализация поиска по сетке в библиотеках
Случайный поиск по сетке
Основная информация
Случайный поиск по сетке (англ. Random Grid Search) вместо полного перебора работает с некоторыми, случайным образом выбранными, комбинациями. На основе полученных результатов, происходит сужение области поиска.
Когда случайный поиск по сетке будет гораздо полезнее, чем просто поиск по сетке? В ситуации, когда гиперпараметров много, но сильно влияющих на конечную производительность алгоритма — мало.
Реализация случайного поиска по сетке
Последовательная оптимизация по модели
Основная информация
Последовательная оптимизация по модели (англ. Sequential Model-Based Optimization, SMBO) используются когда оптимизация целевой функции будет стоить очень «дорого». Главная идея SMBO — замена целевой функции «суррогатной» функцией.
На каждом шаге работы SMBO:
- Строится вероятностная модель (суррогатная функция) целевой функции.
- Подбираются гиперпараметры, которые лучше всего подходят для вероятностной модели.
- Подобранные гиперпараметры применяются к целевой функции.
- Вероятностная модель перестраивается (обновляется).
- Шаги 2-4 повторяются столько раз, сколько задал пользователь.
Существует четыре ключевые аспекта SMBO:
- Сетка значений гиперпараметров (область поиска).
- Целевая функция (выводит оценку, которую мы хотим минимизировать или максимизировать).
- Вероятностная модель целевой функции (суррогатная функция).
- Критерий, называемый функцией выбора (для выбора следующих гиперпараметры по текущей вероятностной модели).
Методы SMBO отличаются между собой вероятностными моделями и функциями выбора:
Популярные вероятностные модели (суррогатные функции):
- Гауссовские процессы
- Древовидный парзеновский оценщик
- Регрессия случайного леса
Древовидный парзеновский оценщик
Основная информация
Как было написано выше, методы SMBO отличаются тем, как они строят вероятностную модель [math] [/math] . В случае древовидного парзеновского оценщика (англ. Tree-structured Parzen Estimator, TPE), используется следующая функция:
[math] [/math] — распределение гиперпараметров, [math] y [/math] — значение целевой функции, [math] y* [/math] — пороговое начение
[math] p(x|y) = \begin l(x), & \mbox y \lt y* \\ g(x), & \mbox y \ge y* \end [/math]
В TPE задается два различных распределения гиперпараметров: первое при значениях целевой функции меньших, чем пороговое значение. Второе — при значениях целевой функции больших, чем пороговое значение.
Алгоритм
- На вход подается список пар (parameters, loss)
- По заданному порогу, происходит разбиение списка на 2 части
- Для каждого списка строится распределение
- Возвращается значение: [math] argmin_ \frac[/math]
Последовательная конфигурация алгоритма на основе модели
Основная информация
Последовательная конфигурация алгоритма на основе модели (англ. Sequential Model-based Algorithm Configuration, SMAC) расширяет подходы SMBO:
- Использует дискретные и условные пространства параметров.
- Обрабатывает негауссовский шум.
- Выделяет бюджет на общее время, доступное для настройки алгоритма, а не на количество оценок функций.
Кроме того, SMAC использует переданную ему модель для формирования списка перспективных конфигураций (сочетаний) параметров. Чтобы оценить перспективность конфигурация [math] \theta [/math] , SMAC строит распределение результатов модели для [math] \theta [/math] . С помощью этого распределения, а также информации, о текущей лучшей конфигурации, SMAC вычисляет ожидаемое положительное улучшение [math] EI(\theta) [/math] . После нахождения [math] EI(\theta) [/math] необходимо найти конфигурацию с наибольшим значением [math] EI(\theta) [/math] . Эта задача приводит к проблеме максимизация значения на всем пространстве конфигураций. Другие методы SMBO максимизируют значения а случайной выборке из пространства конфигураций, что достаточно плохо работает в случае высокомерного пространства. SMAC применяет немного другой подход: выполняется несколько локальных и поисков и среди них выбираются все конфигурации с максимальным [math] EI(\theta) [/math] . И уже среди них производится новый поиск и выбирается лучшая конфигурация.
Реализация
- SMBO: SMAC
- TPE: Hyperopt
- Гауссовские процессы: Spearmint, Scikit-optimize
См. также
- Автоматическое машинное обучение
- Бустинг, AdaBoost
- Кросс-валидация
- Поиск архитектуры нейронной сети
Примечания
Источники
- Algorithms for Hyper-Parameter Optimization
- Sequential Model-Based Optimization for General Algorithm Configuration
- Bayesian optimization
- Гауссовские процессы и байесовская оптимизация
- GridSearchCV sklearn