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

Гиперпараметрическая настройка: Понимание поиска сетки

В предыдущем сообщении блогов, роль кросс-подтверждения, мы посмотрели, как тренировочный / тестовый сплит не … Теги с новичками, машинным обучением, наукой данных, Python.

В предыдущем сообщении в блоге роль кросс-подтверждения мы смотрели, как тренируются/тестовые расщепления не хватает, чтобы получить надежную оценку точности вне выборки, которая мотивировала нас, чтобы понять важность перекрестной проверки.

В этом посте в блоге мы увидим, как мы можем сделать HyperParameter поиск более удобно с Gridsearchcv В Scikit – учитесь и научитесь использовать его для настройки нескольких гиперпараметров. Давайте начнем!

Время для быстрого вспоминания!

Мы смотрели на задачу классификации на наборе данных IRIS; Мы использовали 10-кратную перекрестную проверку и среднее значение перекрестных оценок точности как оценка точности выкидки. Давайте быстро пройдемся по шагам снова.

# necessary imports
from sklearn.datasets import load_iris
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
%matplotlib inline
# read in the iris data
iris = load_iris()

# create X (features) and y (response)
X = iris.data
y = iris.target
# 10-fold cross-validation with K=5 for KNN (the n_neighbors parameter)
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
# use average accuracy as an estimate of out-of-sample accuracy
print(scores.mean())
# Output
0.9666666666666668

Затем мы хотели определить наилучшее значение k для классификатора KNN. Чтобы найти лучшее K. Мы зацикливаемся через возможный набор значений для К ( n_neighbors ) А затем выбрал ценность К Это дало наибольшую поперечную точность.

В Knn Classifier, установка Очень маленький Значение для К сделаю модель ненужный сложный и а Очень большой Значение К приведет к модели с высокой смещением, которая дает неоптимальную производительность.

# search for an optimal value of K for KNN
k_range = list(range(1, 31))
k_scores = []
for k in k_range:
   knn = KNeighborsClassifier(n_neighbors=k)
   scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
   k_scores.append(scores.mean())
# plot the value of K for KNN (x-axis) versus the cross-validated accuracy (y-axis)
plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated Accuracy')

Как, 18 и 20 дали высочайшую оценку точности, близко к 0,98, мы решили выбрать в качестве большего значения K, принесет менее сложной модели. Хотя для цикла нет особо трудно, мы понимаем, что нам придется часто делать это. Поэтому было бы хорошо иметь более удобный способ выполнения поиска гипепараметра, без необходимости писать цикл каждый раз и идентифицировать лучший параметр через проверку.

Понимание GridSearchcv.

Давайте пойдем вперед и импортируем класс GridSearchCV.

from sklearn.model_selection import GridSearchCV

Определите сетку параметра

Теперь мы определяем сетку параметров ( param_grid Несомненно Словарь Python, ключ которого является именем гиперпараметра, лучшее значение которого мы пытаемся найти, и значение – это список возможных значений, которые мы хотели бы искать для гиперпараметра.

# define the parameter values that should be searched
k_range = list(range(1, 31))
# create a parameter grid: map the parameter names to the values that should be searched
param_grid = dict(n_neighbors=k_range)
print(param_grid)


# param_grid
{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]}

Сейчас мы создаем экземпляр Gridsearchcv Отказ Обратите внимание, что указываем param_grid вместо n_neighbors аргумент, который мы указали для cross_val_score ранее. Почему это действительно?

Помните, что параметр сетки, param_grid это словарь, ключ которого является n_neighbors И значение является список возможных значений N_Neighbors. Поэтому указывая param_grid гарантирует, что значение по индексу Я получает ценность n_neighbors в I_th бегать.

Золковита, Fit Grid и результаты посмотреть результаты

# instantiate the grid
grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy', return_train_score=False)

Теперь мы идем вперед и соответствую сетке с данными и доступа к CV_RESULTS_ Атрибут, чтобы получить среднюю оценку точности после 10-кратного кросс-проверки, стандартное отклонение и значения параметров. Для удобства мы можем хранить результаты в DataFrame PandaS. Среднее и стандартное отклонение баллов точности до 10 показано ниже.

# fit the grid with data
grid.fit(X, y)
# view the results as a pandas DataFrame
import pandas as pd
pd.DataFrame(grid.cv_results_)[['mean_test_score', 'std_test_score', 'params']]

# Output

mean_test_score std_test_score  params
0   0.960000    0.053333    {'n_neighbors': 1}
1   0.953333    0.052068    {'n_neighbors': 2}
2   0.966667    0.044721    {'n_neighbors': 3}
3   0.966667    0.044721    {'n_neighbors': 4}
4   0.966667    0.044721    {'n_neighbors': 5}
5   0.966667    0.044721    {'n_neighbors': 6}
6   0.966667    0.044721    {'n_neighbors': 7}
7   0.966667    0.044721    {'n_neighbors': 8}
8   0.973333    0.032660    {'n_neighbors': 9}
9   0.966667    0.044721    {'n_neighbors': 10}

При использовании cross_val_score Мы попробовали глазные яблочные баллы точности, чтобы определить лучшие гиперпараметры, и чтобы облегчить, мы нанесели значение HyperParameters против соответствующих поперечных достоверных баллов!

Звучит хорошо, но, похоже, не отличный вариант!

Как только мы завершили поиск сетки, следующие атрибуты могут быть очень полезными! Мы можем выбрать изучить: ☑ Best_score_ , самая высокая перекрестная проверка точности ☑. Best_Params_ , оптимальное значение для гиперпараметров и ☑ Best_estimator_ , что является лучшей моделью, которая имеет лучший гиперпараметр. Давайте теперь рассмотрим их для нашего примера.

# examine the best model
print(grid.best_score_)
print(grid.best_params_)
print(grid.best_estimator_)

# Output
0.9800000000000001

{'n_neighbors': 13}

KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
                     metric_params=None, n_jobs=None, n_neighbors=13, p=2,
                     weights='uniform')

K = 13 был выбран, помните, помните, что был одним из значений K, которые дали наибольший поперечный показатель точности. ✔ Должен так хорошо!

Поиск нескольких параметров

В этом примере единственный гиперпараметр, который мы искали, было n_neighbors Отказ Что если бы было много таких гиперпараметров?

Мы можем подумать, «Почему бы не настроить каждый гиперпараметр самостоятельно?» Ну, мы можем самостоятельно найти оптимальные значения для каждого из гиперпараметров; Но модель может выполняться наилучшим образом по некоторым значениям параметров, которые сильно отличаются от индивидуальных лучших значений. Итак, мы должны искать комбинацию параметров, которые оптимизируют производительность, а не отдельные лучшие параметры.

Давайте построим на тот же пример Knnclassifier. , в дополнение к n_neighbors Давайте также ищем оптимальную весовую стратегию. Опция веса по умолчанию – «Униформа», где все точки возвышены одинаково и точки опции «расстояние» указывает на обратную часть их расстояния. В этом случае более близкие соседи точки запроса окажут большее влияние, чем соседи, которые дальше.

# define the parameter values that should be searched
k_range = list(range(1, 31))
weight_options = ['uniform', 'distance']
# create a parameter grid: map the parameter names to the values that should be searched
param_grid = dict(n_neighbors=k_range, weights=weight_options)
print(param_grid)

# param_grid
{'n_neighbors': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],

'weights': ['uniform', 'distance']}

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

# instantiate and fit the grid
grid = GridSearchCV(knn, param_grid, cv=10, scoring='accuracy', return_train_score=False) grid.fit(X, y)
# view the results
pd.DataFrame(grid.cv_results_)[['mean_test_score', 'std_test_score', 'params']]

# Results
mean_test_score std_test_score  params
0   0.960000    0.053333    {'n_neighbors': 1, 'weights': 'uniform'}
1   0.960000    0.053333    {'n_neighbors': 1, 'weights': 'distance'}
2   0.953333    0.052068    {'n_neighbors': 2, 'weights': 'uniform'}
3   0.960000    0.053333    {'n_neighbors': 2, 'weights': 'distance'}
4   0.966667    0.044721    {'n_neighbors': 3, 'weights': 'uniform'}
5   0.966667    0.044721    {'n_neighbors': 3, 'weights': 'distance'}
6   0.966667    0.044721    {'n_neighbors': 4, 'weights': 'uniform'}
7   0.966667    0.044721    {'n_neighbors': 4, 'weights': 'distance'}
8   0.966667    0.044721    {'n_neighbors': 5, 'weights': 'uniform'}
9   0.966667    0.044721    {'n_neighbors': 5, 'weights': 'distance'}
10  0.966667    0.044721    {'n_neighbors': 6, 'weights': 'uniform'}
11  0.966667    0.044721    {'n_neighbors': 6, 'weights': 'distance'}
12  0.966667    0.044721    {'n_neighbors': 7, 'weights': 'uniform'}
13  0.966667    0.044721    {'n_neighbors': 7, 'weights': 'distance'}
14  0.966667    0.044721    {'n_neighbors': 8, 'weights': 'uniform'}
15  0.966667    0.044721    {'n_neighbors': 8, 'weights': 'distance'}
16  0.973333    0.032660    {'n_neighbors': 9, 'weights': 'uniform'}
17  0.973333    0.032660    {'n_neighbors': 9, 'weights': 'distance'}
18  0.966667    0.044721    {'n_neighbors': 10, 'weights': 'uniform'}

Результаты поиска сетки двух параметров (усеченный вид данных dataframe) Только первые десять рядов результатов были показаны выше; У нас на самом деле есть модели (так как у нас было 30 возможных значений для n_Neighbors и 2 возможных значения для весов), и как мы выбрали 10-кратную перекрестную проверку, появятся прогнозы! Время посмотреть на лучший балл и параметры нашей модели, которые принесли лучший результат.

# examine the best model
print(grid.best_score_)
print(grid.best_params_)

# best score and best parameters
0.9800000000000001
{'n_neighbors': 13, 'weights': 'uniform'}

Мы получаем тот же самый лучший поперечный показатель точности 0,98, с n_neighbors = 13. а также Вес = «Униформа». Теперь, давайте скажем, мы должны настроить 4 гиперпараметра, и у нас есть список из 10 возможных значений для каждого из гиперпараметров. Этот процесс создает 10 * 10 * 10 * 10 000 Модели и когда мы запускаем 10-кратную перекрестную проверку, есть 100 000 предсказаний. Очевидно, что все масштабируются очень быстро и могут вскоре стать вычислительно невыполнимыми.

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

использованная литература

[1] Вот ссылка К ноутбуку Google Colab для вышеперечисленного примера. [2] Введение в машину обучения в Python с Scikit-Suart по Dataschool Отказ [3] Документация Scikit – Scikit: GridSearchCV http://scikitlearn.org/stable/modules/generated/sklearn.model_selection.gridsearchcv.html.

Обложка Изображение: Фото Келли Сиккема на Бессмысленно

Оригинал: “https://dev.to/balapriya/hyperparameter-tuning-understanding-grid-search-2648”