Давайте разберемся с настройкой гиперпараметров

Мы собираемся использовать набор данных рака молочной железы, чтобы понять GridSearchCV и RandomizedSearchCV.

Во-первых, давайте узнаем, что такое гиперпараметр.

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

И иногда, когда мы реализуем эти алгоритмы в нашей программе, мы склонны передавать некоторые параметры, если мы используем классификатор опорных векторов, который обычно реализуется как SVC(), мы передаем некоторые параметры, такие как 'C', "ядро" и т. д.

Эти параметры могут иметь несколько значений, например, мы можем задать для параметра 'kernel' такие значения, как 'linear', 'rbf', 'sigmoid', 'poly', или 'предварительно рассчитанный'.

Мы никогда не узнаем, какое значение передать нашему параметру kernel, который даст наилучшую модель, способную дать хорошие результаты.

Эти параметры, которые передаются нашей модели, называются гиперпараметрами.

Чтобы найти лучший гиперпараметр для нашей модели, нам нужно выполнить настройку гиперпараметра. Есть 2 способа найти лучший гиперпараметр для нашей модели:

  1. GridSearchCV()
  2. Рандомизированный поискCV()

Давайте перейдем к части кодирования, чтобы вы могли понять обе эти концепции на практике. Мы будем использовать набор данных breast_cancer из модуля sklearn.datasets.

Давайте сначала проделаем все обычные шаги,

Импорт библиотек и загрузка набора данных:

import pandas as pd
import sklearn.datasets as ds
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import RandomizedSearchCV
dataset = ds.load_breast_cancer()

Приведенный выше код даст набор данных в виде массива, давайте преобразуем его в фрейм данных.

df = pd.DataFrame(dataset.data, columns=dataset.feature_names)

Теперь наш набор данных преобразован в Data Frame, но мы включили только столбцы Feature, а не столбец Target. Давайте добавим столбец Target в набор данных.

df['target'] = dataset.target

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

df.isnull().sum()

#Output
mean radius                0
mean texture               0
mean perimeter             0
mean area                  0
mean smoothness            0
mean compactness           0
mean concavity             0
mean concave points        0
mean symmetry              0
mean fractal dimension     0
radius error               0
texture error              0
perimeter error            0
area error                 0
smoothness error           0
compactness error          0
concavity error            0
concave points error       0
symmetry error             0
fractal dimension error    0
worst radius               0
worst texture              0
worst perimeter            0
worst area                 0
worst smoothness           0
worst compactness          0
worst concavity            0
worst concave points       0
worst symmetry             0
worst fractal dimension    0
target                     0
dtype: int64

В наборе данных нет нулевых значений.

Давайте узнаем форму набора данных.

df.shape

#Output

(569, 31)

569 строк и 31 столбец.

Теперь давайте разделим функции и метки (цель).

X = df.drop(['target'], axis=1)
y = df['target']

Остался еще один шаг, и мы можем перейти к GridSearchCV и RandomizedSearchCV.

Последний шаг: перед подачей данных в GredSearchCV или RandomizedSearchCV данные должны быть преобразованы в массив.

import numpy as np
arr_X = np.asarray(X)
arr_y = np.asarray(y)

Теперь у нас есть Feature(X) и Label(y) в виде массива как arr_X и arr_y соответственно.

GridSearchCV

Мы уже импортировали GridSearchCV из модуля sklearn.modeul_selection.

Теперь мы собираемся создать экземпляр с именем gs для нашего GridSearchCV и передать ему три параметра: модель, parameter_grid и cv (количество сгибов).

model = SVC()
parameters = {
    'C':[1, 5, 10, 20],
    'kernel':['linear', 'sigmoid', 'rbf', 'poly']
}
# GridSearchCV
gs = GridSearchCV(model, parameters, cv=5)
gs.fit(X, y) # This code may take some time to complete.

Позвольте мне объяснить, что делает приведенный выше код. Наша цель — найти лучший гиперпараметр (C и ядро) для нашей модели SVC().

Мы создали словарь с некоторыми значениями для обоих гиперпараметров (C и ядра). GridSearchCV() проверяет, какая комбинация двух гиперпараметров может дать хороший результат. Он проверяет все возможные комбинации, например,

[{'C': 1, 'kernel': 'linear'}, {'C': 1, 'kernel': 'sigmoid'}, {'C': 1, 'kernel': 'rbf'}, { 'C': 1, 'kernel': 'poly'}, {'C': 5, 'kernel': 'linear'}, {'C': 5, 'kernel': 'sigmoid'}, {'C ': 5, 'kernel': 'rbf'}, {'C': 5, 'kernel': 'poly'}, {'C': 10, 'kernel': 'linear'}, {'C': 10, 'ядро': 'сигмоид'}, {'C': 10, 'kernel': 'rbf'}, {'C': 10, 'kernel': 'poly'}, {'C': 20, 'kernel': 'linear'}, {'C': 20, 'kernel': 'sigmoid'}, {'C': 20, 'kernel': 'rbf'}, {'C': 20, 'kernel ': 'поли'}]

Приведенный выше список содержит все возможные комбинации двух гиперпараметров, он выполняет перекрестную проверку (cv = 5) с использованием каждой комбинации и находит лучшие гиперпараметры для нашей модели.

Чтобы узнать лучшие параметры, вы можете просто запустить приведенный ниже код:

gs.best_estimator_

#Output
SVC(C=10, kernel='linear')

Чтобы узнать оценку лучшего_оценщика_.

gs.best_score_

#Output
0.9525694767893185

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

gs.cv_results_

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

result_df = pd.DataFrame(gs.cv_results_)
result_df = result_df[['param_C', 'param_kernel', 'mean_test_score']]
result_df

Теперь мы знаем, что такое GridSearchCV, давайте узнаем, что такое RandomizedSearchCV.

Рандомизированный поискрезюме

GridSearchCV обработает все возможные комбинации, что займет много времени. Напротив, RandomizedSearchCV выбирает только несколько случайных комбинаций гиперпараметров.

Например,

GridSearchCV выбирает полную комбинацию следующим образом:

[{'C': 1, 'kernel': 'linear'}, {'C': 1, 'kernel': 'sigmoid'}, {'C': 1, 'kernel': 'rbf'}, { 'C': 1, 'kernel': 'poly'}, {'C': 5, 'kernel': 'linear'}, {'C': 5, 'kernel': 'sigmoid'}, {'C ': 5, 'kernel': 'rbf'}, {'C': 5, 'kernel': 'poly'}, {'C': 10, 'kernel': 'linear'}, {'C': 10, 'ядро': 'сигмоид'}, {'C': 10, 'kernel': 'rbf'}, {'C': 10, 'kernel': 'poly'}, {'C': 20, 'kernel': 'linear'}, {'C': 20, 'kernel': 'sigmoid'}, {'C': 20, 'kernel': 'rbf'}, {'C': 20, 'kernel ': 'поли'}]

RandomizedSearchCV выберет несколько комбинаций из полного списка, например:

[{'C': 20, 'kernel': 'linear'}, {'C': 20, 'kernel': 'sigmoid'}, {'C': 1, 'kernel': 'rbf'}, { 'C': 10, 'kernel': 'rbf'}, {'C': 5, 'kernel': 'сигмоид'}, {'C': 5, 'kernel': 'сигмоид'}, {'C ': 5, 'ядро': 'rbf'}, {'C': 10, 'ядро': 'поли'}]

Вы можете понять это лучше из кода.

rs = RandomizedSearchCV(model, parameters, cv=5)
rs.fit(X, y) # This code may take some time to complete
rs.best_estimator_

#Output
SVC(C=10, kernel='linear')
rs.best_score_

#Output
0.9525694767893185
result_df = pd.DataFrame(gs.cv_results_)
result_df = result_df[['param_C', 'param_kernel', 'mean_test_score']]
result_df

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

Вот и все.