Давайте разберемся с настройкой гиперпараметров
Мы собираемся использовать набор данных рака молочной железы, чтобы понять GridSearchCV и RandomizedSearchCV.
Во-первых, давайте узнаем, что такое гиперпараметр.
Мы знаем, что существует множество алгоритмов машинного обучения, таких как машина опорных векторов (SVM), дерево решений, логистическая регрессия, линейная регрессия, случайный лес и т. д. Эти алгоритмы используются для построения моделей машинного обучения.
И иногда, когда мы реализуем эти алгоритмы в нашей программе, мы склонны передавать некоторые параметры, если мы используем классификатор опорных векторов, который обычно реализуется как SVC(), мы передаем некоторые параметры, такие как 'C', "ядро" и т. д.
Эти параметры могут иметь несколько значений, например, мы можем задать для параметра 'kernel' такие значения, как 'linear', 'rbf', 'sigmoid', 'poly', или 'предварительно рассчитанный'.
Мы никогда не узнаем, какое значение передать нашему параметру kernel, который даст наилучшую модель, способную дать хорошие результаты.
Эти параметры, которые передаются нашей модели, называются гиперпараметрами.
Чтобы найти лучший гиперпараметр для нашей модели, нам нужно выполнить настройку гиперпараметра. Есть 2 способа найти лучший гиперпараметр для нашей модели:
- GridSearchCV()
- Рандомизированный поиск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
Если вы запустите ячейки кода и просмотрите выходные данные, вы поймете эту концепцию более четко, поскольку выходные данные слишком велики, и я не могу включить их в этот блог.
Вот и все.