Machine Learning, Подготовка данных

GridSearchCV – помощник в выборе гиперпараметров модели

Время прочтения: 3 мин.

Аналитик, получив конкретную задачу, залив (сформировав датасет) и очистив данные, приступает к более глубокому анализу:

  1. любой датасет из чистых данных должен быть подвергнут долгой и качественной обработке с вычленением кейфич. При этом не работает правило «чем больше, тем лучше». Данные должны быть репрезентативны, фичам необходимо отражать необходимые качества датасета
  2. для каждой конкретной задачи, с учетом доступных ресурсов и особенностей датасета, необходимо подбирать правильную модель машинного обучения;
  3. выбрав правильную модель для обучения, важно указать верные параметры модели, при которых мы получим лучшую её оценку и эффективность. Для реализации данного этапа есть варианты:
  • перебрать параметры вручную, с последующим обучением модели для каждого нового набора;
  • доверить данный процесс компоненту GridSearchCV, значительно сэкономив время.

Рассмотрим детально вариант использования компонента GridSearchCV.

Для начала импортируем необходимый модуль:

In [ ]: from sklearn.model_selection import GridSearchCV  
Выберем модель (любую используемую Вами модель):
In [  ]: from sklearn.neural_network import MLPRegressor 
В нашем примере мы создаем объект - многослойный персептрон: 
In [ ]: MLP = MLPRegressor(hidden_layer_sizes = (100,100,100))  
Получим список возможных параметров выбранной модели:
In [  ]:  MLP.get_params().keys() 
Out[  ]:  dict_keys(['activation', 'alpha', 'batch_size', 'beta_1', 'beta_2', 
'early_stopping', 'epsilon', 'hidden_layer_sizes', 'learning_rate', 
'learning_rate_init', 'max_iter', 'momentum', 'n_iter_no_change', 
'nesterovs_momentum', 'power_t', 'random_state', 'shuffle', 'solver', 'tol', 'validation_fraction', 'verbose', 'warm_start'])

Для примера возьмем только некоторые из представленных выше параметров: ‘max_iter’ и ‘learning_rate_init’– их значения и попробуем подобрать.

Перед тем как приступать к подбору, будет полезным познакомиться с методом чуть поближе.

GridSearch — поиск лучших параметров в фиксированной сетке возможных значений.

CV – перекрёстная проверка (кросс-валидация, Cross-validation), метод, который показывает, что модель не переобучилась.

Принцип работы:

  1. берется Датасет:         
[****************] 

2. делится на кусочки:      

[****|****|****|****]

3. делается указанное нами (4) количество прогонов этой модели:

[****|****|****|DDDD]
[****|****|DDDD|****]
[****|DDDD|****|****]
[DDDD|****|****|****]

Где |****| – одна из частей датасета, “DDDD”- часть датасета, на которой прогоняется модель.

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

Параметры GridSearchCV:

estimator — модель которую хотим обучать (алгоритм);

param_grid — передаем какие параметры хотим подбирать, GridSearchCV на всех параметрах попробует сделать обучение;

CV — сколько разрезов кросс-валидации мы ходим сделать;

scoring — выбор метрики ошибки (для разных задач можно выбрать разные функции ошибки).

Познакомившись с методом, начинаем с ним работать:

In [ ]:  GSCV = GridSearchCV( MLP, {
		"max_iter": [100, 500, 1000], 
 		"learning_rate_init" : [0.001, 0.01], # отвечает за точность обучения
}, 
    cv = 3, # количество разбиений на кросс-валидацию ( < 3 делать не стоит) 
    scoring = 'neg_mean_absolute_error' # как мы будем оценивать модель (используем scoring нашей модели)

ИТОГ: количество моделей которых мы обучим с помощью данного метода: 3*2*3 = 18 штук.

Обучим сетку на датасетах модели:

In [ ]:  GSCV.fit(X,y)
Out[ ]:  GridSearchCV(cv=3, error_score='raise-deprecating',
             estimator=MLPRegressor(activation='relu', alpha=0.0001,
                                    batch_size='auto', beta_1=0.9, beta_2=0.999,
                                    early_stopping=False, epsilon=1e-08,
                                    hidden_layer_sizes=(100, 100, 100),
                                    learning_rate='constant',
                                    learning_rate_init=0.001, max_iter=200,
                                    momentum=0.9, n_iter_no_change=10,
                                    nesterovs_momentum=True, power_t=0.5,
                                    random_state=None, shuffle=True,
                                    solver='adam', tol=0.0001,
                                    validation_fraction=0.1, verbose=False,
                                    warm_start=False),
             iid='warn', n_jobs=None,
             param_grid={'learning_rate_init': [0.001, 0.01],
                         'max_iter': [100, 500, 1000]},
             pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
             scoring='neg_mean_absolute_error', verbose=0)

Смотрим результат и видим самый лучший обученный MLP-регрессор:

In [ ]:  GSCV.best_estimator_ 
Out[ ]:  MLPRegressor(activation='relu', alpha=0.0001, batch_size='auto', beta_1=0.9,
             beta_2=0.999, early_stopping=False, epsilon=1e-08,
             hidden_layer_sizes=(100, 100, 100), learning_rate='constant',
             learning_rate_init=0.001, max_iter=1000, momentum=0.9,
             n_iter_no_change=10, nesterovs_momentum=True, power_t=0.5,
             random_state=None, shuffle=True, solver='adam', tol=0.0001,
             validation_fraction=0.1, verbose=False, warm_start=False)

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

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

Советуем почитать