机器学习 | 基于网格搜索的SVM超参数调节

机器学习模型被定义为一个数学模型,其中包含许多需要从数据中学习的参数。然而,有一些参数,称为超参数,这些参数不能直接学习。它们通常是由人类在实际训练开始前根据直觉或经验和试验选择的。这些参数通过提高模型的性能(例如其复杂性或学习率)来展示其重要性。模型可以有许多超参数,找到参数的最佳组合可以被视为搜索问题。

SVM也有一些超参数(如使用什么C或伽马值),找到最佳超参数是一个非常困难的任务。但它可以通过尝试所有组合来找到,看看什么参数最有效。它背后的主要思想是创建一个超参数网格,并尝试所有的组合(因此,这种方法被称为网格搜索Gridsearch。)

Scikit-learn中内置的GridSearchCV采用一个字典来描述可以在模型上尝试的参数来训练它。参数网格被定义为字典,其中键是参数,值是要测试的设置。

本文演示了如何使用GridSearchCV搜索方法来找到最佳超参数,从而提高准确性/预测结果。

导入必要的库并获取数据

import pandas as pd 
import numpy as np 
from sklearn.metrics import classification_report, confusion_matrix 
from sklearn.datasets import load_breast_cancer 
from sklearn.svm import SVC 

cancer = load_breast_cancer() 

# The data set is presented in a dictionary form: 
print(cancer.keys()) 

输出

dict_keys(['data', 'target', 'target_names', 'DESCR', 'feature_names', 'filename'])

现在,我们将所有特征提取到新的数据框中,并将目标特征提取到单独的数据框中。

df_feat = pd.DataFrame(cancer['data'], 
					columns = cancer['feature_names']) 

# cancer column is our target 
df_target = pd.DataFrame(cancer['target'], 
					columns =['Cancer']) 

print("Feature Variables: ") 
print(df_feat.info()) 

输出
机器学习 | 基于网格搜索的SVM超参数调节_第1张图片

print("Dataframe looks like : ") 
print(df_feat.head()) 

机器学习 | 基于网格搜索的SVM超参数调节_第2张图片

划分训练集和测试集

现在,我们将以70:30的比例将数据分为训练集和测试集

from sklearn.model_selection import train_test_split 

X_train, X_test, y_train, y_test = train_test_split( 
						df_feat, np.ravel(df_target), 
				test_size = 0.30, random_state = 101) 

1. 训练基于无需超参数调整的SVM

首先,我们将通过调用标准SVC()函数来训练我们的模型,而不进行超参数调整,并查看其分类和混淆矩阵。

# train the model on train set 
model = SVC() 
model.fit(X_train, y_train) 

# print prediction results 
predictions = model.predict(X_test) 
print(classification_report(y_test, predictions)) 

输出
机器学习 | 基于网格搜索的SVM超参数调节_第3张图片
我们有61%的准确率,但你有没有注意到一些奇怪的事情?

注意,类0的查全率和查准率始终为0。这意味着分类器总是把所有东西都分类到一个类中,即类1!这意味着我们的模型需要调整其参数。

这就是GridSearch的用处。我们可以使用GridSearch搜索参数!

2.使用GridsearchCV

GridSearchCV的一个伟大之处在于它是一个元估计器。它采用像SVC这样的估计器并创建一个新的估计器,其行为完全相同。在这种情况下,就像分类器一样。您应该添加 refit=True 并选择verbose到您想要的任何数字,数字越大,越详细(verbose只是表示描述过程的文本输出)。

from sklearn.model_selection import GridSearchCV 

# defining parameter range 
param_grid = {'C': [0.1, 1, 10, 100, 1000], 
			'gamma': [1, 0.1, 0.01, 0.001, 0.0001], 
			'kernel': ['rbf']} 

grid = GridSearchCV(SVC(), param_grid, refit = True, verbose = 3) 

# fitting the model for grid search 
grid.fit(X_train, y_train) 

fit所做的事情比平常要复杂一些。首先,它使用交叉验证运行相同的循环,以找到最佳参数组合。一旦找到最佳组合,它会对传递给拟合的所有数据再次运行拟合(没有交叉验证),以使用最佳参数设置构建一个新模型。

您可以在best_params_ attribute中检查GridSearchCV找到的最佳参数,并在best_estimator_ attribute中检查最佳估计量:

# print best parameter after tuning 
print(grid.best_params_) 

# print how our model looks after hyper-parameter tuning 
print(grid.best_estimator_) 

输出
机器学习 | 基于网格搜索的SVM超参数调节_第4张图片
然后,您可以重新运行预测并查看此网格对象的分类报告,就像使用普通模型一样。

grid_predictions = grid.predict(X_test) 

# print classification report 
print(classification_report(y_test, grid_predictions)) 

输出
机器学习 | 基于网格搜索的SVM超参数调节_第5张图片
我们已经得到了近95%的预测结果。

你可能感兴趣的:(机器学习,机器学习)