详解Python中4种超参自动优化算法的实现_第1页
详解Python中4种超参自动优化算法的实现_第2页
详解Python中4种超参自动优化算法的实现_第3页
详解Python中4种超参自动优化算法的实现_第4页
详解Python中4种超参自动优化算法的实现_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第详解Python中4种超参自动优化算法的实现print('详细结果:\n',pd.DataFrame.from_dict(clf.cv_results_))

print('最佳分类器:\n',clf.best_estimator_)

print('最佳分数:\n',clf.best_score_)

print('最佳参数:\n',clf.best_params_)

详细结果:

mean_fit_timestd_fit_timemean_score_timestd_score_timeparam_C...split3_test_scoresplit4_test_scoremean_test_scorestd_test_scorerank_test_score

00.0005980.0004890.0002000.0004006.4538...0.9666671.00.9866670.0163301

10.0009970.0000020.0000000.0000004.99782...0.9666671.00.9800000.0266673

20.0007980.0003990.0003990.0004883.81406...0.9666671.00.9800000.0163303

30.0005980.0004880.0002000.0003995.36286...0.9666671.00.9866670.0163301

[4rowsx15columns]

最佳分类器:

SVC(C=6.453804509266643)

最佳分数:

0.9866666666666667

最佳参数:

{'C':6.453804509266643,'kernel':'rbf'}

相比于网格搜索,sklearn随机搜索中主要改变的参数是param_distributions,负责提供超参值分布范围。

三、贝叶斯优化(BayesianOptimization)

我写本文的目的主要是冲着贝叶斯优化来的,一直有所耳闻却未深入了解,所以我就来查漏补缺了。以下内容主要基于DuaneRich在《HowdoesBayesianoptimizationwork》的回答。

调优的目的是要找到一组最优的超参组合,能使目标函数f达到全局最小值。

举个例子,若学习率设置过大,模型可能会在代价函数的全局最优点附近不断来回震荡,甚至跳出全局最优点,而设置过小,又可能会陷入局部最优,因此调学习率这一参数,是为了让模型能收敛到代价函数的全局最小值。可是在机器学习中,目标函数常是被称作expensiveblackboxfunction,计算开销大且不一定为凸函数。为此,贝叶斯优化出现了,它特别适合针对expensiveblackboxfunction找到全局最优。

假设我们的真实的目标函数长下图这样:

图2:目标函数f(x)

注意:目标函数的是指超参数,我们希望找到最优的超参去得到最小的。为什么用虚线表示呢?因为它是黑箱函数(blackboxfunction)。

现在,我们怎么找到全局最小值点呢?我们能不能先在上随机采样10个点,然后取它们的最小值呢?

图3:随机采样10个点的目标函数f(x)

图3里确实有个点挺靠近全局最优点的,那是不是在它附近再采样几个点,不断重复就行了?没那么简单,万一起始采样点在局部最小值附近,那这种方法会很容易陷入局部最优。关于如何找到下一个合适的点这个问题,我们先放一放,因为我们漏掉一个重点:每次尝试一种超参值,计算的代价是昂贵的,为了减轻开销,贝叶斯优化采用了代理模型(surrogatemodel),代理模型可以被看作是一个简单模型去拟合原本复杂且不好理解的模型,简单来说,就是计算太昂贵了,我们就用代理模型去代替它。

贝叶斯优化使用了**高斯过程(gasussianprocesses,GP)**去构建代理模型,高斯过程的细节这里暂时不讲,有兴趣的小伙伴可以自行查阅资料了解。基于给定的输入和输出,GP会推断出一个模型(这里为代理模型)。假设我们从昂贵的采样了4个点,然后我们把这4个点交给GP,它会返回一个代理模型,如下图所示:

图4:目标函数f(x)和代理模型

绿色实线就是GP猜的代理模型,绿色条带是输出分布的标准差(即为Uncertainty)。我们有了代理模型,后续我们去找下一个合适的超参值,就能带入到计算开销相对较小的代理模型中,评估给定超参值的情况。

现在,我们来思考回之前提到的问题:如何找到下一个合适的点,这个问题本质是在问:哪里有全局最小的点?,为了解决这个问题,我们要关注两个地方:

(1)已开发区域:在绿色实线上最低的超参点。因为很可能它附近存在全局最优点。

(2)未探索区域:绿色实线上还未被探索的区域。比如图4,相比于0.15-0.25区间,0.65-0.75区间更具有探索价值(即该区间Uncertainty更大)。探索该区域有利于减少我们猜测的方差。

为了实现以上探索和开发的平衡(exploration-exploitationtrade-off),贝叶斯优化使用了采集函数(acquisitionfunction),它能平衡好全局最小值的探索和开发。采集函数有很多选择,其中最常见的是expectatedofimprovement(EI),我们先看一个utilityfunction:

是目前观察到的最小值,是超参值,我们希望上述utilityfunction输出越大越好(即找到的能获得比当前最小值还小),基于,EI采集函数如下所示:

具有最高的EI的超参值会被选择。EI有两部分:

(1)减少均值函数,提高EI。

(2)增加方差,提高EI。

所以EI的提高是建立在均值和方差的trade-off,也是exploration和exploitation的trade-off。

图5:采集函数A(x)

图5我们可以看到,时EI最大,所以我们下一个超参值应该选1。

讲到这里,我们来看下完整的贝叶斯优化步骤是怎样的:

图6:贝叶斯优化-SMBO

SMBO是简洁版的贝叶斯优化,伪代码如图6所示,具体如下:

(1)准备输入:expensiveblackboxfunction,超参搜索空间,采样数据集(超参组合,对应输出值),采集函数和用数据集拟合的代理模型M。

(2)基于和,采样得到数据集。

(3)循环选次参数:

用当前数据集拟合代理模型,实现模型更新。

选择使采集函数最大的超参组合。

将带入中,得到输出值。(注意这里的计算开销大)

将新的加入到现有数据集中。

目前,Hyperopt开源代码库已实现基于**TPE(Tree-structuredParzenEstimatorApproach)**的贝叶斯优化,图6我们能看到GP构建的概率模型是,而TPE是和,关于TPE和GP的对比讨论,建议阅读论文。TPE样例代码如下:

fromsklearnimportsvm,datasets

fromsklearn.model_selectionimportcross_val_score

fromhyperoptimporthp,fmin,tpe,space_eval

importpandasaspd

#导入数据

iris=datasets.load_iris()

#step1:定义目标函数

defobjective(params):

#初始化模型并交叉验证

svc=svm.SVC(**params)

cv_scores=cross_val_score(svc,iris.data,iris.target,cv=5)

#返回loss=1-accuracy(loss必须被最小化)

loss=1-cv_scores.mean()

returnloss

#step2:定义超参搜索空间

space={'kernel':hp.choice('kernel',['linear','rbf']),

'C':hp.uniform('C',1,10)}

#step3:在给定超参搜索空间下,最小化目标函数

best=fmin(objective,space,algo=tpe.suggest,max_evals=100)

返回:best_loss:0.013333333333333308(即accuracy为0.9866666666666667)

#step4:打印结果

print(best)

返回:{'C':6.136181888987526,'kernel':1}(PS:kernel为0-basedindex,这里1指rbf)

四、Hyperband

除了格子搜索、随机搜索和贝叶斯优化,还有其它自动调参方式。例如Hyperbandoptimization,Hyperband本质上是随机搜索的一种变种,它使用早停策略和SccessiveHalving算法去分配资源,结果是Hyperband能评估更多的超参组合,同时在给定的资源预算下,比贝叶斯方法收敛更快,下图展示了Hyperband的早停和资源分配:

图7:Hyperband的超参选择和评估

在Hyperband之后,还出现了BOHB,它混合了贝叶斯优化和Hyperband。Hyperband和BOHB的开源代码可参考HpBandSter库,这里不展开细讲。

总结

上面我们用Iris鸢尾花数据集试了不同的超参自动调优方法,发现贝叶斯优化和随机搜索都比格子搜索好。从一些论文反映,贝叶斯优化是更香的,但是贝叶斯优化好像在实践中用的不是那么多,网上也有很多分享者,像NageshSinghChauhan,说的那样:

Asageneralruleofthumb,anytimeyouwanttooptimizetuninghyperparameters,thinkGridSearchandRandomizedSearch![10]

HyperparameterOptimizationforMachineLearningModels-NageshSinghChauhan

为什么呢?我想原因是贝叶斯的开销太大了,前面有提到,在每次循环选超参值的时候,贝叶斯优化都需要将带入昂贵的目标函数中,去得到输出值y,当目标函数特别复杂时,这种情况的评估开销是很大的,更何况随着搜索空间和搜索次数的变大

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论