Установка гиперпараметров очень важна в машинном обучении. Гиперпараметры — это в основном параметры, значения которых используются для управления процессом обучения. Проектирование модели очень важно в машинном обучении, а выбор правильных гиперпараметров — очень важный процесс в дизайне модели.

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

GridSearchCV

GridSearchCV() — это очень эффективный инструмент, предоставляемый Scikit-learn, который позволяет нам настраивать гиперпараметры моделей. Давайте рассмотрим пример с классификатором дерева решений.

Пример 1 — Классификатор дерева решений

Классификатор дерева решений имеет несколько параметров, которые необходимо контролировать, но в этом случае давайте рассмотрим только «max_depth» и «min_samples_split».

max_depth: максимальная глубина дерева

min_samples_split: минимальное количество сэмплов, необходимое для разделения внутреннего узла.

Чтобы найти наилучшую комбинацию гиперпараметров, нам просто нужно попробовать каждую комбинацию и сравнить результаты. Давайте попробуем «max_depth» из 1, 2, 3 и «min_samples_split» из 2, 3. Всего нам потребуется попробовать шесть комбинаций.

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

Некоторые из параметров GridSearchCV() следующие (подробнее можно прочитать здесь):

оценщик: объект оценки. Может быть классификатором, регрессором или конвейером.

param_grid: словарь с именами параметров в качестве ключей и списками настроек параметров, которые можно попробовать использовать в качестве значений.

оценка: стратегия оценки эффективности модели с перекрестной проверкой на тестовом наборе.

cv: определяет стратегию разделения перекрестной проверки.

Теперь давайте попробуем приведенный выше пример классификатора дерева решений с хорошо известным набором данных радужной оболочки. Сначала импортируйте необходимые функции из библиотеки.

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
import pandas as pd

Разделите набор данных радужной оболочки на наборы данных поезда и протестируйте их, используя train_test_split().

iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size = 0.2, random_state = 100)

Давайте создадим нашу модель классификатора дерева решений.

dt_clf = DecisionTreeClassifier(random_state = 10)

Сетка параметров, которые мы хотели бы протестировать, может быть выражена следующим образом. Формат находится в словаре, поскольку GridSearchCV принимает только словари. Ключи — это имена параметров в строке, а элементы — в форме списка с гиперпараметрами, которые нужно попробовать.

params = {'max_depth':[1,2,3], 'min_samples_split':[2, 3]}

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

grid_dt_clf = GridSearchCV(dt_clf, param_grid = params, cv = 3)
grid_dt_clf.fit(X_train, y_train)
scores = pd.DataFrame(grid_dt_clf.cv_results_)
scores[['params', 'mean_test_score', 'rank_test_score']]

С помощью операции cv_results_ мы можем просматривать различную информацию о моделях с различными комбинациями гиперпараметров, а приведенный выше кадр данных показывает средний балл теста и ранг для каждой комбинации. Как видно, оценка является самой высокой, когда {‘max_depth’: 3, ‘min_samples_split’: 2} и {‘max_depth’: 3, ‘min_samples_split’: 3}.

Мы также можем сделать так, чтобы GridSearchCV возвращал лучший набор гиперпараметров с помощью best_params_ и лучший результат с помощью best_score_.

print(f'Best set of hyperparameters: {grid_dt_clf.best_params_}')
print(f'The score for the best set of hyperparameters: {grid_dt_clf.best_score_}')

Отсюда мы видим, что установка «max_depth» = 3 и «min_samples_split» = 2 возвращает лучший результат для нашей модели классификатора дерева решений с учетом набора данных радужной оболочки.

Пример 2 — Классификатор случайного леса

Давайте попробуем другую модель с классификатором случайного леса и набором данных о раке молочной железы, предоставленным Scikit-learn.

from sklearn.datasets import load_breast_cancer
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, GridSearchCV
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, test_size = 0.2, random_state = 100)
rf_clf = RandomForestClassifier(random_state = 10)

Комбинации набора гиперпараметров классификатора случайного леса следующие (описания параметров можно найти здесь):

param_grid = {'n_estimators':[100], 
             'max_depth':[6, 7, 8, 9],
             'min_samples_leaf':[7, 9, 11, 13],
             'min_samples_split':[6, 8, 10, 12]}

Теперь давайте попробуем GridSearchCV. Процесс подбора может занять некоторое время, так как у нас есть много комбинаций гиперпараметров. После того, как подгонка завершена, мы можем увидеть лучший набор гиперпараметров и его оценку.

print(f'Best Hyperparameters: {grid_rf.best_params_}')
print(f'Best Score: {grid_rf.best_score_:.5f}')

Следовательно, согласно результату GridSearchCV, мы получаем лучший результат, когда гиперпараметры нашего классификатора случайного леса равны {‘max_depth’: 6, ‘min_samples_leaf’: 7, ‘min_samples_split’: 6, ‘n_estimators’: 100}.

В этой статье мы изучили, как настраивать гиперпараметры с помощью GridSearchCV(), предоставляемого Scikit-learn в Python. Здесь мы рассмотрели только классификатор дерева решений и классификатор случайного леса, но GridSearchCV() можно применять и к другим типам моделей ML.

Надеюсь, эта статья помогла вам понять настройку гиперпараметров в Python, и спасибо за чтение :)