hyperopt(https://github.com/hyperopt/hyperopt)是一个用Python编写的分布式异步的超参优化工具。
本文代码地址:https://github.com/TQCAI/hyperopt-simple-cfg
文章目录
令人抓狂的配置
如果用hyperopt搜索一些算法的超参空间,会发现很难写配置。以svm为例,kernel可以取linear
,rbf
等,不同的核函数又对应不同的参数,如rbf
需要再配置gamma
,而poly
更是要配置gamma
,coef0
,degree
三个参数。gamma
参数又可以是auto
或者程序员指定的数值。是不是脑壳痛?
脑壳痛不要紧,代码慢慢编呗。于是笔者依照hyperopt的文档写出了如下的超参空间的配置:
- svm超参空间配置代码
space = {
'C': hp.uniform('C', 0.001, 1000),
'shrinking': hp.choice('shrinking', [True, False]),
'kernel': hp.choice('kernel', [
{
'name': 'rbf',
'gamma': hp.choice('rbf_gamma', ['auto', hp.uniform('rbf_gamma_uniform',0.0001, 8)])
},
{
'name': 'linear',
},
{
'name': 'sigmoid',
'gamma': hp.choice('sigmoid_gamma', ['auto', hp.uniform('sigmoid_gamma_uniform',0.0001, 8)]),
'coef0': hp.uniform('sigmoid_coef0', 0, 10)
},
{
'name': 'poly',
'gamma': hp.choice('poly_gamma', ['auto', hp.uniform('poly_gamma_uniform',0.0001, 8)]),
'coef0': hp.uniform('poly_coef0', 0, 10),
'degree': hp.uniformint('poly_degree', 1, 5),
}
])
}
主要费劲的地方有两个。
- hyperopt的超参需要申明
label
,并且label相当于是超参的变量名,是不可以重复的。所以笔者要费劲地给不同核函数参数的gamma
变量命名。想什么rbf_gamma
啦,sigmoid_gamma
啦,真是令人头秃。 - 第二就是在写优化目标函数的时候,需要程序员硬编码一下。如下:
- svm目标函数代码
def svm_from_cfg(cf