在模型选定后,一般还需进行模型的参数调优工作,介绍两种模型调优的基本方式:网格搜索寻优(Grid Search CV)和随机搜索寻优(Randomized Search CV)
1.1 网格搜索寻优
网格搜索寻优其实是一种暴力寻优方法
将模型的参数放在网格中,通过遍历,用交叉验证对参数空间进行求解,寻找最佳的参数
scikit-learn实现如下:
from sklearn.model_selection import GridSearchCV
GridSearchCV(estimator, #指定需要调优的机器学习模型
param_grid, #给出机器学习要优化的参数(以字典或列表的形式)
scoring = None, #模型评价标准,默认None,使用estimator的误差估计函数;也可以采用accuracy、roc_auc等等
cv = None, #确定S折交叉验证的S值,默认值为3
n_jobs = 1, #指定计算机运行使用的CPU核数,默认-1,表示使用所有可用的CPU核
refit = True) #默认True,表示在参数优化之后使用整个数据集来重新训练该最优的estimator
属性:
best_params_:模型的最优参数
best_score_:最优模型评估分数
best_estimator_:最优模型对象
方法:
fit(X_train, y_train):在训练集(X_train, y_train)上训练模型
score(X_test,y_test):返回模型在验证集(X_test, y_test)上的预测准确率
predict(X):用训练好的模型来预测待预测数据集X,返回数据为预测集对应的结果标签y
predict_proba(X):返回一个数组,数组的元素依次是预测集X属于各个类别的概率
predict_log_proba(X):返回一个数组,数组的元素依次是预测集X属于各个类别的对数概率
数据生成:
import numpy as np
from sklearn import datasets #自带数据集
iris = datasets.load_iris() #加载sklearn自带的数据集
X = iris.data #这是数据
y = iris.target #这是每个数据所对应的标签
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=1/3,random_state=3) #这里划分数据以1/3的来划分训练集训练结果 验证集测试结果
print(X_train[:5])
print(y_train)
鸢尾花数据集部分输出:
训练模型及调优:
from sklearn.model_selection import train_test_split #划分数据
import sklearn.svm as svm #导入svm函数
import sklearn.model_selection as ms #导入GridSearchCV函数
# 向量分类器
model = svm.SVC(probability=True)
# 基于网格搜索获取最优模型
params = [
{'kernel':['linear'],'C':[1,10,100,1000]},
{'kernel':['poly'],'C':[1,10],'degree':[2,3]},
{'kernel':['rbf'],'C':[1,10,100,1000],
'gamma':[1,0.1, 0.01, 0.001]}]
model = ms.GridSearchCV(estimator=model, param_grid=params, cv=5)
model.fit(X_train,y_train)
模型评估:
print("模型的最优参数:",model.best_params_)
print("最优模型分数:",model.best_score_)
print("最优模型对象:",model.best_estimator_)
print("预测准确率:",model.score(X_test, y_test))
print("验证集X_test属于各个类别的概率:\n",model.predict_proba(X_test)[:5])
print("验证集X_test属于各个类别的对数概率:\n",model.predict_log_proba(X_test)[:5])
评估结果部分输出:
1.2 随机搜索寻优
在参数较少时可以使用暴力寻优,但当参数过多,或参数为连续取值时,暴力寻优不可取,所以提出随机搜索寻优的方式:对参数连续值做采样,从中挑取一些值作为代表
scikit-learn实现如下:
from sklearn.model_selection import RandomizedSearchCV
RandomizedSearchCV(estimator,
param_distributions, #参数搜索范围,可以是字典或列表
n_iter=10, #随机搜索次数,默认10
scoring=None,
cv=None,
n_jobs=1,
refit=True,
return_train_score=False,#是否返回训练集的评分,默认False
random_state=None #随机种子,默认为None
)
参数中大部分与网格搜索寻优参数相同,属性和方法完全相同