| 图源
机器学习模型的参数,分为可学习参数(以下直接称为参数,Parameter,P)和超参数(Hyper Parameter, HP)。如果说参数是输入空间到输出空间映射的微观实现者,超参数就是模型结构,模型复杂度和正则化程度等的宏观调控者。研究表明,与使用默认超参数相比,根据数据进行超参数优化(Hyper Parameter Optimize,HPO)之后,模型表现往往会有提升。在参数空间的目标函数往往是可微甚至是凸的,如参数空间的MSE,交叉熵,KL散度等,所以可以直接通过传统的优化方法,如坐标下降法,梯度法或牛顿法等,搜索到使目标函数取得局部最优或者最优值时的参数值。而在超参数空间的目标函数往往是不可微,非凸的,如超参数空间的准确率,MSE,MAE等,传统的优化方法往往起不了作用,这时就需要新的空间搜索方法或者新的优化方法。
超参数可以分为连续超参数(如岭回归的乘法系数alpha),离散超参数(如随机森林的决策树颗数)和分类超参数(如SVM的核类型)等。最简单,暴力的超参数优化方法当属网格搜索(Grid Search,GS),其次是随机搜索(Random Search,RS),它们都不考虑之前搜索到的超参数的好坏,搜索之间相互独立,这会浪费大量时间来搜索超参数空间中表现不佳的区域,不过也正是因为独立,使得这两种方法都可以并行处理。贝叶斯优化(Bayesian optimization,BO)搜索,则是根据先前获得的搜索结果,来确定未来的超参数取值点,同时考虑最可能出现最佳超参数的区域,和未曾搜索的区域,使得搜索可能更加精确和有效,不过也是因为前后的关联性,使得基于BO的方法难以并行化。元启发式搜索算法中遗传算法(GA),和粒子群算法(PSO)经常被用来做HPO,这种基于种群的搜索算法,可以在考虑之前搜索结果的同时可以进行并行化处理。
每种HPO方法都有其优缺点和适用情形,这次的博客主要是根据2020年Neurocomputing(神经计算)上的一篇综述性文章:On hyperparameter optimization of machine learning algorithms:Theory and practice(关于机器学习算法的超参数优化:理论与实践)来系统的梳理和学习常用的机器学习超参数优化方法,共分为上中下三篇:
Python机器学习——机器学习模型超参数优化HPO(上)——网格搜索,随机搜索 Python机器学习——机器学习模型超参数优化HPO(中)——贝叶斯优化搜索 Python机器学习——机器学习模型超参数优化HPO(下)——元启发式搜索
copyright ? 意疏:https://blog.csdn.net/sinat_35907936/article/details/120917366
模型、数据与评估方式
1、模型
关于机器学习算法的超参数优化:理论与实践论文中比较了KNN,随机森林和SVM等常用分类回归模型,由于本博客目的是学习,而不是验证,故只选用了支持向量机(SVM)。SVM通过最大化分类间隔来实现分类或者在平滑约束下最小化误差来实现回归,在麦瑟定理下,通过核,把特征映射到其他空间下SVM可能获得更好的性能。它的超参数包括连续超参数:惩罚系数C和核函数参数——如RBF核的gamma,ploy核的degree等详见,和类别超参数:核类型,如linear 和rbf 等,具体如下表所示。
model | Hyper Parameter | Type | Space |
---|
SVC | C | continuous | >0 | | gamma | continuous | >0 | | coef0 | continuous | R | | kernel | categorical | {‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’} | | degree | Discrete | >1 |
2、数据
关于机器学习算法的超参数优化:理论与实践论文中采用了手写数字(Mnist)数据集来作为分类评估数据集,用波士顿房价数据集来作为回归的评估数据集,它们都可以通过scikit-learn 的datasets 接口获取。同样,本博客只使用手写数字数据集来做分类,scikit-learn 提供的接口中包含1797张8x8的图像。
from sklearn import datasets
digits = datasets.load_digits()
data, target = digits['data'], digits['target']
print(data.shape, target.shape)
(1797, 64) (1797,)
3、评估
超参数好坏的评估方式采用与文章相同的方式,即准确率,并且以三次交叉验证的平均结果作为评估结果,并记录超参数搜索时间。代码参考。
网格搜索(Grid Search,GS)
1、简介
网格搜索(Grid Search,GS)应该是最简单,最直接,也是最常用的超参数优化(HPO)方法。通过在每种超参数的取值范围上,分别进行简单采样来获得数量较少的离散超参数取值,然后对采样后的每种超参数取值进行组合,即笛卡尔积,每一种组合都是笛卡尔坐标系网格中的一个点,因此它被称作网格搜索。最后对所有组合进行独立进行评估,以找出最好的超参数取值组合,此步骤可并行处理。网格搜索时间复杂度为O(n^k),其中n为超参数取值个数,k为超参数种类,这也就意味着当超参数取样间隔很小,且超参数种类很多时,将会出现 维度灾难。网格搜索的采样间隔和采样区间都需要手动设置,并且它对每个超参数取值组合都一视同仁,独立评估,这可能会使得大量时间被花费在不太好的参数组合上。
2、实现
对于离散超参数,可以不进行采样,也可以进行采样以减少取值数量。对于连续超参数,必须进行采样。对于类别型超参数,可以根据需要只取其中几个。
未完待续
为了在1024程序猿节结束之前发出来,剩下的就接下来的几天再补全吧。请继续关注。
随机搜索(Random Search,GS)
1、简介
图源
2、实现
|