机器学习工程实践——模型调优

在模型选定后,一般还需进行模型的参数调优工作,介绍两种模型调优的基本方式:网格搜索寻优(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

属性:

\bullet        best_params_:模型的最优参数

\bullet        best_score_:最优模型评估分数

\bullet        best_estimator_:最优模型对象
方法:

\bullet        fit(X_train, y_train):在训练集(X_train, y_train)上训练模型

\bullet        score(X_test,y_test):返回模型在验证集(X_test, y_test)上的预测准确率

\bullet        predict(X):用训练好的模型来预测待预测数据集X,返回数据为预测集对应的结果标签y

\bullet        predict_proba(X):返回一个数组,数组的元素依次是预测集X属于各个类别的概率

\bullet        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
	)

参数中大部分与网格搜索寻优参数相同,属性和方法完全相同

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值