Machine Learning 18 模型优化----算法调参

模型有很多参数,如何找到最佳的参数组合?

调整参数何时为止:应该遵循偏差和方差协调的原则。

本章将介绍:

  • 调整参数对机器学习的重要性
  • 如何使用网格搜索优化参数
  • 如何使用随机搜索优化参数

机器学习算法调参

调整算法参数是采用机器学习解决问题的最后一个步骤,有时也被称为超参数优化。

参数可以分为两种:一种是影响模型在训练集上的准确度或防止过拟合能力的参数;另一种是不影响这两者的参数。

模型在样本总体上的准确度由其在训练集上的准确度及其防止过拟合的能力共同决定,所以在调参时主要针对第一种参数进行调整,最终达到的效果是:模型在训练集上的准确度和防止过拟合能力的完美共处。

下面将介绍两种自动寻找最优化参数的算法:

  • 网格搜索优化参数
  • 随机搜索优化参数

网格搜索优化参数

 网格搜索优化参数是通过遍历已定义参数列表,来评估算法的参数,从而找到最优参数。

在scikit-learn中使用GridSearchCV来实现对参数的跟踪,调整与评估,从而找到最优参数。

网格搜索优化参数适用于三四个(或更少)的超参数(当超参数的数量增加时,网格搜索的计算复杂度会呈现指数型增长,这时要换用随机搜索),由用户列出一个较小的超参数值域,这些超参数值域的笛卡尔集(排列组合)为一组组超参数。

网格搜索算法使用每组超参数训练模型,并挑选验证集误差最小的超参数组合。

下面的例子是展示如何使用GridSearchCV来调整脊回归(Ridge)的参数。GridSearchCV使用字典对象来指定需要调参的参数,可以同时对一个或多个参数进行参数调整。

 1 #网格搜索优化参数
 2 from pandas import read_csv
 3 from sklearn.linear_model import Ridge
 4 from sklearn.model_selection import GridSearchCV
 5 
 6 filename='/home/aistudio/work/pima_data1.csv'
 7 names=['preg','plas','pres','skin','test','mass','pedi','age','class']
 8 data=read_csv(filename,names=names)
 9 #将数据分为输入数据和输出数据
10 array=data.values
11 x=array[:,0:8]
12 y=array[:,8]
13 #算法实例化
14 model=Ridge()
15 #设置要遍历的参数
16 param_grid={'alpha':[1,0.1,0.01,0.001,0]}
17 
18 #通过网格搜索查询最优参数
19 grid=GridSearchCV(estimator=model,param_grid=param_grid)
20 grid.fit(x,y)
21 #搜索结果
22 print('最高得分:%.3f' % grid.best_score_)
23 print('最优参数: %s' % grid.best_estimator_.alpha)

param_grid是一个字典对象,以算法的参数名为key,需要遍历的参数值列表为value。在验证算法最优参数的网格搜索算法中,可以设定多个key:value对,同时查询多个参数的最优参数值。

执行结果:

最高得分:0.280
最优参数: 1

随机搜索优化参数

通过固定次数的迭代,采用随机采样分布的方式搜索合适的参数。
与网格搜索优化相比,随机搜索提供了一种更高效的解决方法(特别是在参数数量多的情况下),随机搜索优化参数为每个参数定义了一个分布函数,并在该空间中采样。
在scikit-learn中通过RandomizedSearchCV类实现。
下面例子是通过RandomizedSearchCV对脊回归算法的参数进行100次迭代,并从中选择最优的参数。
Scipy中的uniform是一个均匀随机采样函数,默认生成0与1之间的随机采样数值。在这里利用uniform对参数进行随机采样。
 1 #随机搜索优化参数
 2 from pandas import read_csv
 3 from sklearn.linear_model import Ridge
 4 from sklearn.model_selection import RandomizedSearchCV
 5 from scipy.stats import uniform
 6 
 7 filename='/home/aistudio/work/pima_data1.csv'
 8 names=['preg','plas','pres','skin','test','mass','pedi','age','class']
 9 data=read_csv(filename,names=names)
10 #将数据分为输入数据和输出数据
11 array=data.values
12 x=array[:,0:8]
13 y=array[:,8]
14 #算法实例化
15 model=Ridge()
16 #设置要遍历的参数
17 param_grid={'alpha':uniform()}
18 
19 #通过网格搜索查询最优参数
20 grid=RandomizedSearchCV(estimator=model,param_distributions=param_grid, n_iter=100,random_state=7)
21 grid.fit(x,y)
22 #搜索结果
23 print('最高得分:%.3f' % grid.best_score_)
24 print('最优参数: %s' % grid.best_estimator_.alpha)
最高得分:0.280
最优参数: 0.9779895119966027

猜你喜欢

转载自www.cnblogs.com/yuzaihuan/p/12935043.html