神经网咯是有许多超参数决定的,例如网络深度,学习率,正则等等。如何寻找最好的超参数组合,是一个老人靠经验,新人靠运气的任务。
穷举搜索 Grid Search 效率太低;随机搜索比穷举搜索好一点;目前比较好的解决方案是贝叶斯优化
这里本来想用kaggle的lgb贝叶斯优化,但是对新手不太友好,就使用这个博客中的例子
sklearn.cross_validation 已经废弃,改为:sklearn.model_selection
不调参数的结果:
建立贝叶斯优化对象
里面的第一个参数是我们的优化目标函数,第二个参数是我们所需要输入的超参数名称,以及其范围。超参数名称必须和目标函数的输入名称一一对应。
开始优化:
优化结果:
寻找最大值:
但是我使用这个就会报错,所以就简单写了一个循环寻找最大值的索引:
上面bayes算法得到的参数并不一定最优,当然我们会遇到一种情况,就是我们已经知道有一组或是几组参数是非常好的了,我们想知道其附近有没有更好的。这个操作相当于上文bayes优化中的Explore操作,而bayes_opt库给了我们实现此方法的函数:
这里我们添加了三组较优的超参数,让其在该参数基础上进行explore,可能会得到更好的结果。
同时,我们还可以修改高斯过程的参数,高斯过程主要参数是核函数(kernel),还有其他参数可以参考sklearn.gaussianprocess:
如果kernel是None,1.0 * RBF(1.0)被用来当成默认的kernel。
但是从某种角度上来说,贝叶斯优化也是另外一种瞎猜。。。