机器学习的参数调整是为了更好的模型拟合度,那么其评估标准是什么,如何调整参数来提升模型的整体效果呢?
调参的方式总是根据数据的状况而定,所以没有办法一概而论。
通过画学习曲线,或者网格搜索,能够探索到调参边缘(代价可能是训练一次模型要跑三天三夜),“业界广泛流传:数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已”。但是在现实中,高手调参恐怕还是多依赖于经验,而这些经验,来源于:
1)正确的调参思路和方法,
2)对模型评估指标的理解,
3)对数据的感觉和经验,
4)用洪荒之力去不断地尝试。
对模型评估指标的理解和调参的思路。
调参思路
模型调参,第一步是要找准目标:我们要做什么?一般来说,这个目标是提升某个模型评估指标,比如对于随机森林来说,我们想要提升的是模型在未知数据上的准确率(由score或oob_score_来衡量)。找准了这个目标,就要思考:模型在未知数据上的准确率受什么因素影响?在机器学习中,用来衡量模型在未知数据上的准确率的指标,叫做泛化误差(Genelization error)。
泛化误差
当模型在未知数据(测试集或者袋外数据)上表现糟糕时,我们说模型的泛化程度不够,泛化误差大,模型的效果不好。泛化误差受到模型的结构(复杂度)影响。看下面这张图,它准确地描绘了泛化误差与模型复杂度的关系,当模型太复杂,模型就会过拟合,泛化能力就不够,所以泛化误差大。当模型太简单,模型就会欠拟合,拟合能力就不够,所以误差也会大。只有当模型的复杂度刚刚好的才能够达到泛化误差最小的目标。
那模型的复杂度与参数有什么关系呢?对树模型来说,树越茂盛,深度越深,枝叶越多,模型就越复杂。所以树模型是天生位于图的右上角的模型,随机森林是以树模型为基础,所以随机森林也是天生复杂度高的模型。随机森林的参数,都是向着一个目标去:减少模型的复杂度,把模型往图像的左
边移动,防止过拟合。当然了,调参没有绝对,也有天生处于图像左边的随机森林,所以调参之前,要先判断,模型现在究竟处于图像的哪一边。
泛化误差的背后其实是“偏差-方差困境”,只需要记住这四点:
1)模型太复杂或者太简单,都会让泛化误差高,我们追求的是位于中间的平衡点;
2)模型太复杂就会过拟合,模型太简单就会欠拟合;
3)对树模型和树的集成模型来说,树的深度越深,枝叶越多,模型越复杂;
4)树模型和树的集成模型的目标,都是减少模型复杂度,把模型往图像的左边移动。
具体到每个参数,如何影响复杂度和模型?调参,都是在学习曲线上轮流找
最优值,盼望能够将准确率修正到一个比较高的水平。然而,现在了解了随机森林的调参方向:降低复杂度,就可以将那些对复杂度影响巨大的参数挑选出来,研究他们的单调性,然后专注调整那些能最大限度让复杂度降低的参数。对于那些不单调的参数,或者反而会让复杂度升高的参数,视情况使用,大多时候甚至可以退避。基于经验,对各个参数对模型的影响程度做一个排序。调参时,可以参考这个顺序。
n_estimators :提升至平稳,n_estimators↑,不影响单个模型的复杂度 ⭐⭐⭐⭐
max_depth :有增有减,默认最大深度,即最高复杂度,向复杂度降低的方向调参max_depth↓,模型更简单,且向图像的左边移动 ⭐⭐⭐
min_samples_leaf :有增有减,默认最小限制1,即最高复杂度,向复杂度降低的方向调参min_samples_leaf↑,模型更简单,且向图像的左边移动 ⭐⭐
min_samples_split :有增有减,默认最小限制2,即最高复杂度,向复杂度降低的方向调参min_samples_split↑,模型更简单,且向图像的左边移动 ⭐⭐
max_features :有增有减,默认auto,是特征总数的开平方,位于中间复杂度,既可以向复杂度升高的方向,也可以向复杂度降低的方向调参 max_features↓,模型更简单,图像左移 max_features↑,模型更复杂,图像右移 max_features是唯一的,既能够让模型更简单,也能够让模型更复杂的参数,所以在调整这个参数的时候,需要考虑我们调参的方向 ⭐
criterion :有增有减,一般使用gini,影响程度看具体情况
通过参数的变化来了解,模型什么时候到达了极限,当复杂度已经不能再降低的时候,就不必再调整了,因为调整大型数据的参数是一件非常费时费力的事。除了学习曲线和网格搜索,现在有了基于对模型和正确的调参思路的“推测”能力,这能够让调参能力更上一层楼。