采用粒子群算法进行超参数调优——Optunity之PSO

数据挖掘与机器学习 fireling 1439℃

在机器学习问题中,调优模型往往有多个维度的参数,如何选择一组或几组配合起来比较好的参数成了训练模型的一个重头戏。那么如何进行超参数调优呢?比较常见的一种算法就是利用粒子群算法(Particle Swarm Optimization),简称PSO算法。

PSO算法最早是由Eberhart和Kennedy于1995年提出,它的基本概念源于对鸟群觅食行为的研究。设想这样一个场景:一群鸟在随机搜寻食物,在这个区域里只有一块食物,所有的鸟都不知道食物在哪里,但是它们知道当前的位置离食物还有多远。那么找到食物的最优策略是什么呢?最简单有效的就是搜寻目前离食物最近的鸟的周围区域

在粒子群算法中,实体被抽象为粒子,而粒子的位置就是所求问题的解。现在想求得最优解就是要找到更新粒子位置的模式,即如何更新粒子的位置,才能让算法更快更好的收敛到最优解。PSO算法中粒子是根据粒子本身历史的最优位置和整个群体的全优位置,在一定随机扰动的情况下决定下一步的移动方向。

PSO

Optunity是一个用于超参数优化的Python库,默认采用ParticleSwarm算法,同时提供GridSearch、RandomSearch、NelderMead等搜索算法。

举个例子,如果已知x范围从0~10,y的范围从-5到5,那么我们如何选定使得x*y最大的参数对(x,y)?

Optunity提供对目标函数最大或最小的寻优方向,你可以指定solver_name,指定评估次数num_evals,在Optunity中num_evals的大小决定了初始粒子的个数及粒子的代数。

官方代码中是这样根据给定num_evals的大小来设粒子个数粒子代数的:


d = dict(kwargs)
if num_evals > 1000:
    d['num_particles'] = 100
elif num_evals >= 200:
    d['num_particles'] = 20
elif num_evals >= 10:
    d['num_particles'] = 10
else:
    d['num_particles'] = num_evals
d['num_generations'] = int(math.ceil(float(num_evals) / d['num_particles']))
return d

解决上述问题很简单,代码如下:


#coding: utf-8
import optunity
optimal_rbf_pars, info, _ = optunity.maximize(lambda x, y: x*y,
                                              num_evals=500,
                                              solver_name='particle swarm',
                                              x=[0,10],
                                              y=[-5,5]) # default: 'particle swarm'

print optimal_rbf_pars
print info.optimum
df = optunity.call_log2dataframe(info.call_log)
print df.sort_values('value', ascending=False)[:10]

我们还可以看到,为了确保算法输出结果的稳定性,我们可以选择输出前N项比较好的参数组,输出结果如下:


{'y': 4.991027765517151, 'x': 9.478181060612743}
47.3058648401
         value         x         y
495  47.305865  9.478181  4.991028
484  46.724733  9.616617  4.858749
489  46.391770  9.420030  4.924801
487  45.655851  9.352395  4.881728
488  45.505145  9.355326  4.864089
464  45.481952  9.336617  4.871352
483  45.453607  9.536769  4.766143
490  44.589977  9.325475  4.781523
444  44.232113  9.056617  4.883955
499  44.078221  9.503687  4.638013

这个问题中,目标函数是x*y,参数维度也是x和y两个维度,同样的,我们可以把问题类推到更复杂的目标函数及更复杂的调参空间的情况。

 

转载请注明:宁哥的小站 » 采用粒子群算法进行超参数调优——Optunity之PSO

喜欢 (0)