模型的改善与泛化(偏差方差与交叉验证)

本文探讨了机器学习中偏差与方差的概念,解释了它们如何影响模型性能,并介绍了通过K折交叉验证选择最佳模型的方法。

1 偏差与方差

1.1 定义

在机器学习的建模中,模型普遍的误差都是来自于偏差(bias)和方差(variance)。那什么又是偏差与方差呢

如上图所示[1],假设你拿着一把冲锋枪打击红色的靶心,在你连打数十枪后出现了以下四种情况:

  • 所有子弹都密集打在靶心旁边的位置,这就是典型的方差小(子弹很集中),偏差大(距离靶心甚远);
  • 子弹都散落在靶心周围的位置,这就是典型的方差大(子弹很散乱),偏差小(都在靶心附近);
  • 子弹都散落在靶心旁边的位置,这就是典型的方差大(子弹散乱),偏差大(距离靶心甚远);
  • 所有子弹都密集打在了红色靶心的位置,这就是典型的方差小(子弹集中),偏差小(都在靶心位置);

由此可知,偏差描述的是预测值的期望与真实值之间的差距,即偏差越大,越偏离真实数据,如上图第二行所示。方差描述的是预测值的变化范围(离散程度),也就是离其期望值的距离。即方差越大,数据的分布越分散,如上图右列所示[2]。

1.2 模型的偏差与方差

上面我们介绍了什么是偏差与方差,那么这四种情况又对应机器学习中的哪些场景呢?通常来说,一个简单的模型会带来比较小的方差(Low Variance),而复杂的模型会带来比较大的方差(High Variance)。这是由于简单的模型不容易受到噪音的影响,而复杂的模型(例如过拟合)容易受到噪音的影响而产生较大的误差。一个极端的例子,\hat{y}=C这个模型不管输入是什么,输出都是常数C,那么其对应的方差就会是0。对于偏差来说,一个简单的模型容易产生较高偏差(High Bias),而复杂的模型容易产生较低的偏差(Low Bias),这是由于复杂的越模型越容易拟合更多的样本。


如图所示为模型的偏差、方差与模型复杂度的变化情况。从图中可以看错,方差随着模型的复杂度增大而上升,偏差与之恰好相反。同时,如果一个模型的主要误差来自于较大的方差,那么这个模型呈现出的就是过拟合的现象;而一个模型的主要误差来自于较大的偏差时,那么此时模型呈现出的就是欠拟合现象。

总结一下,模型的高方差与低偏差对应的分别就是过拟合与欠拟合。如果一个模型不能很好的拟合训练样本,那么此时模型呈现的就是高偏差(欠拟合)的状态;如果是能够很好的拟合训练样本,但是在测试集上有较大的误差,这就意味着此时模型出现了高方差(过拟合)的状态。因此,当模型出现这类情况时,我们完全可以按照前面处理过拟合与欠拟合的方法对模型进行改善,然后在这两者之间进行平衡。
 

2 超参数

2.1 什么是超参数

在之前的介绍中,我们知道了模型中的权重参数可以通过训练集利用梯度下降算法求解得到,但超参数又是什么呢?所谓**超参数(Hyper parameter)**是指那些不能通过数据集训练得到的参数,但它的取值同样会影响到最终模型的效果,因此同样重要。到目前为止,我们一共已经学过了三个超参数,只是第一次出现的时候笔者并没有可以提起其名字,在这里再做一个细致的总结。这三个超参数分别是:惩罚系数\lambda,学习率α、以及特征映射时多项式的次数,其中最为重要的就是前面两个。

  • 惩罚系数\lambda

       从上一篇文章对正则化的介绍中可知,\lambda越大也就意味着对模型的惩罚力度越大,最终训练得到的模型也就相对越简单。因此,在模型的训练过程中,我们需要选择一个合适的\lambda来使得模型的泛化能力尽可能好。

  • 学习率α

       在介绍线性回归的求解中,笔者首次介绍了梯度下降算法:

       W = W - \alpha \frac{\partial L}{\partial W}

       并且说到,α的作用是用来控制每次向前跳跃的距离,较大的α可以使得我们更快的跳到谷底找到最优解,但是过大的α同样能使得我们在峡谷的两边来回震荡,以至于需要多次迭代才能得到最优解(甚至可能得不到最优解)。

        

       如图所示还算是较为乐观的情况,因为其目标函数为凸函数(例如线性回归和线性回归),但在后面的学习过程中,我们会遇到很多的非凸型的目标函数。因此,不同的学习率可能导致大相径庭的结果。        

如图所示为一个非凸型的目标函数,两者从同一个初始点开始优化,一个采用了较小的学习率0.02,一个采用了较大的学习率0.4,可以看出两者得到的结果截然不同。对于左图取得的最小值我们称为局部最优解(local optimum),对于右图取得的最小值我们称为全局最优解(global optimum)。同样,过大的学习率也可能使得目标函数发散。最后值得注意的是,所谓学习率的过大或者过小,在不同模型间没有可对比性。例如在上面凸函数的图示中学习率为0.4时可能还算小,但是在这个例子中0.4已经算是相对较大了。

2.2 如何选择超参数

经过上面的介绍,我们明白了超参数对于模型最终的性能有着极其重大的影响。那到底应该如何选择这些超参数呢?对于超参数的选择,首先可以先列出各个参数的备选取值,例如:α=[0.001,0.03,0.1,0.3,1],λ=[0.1,0.3,1,3,10];然后再根据不同的超参数组合训练得到不同的模型(比如这里就有25个备选模型),通过下面介绍的交叉验证来确立模型。不过这一整套的步骤sklearn也都有现成的类方法可以使用,使用起来也较为方便,后续再通过一个详细的示例进行说明。不过随着后续介绍的模型会更为复杂,所以会出现更多的超参数组合,训练一个模型也会花费一定的时间。因此,对于模型调参的一个基础就是要理解各个参数的含义,这样才可能很快的排除不可能的参数取值。以便于更快的训练出可用的模型。
 

3 模型的选择

当我们在对模型进行改善的过程中,自然而然的就会出现很多备选的模型供我们选择。而我们的目的便是尽可能的选择一个较好的模型,以达到高偏差与高方差之间的平衡。那我们该如何选择一个好的模型呢?通常来说有两种方式:第一种就是之前介绍过的将整个数据集划分成三部分的方式;第二种则是K折交叉验证(K-fold cross validation)[3]。对于第一种方法,其步骤为先在训练集上训练不同的模型,然后在验证集上选择其中表现最好的模型,最后在测试集上测试模型的泛化能力。但是这种做法的缺点在于对于数据集的划分,可能恰好某一次划分出来的测试集含有比较怪异的数据导致最好模型表现出来的泛化误差也很糟糕。那么此时就可以通过K折交叉验证来解决。

如图所示以3折交叉验证为例,我们首先需要将整个完整的数据集分为训练集与测试集两个部分。并且同时,我们再将训练集划分成三份,每次选择其中两份作为训练数据,一份作为验证数据进行模型的训练与验证。

假设现在有四个备选的不同的模型,其各自在不同验证集上的误差如下表所示:

根据得到的结果,我们可以选择平均误差最小的Model2作为最终选择的模型,然后再将其用整个大的训练集训练一次,最后用测试集测试其泛化误差。当然,还有一种省略的交叉验证方式,即一开始并不再划分出测试集,而是直接将整个数据划分成为K份进行交叉验证,然后选择平均误差最小的模型即可。

4 总结

总结一下,在这篇文章中笔者首先通过一个实例介绍了什么是偏差与方差;然后再介绍了在机器学习中模型出现高偏差与高方差时所对应的现象以及我们下一步该如何的进行处理;最后介绍了在改善模型的过程中如何通过K折交叉验证来进行模型的选择。在接下来一讲的内容中,笔者将通过一到两个真实的例子,再来对上述的整个过程进行示范。本次内容就到此结束,感谢阅读!

引用


[1]图片来源:http://scott.fortmann-roe.com/docs/BiasVariance.html

[2]偏差和方差有什么区别?答主:Jason Gu https://www.zhihu.com/question/20448464/answer/24397161

[3]Lecture 2: Where does the error come from? 李宏毅 http://speech.ee.ntu.edu.tw/~tlkagk/courses/ML_2016/Lecture/Bias%20and%20Variance%20(v2).pdf
 

 

<think>我们已知偏差-方差分解将泛化误差分解为偏差方差和噪声三部分。随着模型复杂度的增加,偏差通常会减少(模型拟合能力增强),但方差会增加(模型数据扰动敏感度增加)。噪声通常模型无关。因此,泛化误差会先减小后增大,呈U型曲线。 示意图的横轴为模型复杂度,纵轴为误差(或损失)。图中应有三条曲线:偏差方差泛化误差(总损失)。通常,偏差模型复杂度增加而单调递减,方差模型复杂度增加而单调递增,而泛化误差(总损失)则是偏差方差之和再加上噪声(噪声为常数,所以曲线整体上移),因此呈现先下降后上升的趋势,即U型曲线。 绘制步骤: 1. 横轴:模型复杂度(从小到大,例如从0到10) 2. 纵轴:误差值 3. 绘制偏差曲线:随着模型复杂度增加,偏差逐渐减小(例如,从高到低,负斜率曲线) 4. 绘制方差曲线:随着模型复杂度增加,方差逐渐增大(例如,从低到高,正斜率曲线) 5. 绘制泛化误差曲线:泛化误差 = 偏差 + 方差 + 噪声(假设噪声为常数,例如0.1)。因此,泛化误差曲线是偏差曲线和方差曲线的叠加,再加上一个常数,形成先下降后上升的U型曲线。 注意:这里我们假设噪声是常数,所以不会改变曲线的形状,只是将整个曲线向上平移。 由于无法直接绘图,我将用文字描述示意图,并给出一个简化的代码示例(使用matplotlib)来生成示意图。同时,我会根据偏差方差分解理论进行解释。 代码示例(仅供参考): ```python import numpy as np import matplotlib.pyplot as plt # 设置模型复杂度范围(例如,从1到10) complexity = np.arange(1, 11) # 假设偏差随着复杂度增加而指数下降 bias = np.exp(-complexity) * 5 # 假设方差随着复杂度增加而线性增加 variance = complexity * 0.3 # 假设噪声为常数 noise = 0.1 # 泛化误差 = 偏差 + 方差 + 噪声 generalization_error = bias + variance + noise # 绘制曲线 plt.plot(complexity, bias, label='Bias') plt.plot(complexity, variance, label='Variance') plt.plot(complexity, generalization_error, label='Generalization Error', linestyle='--', color='red') # 添加图例和标签 plt.xlabel('Model Complexity') plt.ylabel('Error') plt.title('Bias-Variance Tradeoff') plt.legend() plt.grid(True) plt.show() ``` 解释: 1. 偏差(Bias):表示模型的期望预测真实值之间的差异。模型越简单,偏差通常越大(欠拟合);模型越复杂,偏差越小。图中表现为下降曲线。 2. 方差(Variance):表示模型对于不同训练集的敏感程度(即模型预测的变化范围)。模型越简单,方差越小;模型越复杂,方差越大(过拟合)。图中表现为上升曲线。 3. 噪声(Noise):数据中无法被模型学习的部分,模型无关,为常数。 4. 泛化误差(Generalization Error):由偏差方差和噪声共同决定。在模型复杂度较低时,偏差较大,方差较小,此时泛化误差主要受偏差影响;随着模型复杂度增加,偏差减小,方差增大,当复杂度达到某个点时,方差增加的影响超过偏差减少的影响,导致泛化误差开始上升。因此,存在一个最优的模型复杂度使得泛化误差最小。 引用偏差方差分解理论[^1]:泛化性能是由算法的学习能力(偏差)、数据集的影响(方差)以及学习任务本身的难度(噪声)共同决定的。为了取得好的泛化性能,需要同时减小偏差方差,但二者往往存在冲突,因此需要权衡(trade-off)。 另外,根据引用[2]中的多项式拟合例子,当模型复杂度(多项式次数M)从0增加到9时,训练误差逐渐降低(偏差降低),但测试误差(泛化误差)在M=9时却很大,因为方差很大(过拟合)。这验证了偏差-方差权衡关系。 因此,在实际应用中,我们通常通过交叉验证(如引用[4]中的验证集评估)来选择模型复杂度,以达到偏差方差的平衡,从而最小化泛化误差。 §§相关问题§§ 1. 如何通过交叉验证选择最优模型复杂度? 2. 在实际机器学习项目中,有哪些具体方法可以降低模型偏差方差? 3. 噪声在偏差方差分解中扮演什么角色?如何减少噪声的影响? </think> ### 偏差-方差分解模型复杂度关系示意图分析 #### 示意图关键要素(横轴:模型复杂度) 1. **泛化误差曲线**:U型曲线,随复杂度增加先下降后上升 2. **偏差曲线**:单调递减,模型越复杂偏差越小 3. **方差曲线**:单调递增,模型越复杂方差越大 4. **最优复杂度点**:泛化误差最低点(偏差方差平衡点) #### 偏差-方差分解理论解释 根据偏差-方差分解理论[^1],泛化误差可分解为: $$E = \text{偏差}^2 + \text{方差} + \text{噪声}$$ 1. **模型简单时(左侧区域)**: - 偏差主导:模型学习能力不足,无法捕捉数据规律(欠拟合) - 示例:引用[2]中M=1的多项式拟合,训练/测试误差均高 - 公式体现:$ \text{偏差}^2 \gg \text{方差} $ 2. **模型适当时(中间区域)**: - 平衡点:偏差方差达到最优权衡 - 泛化误差最小:模型既拟合数据又抗扰动 - 示例:引用[2]中测试误差最低的M值(约M=3) 3. **模型复杂时(右侧区域)**: - 方差主导:过度学习训练集噪声(过拟合) - 示例:引用[2]中M=9时训练误差=0但测试误差骤升 - 公式体现:$ \text{方差} \gg \text{偏差}^2 $ - 引用[4]验证集可检测此现象 #### 实践建议 1. 通过**交叉验证**[^4]确定最优复杂度 2. 使用**正则化**抑制高复杂度时的方差增长 3. 增加**训练数据量**可降低方差影响 > 示意图说明:当模型复杂度从低到高变化时,偏差平方(红色)从高降低,方差(蓝色)从低升高,泛化误差(黑色U型曲线)在二者平衡点达到最小值。噪声项(灰色虚线)作为常数项影响整体高度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值