我发现大多数的机器学习相关的书都是遍历各类算法和案例,为你们讲解各类各样算法的原理和用途,但却对调参探究甚少。这中间有许多缘由,其一是由于,调参的方式老是根据数据的情况而定,因此没有办法一律而论;其二是由于,其实你们也都没有特别好的办法。算法
经过画学习曲线,或者网格搜索,咱们可以探索到调参边缘(代价多是训练一次模型要跑三天三夜),可是在现实中,高手调参恐怕仍是多依赖于经验,而这些经验,来源于:1)很是正确的调参思路和方法,2)对模型评估指标的理解,3)对数据的感受和经验,4)用洪荒之力去不断地尝试。机器学习
咱们也许没法学到高手们多年累积的经验,但咱们能够学习他们对模型评估指标的理解和调参的思路。性能
那咱们首先来说讲正确的调参思路。模型调参,第一步是要找准目标:咱们要作什么?通常来讲,这个目标是提高某个模型评估指标,好比对于随机森林来讲,咱们想要提高的是模型在未知数据上的准确率(由score或oob_score_来衡量)。找准了这个目标,咱们就须要思考:模型在未知数据上的准确率受什么因素影响?在机器学习中,咱们用来衡量模型在未知数据上的准确率的指标,叫作泛化偏差(Genelization error)。学习
泛化偏差测试
当模型在未知数据(测试集或者袋外数据)上表现糟糕时,咱们说模型的泛化程度不够,泛化偏差大,模型的效果很差。泛化偏差受到模型的结构(复杂度)影响。看下面这张图,它准确地描绘了泛化偏差与模型复杂度的关系,当模型太复杂,模型就会过拟合,泛化能力就不够,因此泛化偏差大。当模型太简单,模型就会欠拟合,拟合能力就不够,因此偏差也会大。只有当模型的复杂度刚恰好的才可以达到泛化偏差最小的目标。spa
那模型的复杂度与咱们的参数有什么关系呢?对树模型来讲,树越茂盛,深度越深,枝叶越多,模型就越复杂。因此树模型是天生位于图的右上角的模型,随机森林是以树模型为基础,因此随机森林也是天生复杂度高的模型。随机森林的参数,都是向着一个目标去:减小模型的复杂度,把模型往图像的左边移动,防止过拟合。固然了,调参没有绝对,也有天生处于图像左边的随机森林,因此调参以前,咱们要先判断,模型如今究竟处于图像的哪一边。blog
泛化偏差的背后实际上是“误差-方差困境”,原理十分复杂,不管你翻开哪一本书,你都会看见长篇的数学论证和每一个字都能看懂可是连在一块儿就看不懂的文字解释。在下一节误差vs方差中,我用最简单易懂的语言为你们解释了泛化偏差背后的原理,你们选读。那咱们只须要记住这四点:排序
1)模型太复杂或者太简单,都会让泛化偏差高,咱们追求的是位于中间的平衡点数学
2)模型太复杂就会过拟合,模型太简单就会欠拟合it
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 | 看具体状况 |
有了以上的知识储备,咱们如今也可以经过参数的变化来了解,模型何时到达了极限,当复杂度已经不能再下降的时候,咱们就没必要再调整了,由于调整大型数据的参数是一件很是费时费力的事。除了学习曲线和网格搜索,咱们如今有了基于对模型和正确的调参思路的“推测”能力,这可以让咱们的调参能力更上一层楼。
误差 vs 方差
一个集成模型(f)在未知数据集(D)上的泛化偏差E(f;D),由方差(var),误差(bais)和噪声(ε)共同决定。
关键概念:误差与方差 |
---|
观察下面的图像,每一个点就是集成算法中的一个基评估器产生的预测值。红色虚线表明着这些预测值的均值,而蓝色的线表明着数据原本的面貌。 误差:模型的预测值与真实值之间的差别,即每个红点到蓝线的距离。在集成算法中,每一个基评估器都会有本身的误差,集成评估器的误差是全部基评估器误差的均值。模型越精确,误差越低。 方差:反映的是模型每一次输出结果与模型预测值的平均水平之间的偏差,即每个红点到红色虚线的距离,衡量模型的稳定性。模型越稳定,方差越低。 |
其中误差衡量模型是否预测得准确,误差越小,模型越“准”;而方差衡量模型每次预测的结果是否接近,便是说方差越小,模型越“稳”;噪声是机器学习没法干涉的部分,为了让世界美好一点,咱们就不去研究了。一个好的模型,要对大多数未知数据都预测得”准“又”稳“。便是说,当误差和方差都很低的时候,模型的泛化偏差就小,在未知数据上的准确率就高。
误差大 | 误差小 | |
---|---|---|
方差大 | 模型不适合这个数据 换模型 | 过拟合 模型很复杂 对某些数据集预测很准确 对某些数据集预测很糟糕 |
方差小 | 欠拟合 模型相对简单 预测很稳定 但对全部的数据预测都不太准确 | 泛化偏差小,咱们的目标 |
一般来讲,方差和误差有一个很大,泛化偏差都会很大。然而,方差和误差是此消彼长的,不可能同时达到最小值。这个要怎么理解呢?来看看下面这张图:
从图上能够看出,模型复杂度大的时候,方差高,误差低。误差低,就是要求模型要预测得“准”。模型就会更努力去学习更多信息,会具体于训练数据,这会致使,模型在一部分数据上表现很好,在另外一部分数据上表现却很糟糕。模型泛化性差,在不一样数据上表现不稳定,因此方差就大。而要尽可能学习训练集,模型的创建必然更多细节,复杂程度必然上升。因此,复杂度高,方差高,总泛化偏差高。
相对的,复杂度低的时候,方差低,误差高。方差低,要求模型预测得“稳”,泛化性更强,那对于模型来讲,它就不须要对数据进行一个太深的学习,只须要创建一个比较简单,断定比较宽泛的模型就能够了。结果就是,模型没法在某一类或者某一组数据上达成很高的准确度,因此误差就会大。因此,复杂度低,误差高,总泛化偏差高。
咱们调参的目标是,达到方差和误差的完美平衡!虽然方差和误差不能同时达到最小值,但他们组成的泛化偏差却能够有一个最低点,而咱们就是要寻找这个最低点。对复杂度大的模型,要下降方差,对相对简单的模型,要下降误差。随机森林的基评估器都拥有较低的误差和较高的方差,由于决策树自己是预测比较”准“,比较容易过拟合的模型,装袋法自己也要求基分类器的准确率必需要有50%以上。因此以随机森林为表明的装袋法的训练过程旨在下降方差,即下降模型复杂度,因此随机森林参数的默认设定都是假设模型自己在泛化偏差最低点的右边。
因此,咱们在下降复杂度的时候,本质实际上是在下降随机森林的方差,随机森林全部的参数,也都是朝着下降方差的目标去。有了这一层理解,咱们对复杂度和泛化偏差的理解就更上一层楼了,对于咱们调参,也有了更大的帮助。
关于方差-误差的更多内容,你们能够参考周志华的《机器学习》。