集成学习-Task4

DataWhale集成学习-Task4


记录 DataWhale集成学习的组队学习过程,Task4主要介绍的是超参数调节。

概念

我们可以使用梯度方法等优化算法训练算法的参数,那超参数指的又是什么呢。首先,超参数和模型的普通参数都是未知的参数,都会对模型的性能产生影响。区别在于,超参数会直接影响模型的复杂度,我们在确定模型的超参数后才能对模型进行训练,在一定程度上,模型的超参数决定了模型性能的上限。所以超参数的调节对算法性能影响还是很大的。

超参数调节方法

常用的超参数调节方法还是手动调节,先确定一个超参数的调节范围,然后带入模型中,通过模型的正确率来决定使用哪一组超参数。当然,sklearn为我们提供了一些自动化的工具。
1 . 网格搜索,顾名思义,就是给出超参数的范围内的具体的取值,然后在多个超参数之间做笛卡尔乘积代入模型。很显然会产生组合爆炸问题,且耗时很长。
2 .随机搜索。随机搜索就是网格搜索的一个特例,只不过是不再指定每个参数具体的取值,而是在一定范围内生成随机数,这样可以大幅度降低超参搜索的时间。Random search for hyper-parameter optimization这篇论文中,作者证明了随机搜索在效率层面优于网格搜索。
在这里插入图片描述
3 .黑箱优化算法。可以把超参数搜索等效为一个黑箱优化问题,然后使用遗传算法粒子群算法等玄学算法来解决这个问题,虽然使用这种玄学算法做超参数优化一直是水论文的重灾区吧(划掉)。

实践

还是以波士顿房价数据集为例,我们以SVR算法为例,对比一下网格搜索和随机搜索

#一些必要的库
import numpy as np 
from sklearn.svm import SVR     # 引入SVR类
from sklearn.preprocessing import StandardScaler # 由于SVR基于距离计算,引入对数据进行标准化的类
from sklearn.model_selection import GridSearchCV  # 引入网格搜索调优
from sklearn.model_selection import cross_val_score # 引入K折交叉验证
from sklearn import datasets
from sklearn.pipeline import Pipeline
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform  
import time

#sklearn自带的波士顿房价数据集
boston = datasets.load_boston()    
X = boston.data
y = boston.target
features = boston.feature_names

#网格搜索
pipe_svr = Pipeline([("StandardScaler",StandardScaler()),("svr",SVR())])
param_range = np.arange(0.1,1,0.1)
param_grid = {"svr__C":param_range,
			  "svr__gamma":param_range,
			  "svr__kernel":["rbf","linear"]}
start=time.time()
gs = GridSearchCV(estimator=pipe_svr,param_grid = param_grid,scoring = 'r2',cv = 10)     
gs = gs.fit(X,y)
print("网格耗时:",time.time()-start)
print("网格搜索最优得分:",gs.best_score_)
print("网格搜索最优参数组合:\n",gs.best_params_)


#随机搜索
pipe_svr = Pipeline([("StandardScaler",StandardScaler()),("svr",SVR())])
distributions = dict(svr__C=uniform(0.1,1),   
                     svr__kernel=["linear","rbf"], 
                    svr__gamma=uniform(0.1,1))

start=time.time()
rs = RandomizedSearchCV(estimator=pipe_svr,param_distributions = distributions,scoring = 'r2',cv = 10)       # 10折交叉验证
rs = rs.fit(X,y)
print("随机搜索耗时:",time.time()-start)
print("随机搜索最优得分:",rs.best_score_)
print("随机搜索最优参数组合:\n",rs.best_params_)

网格搜索结果:
网格搜索耗时: 11.464666843414307 s
网格搜索最优得分: 0.4787311691744021
网格搜索最优参数组合:
 {'svr__C': 0.1, 'svr__gamma': 0.1, 'svr__kernel': 'linear'}

随机搜索结果:
随机搜索耗时: 0.8250839710235596 s
随机搜索最优得分: 0.4715862467277853
随机搜索最优参数组合:
 {'svr__C': 0.34398084050500044, 'svr__gamma': 0.42332117032083416, 'svr__kernel': 'linear'}

从结果可以看出,随机搜索和网格搜索结果相差不大,但是,网格搜索的耗时是随机搜索的将近14倍。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值