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

  • это требует много времени
  • трудно отслеживать гиперпараметры, которые мы пробовали, и нам все еще нужно попробовать

Итак, я быстро спросил Google, есть ли какое-нибудь решение моей проблемы, и Google показал мне что-то под названием GridSearchCV от Sklearn. Позвольте мне на простом примере рассказать, как я воспользовался этим GridSearchCV для решения своей проблемы.

Что такое GridSearchCV?

GridSearchCV - это библиотечная функция, которая является членом пакета sklearn model_selection. Это помогает пройти через предопределенные гиперпараметры и подогнать вашу оценщик (модель) к вашему набору обучения. Итак, в итоге вы можете выбрать лучшие параметры из перечисленных гиперпараметров.

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

Пример с пояснениями

from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
params = {
    'n_neighbors' : [5, 25],
    'weights': ['uniform', 'distance'],
    'algorithm': ['auto', 'ball_tree', 'kd_tree', 'brute']
}
grid_kn = GridSearchCV(estimator = kn,
                        param_grid = params,
                        scoring = 'accuracy', 
                        cv = 5, 
                        verbose = 1,
                        n_jobs = -1)
grid_kn.fit(X_train, y_train)

Давайте разберем приведенный выше блок кода. Как обычно, вам необходимо импортировать GridSearchCV и оценку / модель (в моем примере KNClassifier) ​​из библиотеки sklearn.

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

Затем все, что вам нужно сделать, это создать объект GridSearchCV. Здесь в основном вам нужно определить несколько именованных аргументов:

  1. оценщик: созданный вами объект оценщика.
  2. params_grid: объект словаря, содержащий гиперпараметры, которые вы хотите попробовать.
  3. скоринг: метрика оценки, которую вы хотите использовать, вы можете просто передать действительную строку / объект метрики оценки.
  4. cv: количество перекрестных проверок, которые вы должны попробовать для каждого выбранного набора гиперпараметров.
  5. подробный: вы можете установить его в 1, чтобы получать подробную распечатку, пока вы подбираете данные для GridSearchCV.
  6. n_jobs: количество процессов, которые вы хотите запустить параллельно для этой задачи, если оно равно -1, будут использоваться все доступные процессоры.

Это все, что вам нужно определить. Затем вы должны соответствовать своим тренировочным данным, как обычно. Вы получите первую строку, напечатанную следующим образом:

Fitting 5 folds for each of 16 candidates, totalling 80 fits
...
...
...

Вы не понимаете, что это значит? Простой! Поскольку нам нужно попробовать два варианта для n_neighbors, два для весов и четыре для алгоритмов, всего есть 16 различных комбинаций, которые мы должны попробовать. И для каждой комбинации у нас есть 5 подборов CV, поэтому наш объект GridSearcCV будет протестировать 80 разных подборов.

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

[Parallel(n_jobs=1)]: Done  80 out of  80 | elapsed: 74.1min finished]

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

# extract best estimator
print(grid_kn.best_estimator_)
Output:
KNeighborsClassifier(algorithm='auto', 
leaf_size=30, metric='minkowski',metric_params=None, n_jobs=-1, n_neighbors=25, p=2, weights='distance')
# to test the bestfit
print(grid_kn.score(X_test, y_test))
Output:
0.9524753

Круто, не правда ли? Теперь все, что вам нужно сделать, это изменить оценщик и определить словарь гиперпараметров, который вы должны попробовать. Надеюсь, это будет вам полезно. Чтобы узнать больше о GridSearchCV, ознакомьтесь с официальной документацией sklearn.