记录 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倍。