视频作者:[菜菜TsaiTsai] 链接:[【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili]
调参的方式总是根据数据的状况而定,所以没有办法一概而论
那我们首先来讲讲正确的调参思路。模型调参,第一步是要找准目标:我们要做什么?一般来说,这个目标是提升某个模型评估指标,比如对于随机森林来说,我们想要提升的是模型在未知数据上的准确率(由score或oob_score_来衡量)。找准了这个目标,我们就需要思考:模型在未知数据上的准确率受什么因素影响?在机器学习中,我们用来衡量模型在未知数据上的准确率的指标,叫做泛化误差(Genelization error)。
泛化误差:当模型在未知数据(测试集或者袋外数据)上表现糟糕时,我们说模型的泛化程度不够,泛化误差大,模型的效果不好。泛化误差受到模型的结构(复杂度)影响。 下面这张图,它描绘了泛化误差与模型复杂度的关系,当模型太复杂,模型就会过拟合,泛化能力就不够,所以泛化误差大。当模型太简单,模型就会欠拟合,拟合能力就不够,所以误差也会大。只有当模型的复杂度刚刚好的才能够达到泛化误差最小的目标。
在机器学习中,我们用训练数据集去训练一个模型,通常的做法是定义一个误差函数,通过将这个误差的最小化过程,来提高模型的性能。然而我们学习一个模型的目的是为了解决训练数据集这个领域中的一般化问题,单纯地将训练数据集的损失最小化,并不能保证在解决更一般的问题时模型仍然是最优,甚至不能保证模型是可用的。这个训练数据集的损失与一般化的数据集的损失之间的差异就叫做泛化误差
作者:知乎用户aCVd0Z(已注销) 链接:偏差和方差有什么区别? - 知乎 (zhihu.com)
训练误差的公式是 $$E_{T}(\omega)=\sum\limits_{i=1}^{N}(\hat{f}(x_{i}|\omega)-y_{i})^{2}=\sum\limits_{x \in D}^{}(\hat{f}(x|\omega)-f(x))^{2}$$ 其中$\hat{f}(x|\omega)$是预测值,$f(x)$是目标值,而$D$是全集$X$的一个样本量为$N$的子集(下面与关于$D$的强调) 泛化误差公式 $$E_{G}=\sum\limits_{x \in X}^{}p(x)(\hat{f}(x|\omega)-f(x))^{2}$$ $p(x)$表示$x$在全集$X$中出现的概率,此处$x$可以是一个数据点,也可以是一个数据点的集合 训练误差计算了训练集的误差,而泛化误差是计算全集的误差。
**注意,计算概率的时候都是针对可观测量,因为不可观察量我们是无法计算的。**也就是被我们使用的$D$
举个例子。假设我们现在需要计算某个模型。假设在整个世界中,所有的数据有150个,如下图。 然而现实情况是,我们不可能能够找到所有的数据,因此假设我们能够观测到其中一部分的数据。并且,由于不同的实验条件,每次实验都有可能取到其中不同的部分。 下图为进行多次实验的结果,(假设实验次数为2,每次仅能够找到50个数据)。 两次的训练误差是 $$E_{i}=\sum\limits_{x \in D_{i}}^{}(\hat{f}(x|\omega)-f(x))^{2}$$ 泛化误差是 $$E_{G}=\frac{50}{100}E_{1}+ \frac{50}{100}E_{2}$$ 这里的50是某一次测试所用的点的数量,100是所有的点的数量
作者:球在这呢joy 链接:泛化误差(generalisation error),偏差(bias),方差(variance) - 知乎 (zhihu.com)
泛化误差可以被分解为偏差、方差和噪声 偏差Bias:偏差是指预测结果与真实值之间的差异。是用所有可能的训练数据集训练出的所有模型的输出的平均值与真实模型的输出值之间的差异。排除噪声的影响,偏差更多的是针对某个模型输出的样本误差,偏差是模型无法准确表达数据关系导致 方差Variance:模型方差不是针对某一个模型输出样本进行判定,而是指多个(次)模型输出的结果之间的离散差异,是不同的训练数据集训练出的模型输出值之间的差异。注意这里写的是多个模型或者多次模型,即不同模型或同一模型不同时间的输出结果方差较大 噪声的存在是学习算法所无法解决的问题,数据的质量决定了学习的上限。假设在数据已经给定的情况下,此时上限已定,我们要做的就是尽可能的接近这个上限。
要进一步理解偏差、方差、噪声,我们需要看它们的数学公式
符号 涵义 $x$ 测试样本 $D$ 数据集 $y_{D}$ $x$在数据集中的标记 $y$ $x$的真实标记 $f$ 训练集$D$学得的模型 $f(x;D)$ 由训练集$D$学得的模型$f$对$x$的预测输出 $\bar{f}(x)$ 模型$f$对$x$的期望输出 以回归任务为例,学习算法的期望预测为: $$\bar{f}(x)=E_{D}[f(x;D)]$$
我们能够用来学习的训练数据集只是全部数据中的一个子集。
这里的期望预测也就是针对不同数据集D,模型f对样本x的预测值取其期望,也叫做平均预测(average predicted)
方差定义:使用样本数相同的不同训练集产生的方差为 $$\text{Var}(x)=E_{D}[(f(x;D)-\bar{x})^{2}]$$ 方差的含义:方差度量了同样大小的训练集的变动所导致的学习性能的变化
偏差定义:期望输出与真实标记的差别称为偏差(bias),即 $$bias^{2}(x)=(\bar{f}(x)-y)^{2}$$ 偏差的含义:偏差度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力。
噪声为 $$\epsilon ^{2}=E_{D}[(y_{D}-y)^{2}]$$ 噪声的含义:噪声则表达了在当前任务上任何学习算法所能达到的期望泛化误差的下界,即刻画了学习问题本身的难度。
作者:知乎用户aCVd0Z(已注销) 链接:偏差和方差有什么区别? - 知乎 (zhihu.com)
偏差衡量模型是否预测得准确,偏差越小,模型越“准” 方差衡量模型每次预测的结果是否接近,即是说方差越小,模型越“稳” 观察下面的图像,每个点就是集成算法中的一个基评估器产生的预测值。红色虚线代表着这些预测值的均值,而蓝色的线代表着数据本来的面貌。
偏差:模型的预测值与真实值之间的差异,即每一个红点到蓝线的距离。在集成算法中,每个基评估器都会有自己的偏差,集成评估器的偏差是所有基评估器偏差的均值。模型越精确,偏差越低。 方差:反映的是模型每一次输出结果与模型预测值的平均水平之间的误差,即每一个红点到红色虚线的距离(不太准确),衡量模型的稳定性。模型越稳定,方差越低。
偏差bias和方差variance与泛化误差的联系 我们将真实模型的范围用黄色区域表示。由于条件的限制和知识的限制,我们已知可达的预测范围是橙色范围。$f(x)$是实际的目标值,假设使用某个数据集试验的预测结果为$f'(x|\omega)$,他们泛化误差也就是距离为实线的部分。对于每次实验都会有不同的误差。因此泛化误差的期望是 $$\bar{E}{G}=\frac{1}{N}\sum\limits{i=1}^{N}E_{G}(\omega_{D_{i}})=\frac{1}{N}\sum\limits_{i=1}^{N}\left[\sum\limits_{x \in X}^{}p(x)(\hat{f}(x|\omega_{D_{i}})-f(x))^{2}\right]$$
作者:球在这呢joy 链接:泛化误差(generalisation error),偏差(bias),方差(variance) - 知乎 (zhihu.com)
对上面这个式子继续计算(注意这里$f(x)$表示$D$中的$y$值,即含有噪声的$y$,且假定$E_{D}(y-f(x))=0$) $$\begin{aligned} \bar{E_{G}}&=E_{D}[E_{G}(\omega_{D})]\&=E_{D}\left[\sum\limits_{x \in X}^{}p(x) \left[\hat{f}(x|\omega_{D})-f(x))^{2}\right]\right]\&=E_{D}\left[\sum\limits_{x \in X}^{}p(x)((\hat{f}(x|\omega_{D})-\bar{f}(x|\omega_{D}))-(\bar{f}(x|\omega_{D})-f(x)))^{2}\right]\&=E_{D}\left[\sum\limits_{x \in X}^{}p(x)[(\hat{f}(x|\omega)-\bar{f}(x|\omega))^{2}+(\bar{f}(x|\omega)-f(x))^{2}]\right]+\underbrace{2E_{D}\left[\sum\limits_{x \in X}^{}p(x)(\hat{f}(x|\omega_{D})-\bar{f}(x|\omega)(\bar{f}(x|\omega-f(x))\right]}{0}\&=\underbrace{E{D}\left[\sum\limits_{x \in X}^{}p(x)(\hat{f}(x|\omega)-\bar{f}(x|\omega))^{2}\right]}{\text{Var}(x)}+E{D}\left[\sum\limits_{x \in X}^{}p(x)(\bar{f}(x|\omega)-f(x))^{2}\right]\&=\text{Var}(x)+E_{D}\left[\sum\limits_{x \in X}^{}p(x)((\bar{f}(x|\omega)-y)+(y-f(x)))^{2}\right]\&=\text{Var}(x)+E_{D}\left[\sum\limits_{x \in X}^{}p(x)[(\bar{f}(x|\omega)-y)^{2}+(y-f(x))^{2}]\right]+\underbrace{2E_{D}\left[\sum\limits_{x \in X}^{}p(x)(\bar{f}(x|\omega)-y)(y-f(x))\right]}{0}\&=\text{Var}(x)+E{D}\left[\sum\limits_{x \in X}^{}p(x)(\bar{f}(x|\omega)-y)^{2}\right]+E_{D}\left[\sum\limits_{x \in X}^{}p(x)(y-f(x))^{2}\right]\&=\text{Var}(x)+Bias^{2}(x)+\epsilon^{2} \end{aligned}$$ (这一段在西瓜书偏差方差分解中有等权重的推导可能更容易理解,偏差和方差有什么区别? - 知乎 (zhihu.com)也有)
也就是说,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。给定学习任务,为了取得好的泛化性能,则需使偏差较小,即能够充分拟合数据,并且使方差较小,即使得数据扰动产生的影响小。
一个好的模型,要对大多数未知数据都预测得”准“又”稳“。即是说,当偏差和方差都很低的时候,模型的泛化误差就小,在未知数据上的准确率就高。
通常来说,方差和偏差有一个很大,泛化误差都会很大。然而,方差和偏差是此消彼长的,不可能同时达到最小值。
(这张图好像考虑了噪声) 从图上可以看出,模型复杂度大的时候,方差高,偏差低。偏差低,就是要求模型要预测得“准”。模型就会更努力去学习更多信息,会具体于训练数据,这会导致,模型在一部分数据上表现很好,在另一部分数据上表现却很糟糕。模型泛化性差,在不同数据上表现不稳定,所以方差就大。而要尽量学习训练集,模型的建立必然更多细节,复杂程度必然上升。所以,复杂度高,方差高,总泛化误差高。 相对的,复杂度低的时候,方差低,偏差高。方差低,要求模型预测得“稳”,泛化性更强,那对于模型来说,它就不需要对数据进行一个太深的学习,只需要建立一个比较简单,判定比较宽泛的模型就可以了。结果就是,模型无法在某一类或者某一组数据上达成很高的准确度,所以偏差就会大。所以,复杂度低,偏差高,总泛化误差高。
虽然方差和偏差不能同时达到最小值,但他们组成的泛化误差却可以有一个最低点,而我们就是要寻找这个最低点。对复杂度大的模型,要降低方差,对相对简单的模型,要降低偏差。随机森林的基评估器都拥有较低的偏差和较高的方差,因为决策树本身是预测比较”准“,比较容易过拟合的模型,装袋法本身也要求基分类器的准确率必须要有50%以上。所以以随机森林为代表的装袋法的训练过程旨在降低方差,即降低模型复杂度,所以随机森林参数的默认设定都是假设模型本身在泛化误差最低点的右边。 所以,我们在降低复杂度的时候,本质其实是在降低随机森林的方差,随机森林所有的参数,也都是朝着降低方差的目标去。
那模型的复杂度与我们的参数有什么关系呢?对树模型来说,树越茂盛,深度越深,枝叶越多,模型就越复杂。所以树模型是天生位于图的右上角的模型,随机森林是以树模型为基础,所以随机森林也是天生复杂度高的模型。 随机森林的参数,都是向着一个目标去:减少模型的复杂度,把模型往图像的左边移动,防止过拟合。当然了,调参没有绝对,也有天生处于图像左边的随机森林,所以调参之前,我们要先判断,模型现在究竟处于图像的哪一边。
根据“偏差-方差困境”,并进行简化,我们需要记住四点
- 模型太复杂或者太简单,都会让泛化误差高,我们追求的是位于中间的平衡点
- 模型太复杂就会过拟合,模型太简单就会欠拟合
- 对树模型和树的集成模型来说,树的深度越深,枝叶越多,模型越复杂
- 树模型和树的集成模型的目标,都是减少模型复杂度,把模型往图像的左边移动
具体每个参数的作用,请看下表