Время прочтения: 3 мин.
Процесс обучения модели поэтапный: начинается он с обработки данных, имеет стадию тюнинга, отдельную стадию обкатки и проверки. Рассмотрим подробнее процесс тюнинга модели при помощи GridSearchCV (библиотеки sklearn), которая выберет наилучшие параметры модели за вас.
Аналитик, получив конкретную задачу, залив (сформировав датасет) и очистив данные, приступает к более глубокому анализу:
- любой датасет из чистых данных должен быть подвергнут долгой и качественной обработке с вычленением кейфич. При этом не работает правило «чем больше, тем лучше». Данные должны быть репрезентативны, фичам необходимо отражать необходимые качества датасета
- для каждой конкретной задачи, с учетом доступных ресурсов и особенностей датасета, необходимо подбирать правильную модель машинного обучения;
- выбрав правильную модель для обучения, важно указать верные параметры модели, при которых мы получим лучшую её оценку и эффективность. Для реализации данного этапа есть варианты:
- перебрать параметры вручную, с последующим обучением модели для каждого нового набора;
- доверить данный процесс компоненту 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), метод, который показывает, что модель не переобучилась.
Принцип работы:
- берется Датасет:
[****************]
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)
Исходя из полученный информации, лучший регрессор (использованная Вами модель) имеет указанные выше параметры.
Данный метод хоть и работает не очень быстро, но, при этом, экономит достаточно времени по сравнению с ручным перебором тех же параметров, чем дает явное преимущество в использовании при построении моделей.