偏差(Bias)和方差(Variance)——机器学习中的模型选择zz
模型性能的度量
在监督学习中,已知样本 ,要求拟合出一个模型(函数)
,其预测值
与样本实际值
的误差最小。
考虑到样本数据其实是采样,并不是真实值本身,假设真实模型(函数)是
,则采样值
,其中
代表噪音,其均值为0,方差为
。
拟合函数的主要目的是希望它能对新的样本进行预测,所以,拟合出函数
后,需要在测试集(训练时未见过的数据)上检测其预测值与实际值
之间的误差。可以采用平方误差函数(mean squared error)来度量其拟合的好坏程度,即
误差期望值的分解
经过进一步的研究发现,对于某种特定的模型(下面还会进一步说明“特定模型”的含义),其误差的期望值可以分解为三个部分:样本噪音、模型预测值的方差、预测值相对真实值的偏差
公式为:
其中
即:误差的期望值 = 噪音的方差 + 模型预测值的方差 + 预测值相对真实值的偏差的平方
先看一个图比较直观。

使用特定模型对一个测试样本进行预测,就像打靶一样。
靶心(红点)是测试样本的真实值,测试样本的y(橙色点)是真实值加上噪音,特定模型重复多次训练会得到多个具体的模型,每一个具体模型对测试样本进行一次预测,就在靶上打出一个预测值(图上蓝色的点)。所有预测值的平均就是预测值的期望(较大的浅蓝色点),浅蓝色的圆圈表示预测值的离散程度,即预测值的方差。
所以,特定模型的预测值 与 真实值 的误差的 期望值,分解为上面公式中的三个部分,对应到图上的三条橙色线段:预测值的偏差、预测值的方差、样本噪音。
理解误差期望值
回顾一下,期望值的含义是指在同样的条件下重复多次随机试验,得到的所有可能状态的平均结果(更详细的定义参考维基百科-期望值)。对于机器学习来说,这种实验就是我们选择一种算法(并选定超参数),以及设置一个固定的训练集大小,这就是同样的条件,也就是上文所说的特定的模型。然后每次训练时从样本空间中选择一批样本作为训练集,但每次都随机抽取不同的样本,这样重复进行多次训练。每次训练会得到一个具体的模型,每个具体模型对同一个未见过的样本进行预测可以得到预测值。不断重复训练和预测,就能得到一系列预测值,根据样本和这些预测值计算出方差和偏差,就可以帮助我们考察该特定模型的预测误差的期望值,也就能衡量该特定模型的性能。对比多个特定模型的误差的期望值,可以帮助我们选择合适的模型。
进一步理解误差期望值
再看一个更接近实际的例子,来自 Bias-Variance in Machine Learning
我们设置真实模型 ,函数图像如下图曲线所示。
样本值 y 就在真实值的基础上叠加一个随机噪音 N(0, 0.2)。

现在我们用线性函数来构建模型,训练样本来自随机采集的一组 y,经过多次重复,可以得到一系列具体的线性模型,如下图中那一组聚集在一起的黑色直线所示,其中间有一条红色线是这一组线性函数的平均(期望值)。这就是特定模型(线性函数)在同样条件下(每次取20个样本点)重复多次(得到50个线性函数)。
根据生成的50个具体的线性函数来考察该线性模型的预测性能,选取一个样本点,比如选择 x=5 时(下图中红色竖线位置),真实值 f(x) = 6.876,样本 ,y 与 f(x) 的偏差体现在图片右下方的噪音(noise) 部分。红色线性函数在 x=5 位置的值是这50个线性函数在该位置的期望值,黑色直线在 x=5 位置的一系列值的分布则反映了它们的方差(Variance)。50个预测的期望值与真实值 f(x) 之间的距离体现了偏差(Bias)。(参考下图右下部分的 variance 和 bias)。

总之,在机器学习中考察 偏差 和 方差,最重要的是要在不同数据集上训练出一组特定模型,这些模型对一个测试样本进行预测,考察这一组预测值的方差和偏差。
误差的期望值公式推导
误差的期望值公式为什么可以分解为 噪音、偏差和方差,可以从数学上推导得来。先准备几个推导中需要用到的公式,为了方便,我们简化符号,记作
方差的定义和计算公式
即 随机变量X的方差 = X平方的期望 - X期望的平方(参考 维基百科-方差),移项后得到
测试样本y的期望值
因为真实值是一个确定的值,所以
另外根据上文测试样本值和噪音的定义
所以,即
测试样本y的方差
即
样本噪音与预测值无关
因为与
不相关,所以
(参考维基百科-期望值)误差的期望
公式推导如下
最后得到的三个项分别是:噪音的方差、模型预测值的方差、预测值相对真实值的偏差的平方。
偏差 - 方差的选择
理想中,我们希望得到一个偏差和方差都很小的模型(下图左上),但实际上往往很困难。

选择相对较好的模型的顺序:方差小,偏差小 > 方差小,偏差大 > 方差大,偏差小 > 方差大,偏差大。
方差小,偏差大 之所以在实际中排位相对靠前,是因为它比较稳定。很多时候实际中无法获得非常全面的数据集,那么,如果一个模型在可获得的样本上有较小的方差,说明它对不同数据集的敏感度不高,可以期望它对新数据集的预测效果比较稳定。
选择假设集合
很多时候,机器学习所面临的问题,我们事先并不确切的知道要拟合的是一个怎样形式的函数,是几次多项式,是几层神经网络,选择样本的哪些特征,等等,都缺乏先验的知识来帮助我们选择。我们在一个基本上无穷大的假设(模型)集合中,凭借有限的经验进行尝试和选择。
机器学习有多种算法,以及每种算法中经常又可以选择不同的结构和超参数。它们所覆盖的假设集合有不同的大小。所以,选择一种算法(包括其结构和超参数),就是选择(限定)了一个假设集合。我们期望真实模型存在于我们所选定的假设集合范围内,并且该假设集合越小越好。
下面两幅图粗略表现了不同假设集合的关系


我们思考一下监督学习的整个流程,其实就是一个不断缩小假设集合的过程。从大的方面看可以分为两个步骤。
- 选择一个假设集合,包括模型及相关结构、超参数等。
- 使用样本数据进行训练,使该模型尽量拟合样本,就是从上面选定的假设集合中找到一个特定的假设(模型)。
上面第一个步骤中,我们可以选择一些不同的假设集合,然后通过考察它们的偏差方差,对各假设集合的性能进行评估。比如多项式的次数,上图假设真实模型是一个二次多项式,那么线性函数集合中的模型会欠拟合(方差低,偏差太高),高次多项式集合中的模型容易过拟合(方差太高,偏差低),二项式集合中的模型能够有较好的折中(方差和偏差都相对较低),总体误差最小。
偏差 - 方差权衡
下面几个案例来自 Andrew Ng 的公开课《Machine Learning》。
- 多项式回归
多项式回归模型,我们可以选择不同的多项式的次数,对模型的影响如下。

多项式次数 | 模型复杂度 | 方差 | 偏差 | 过/欠拟合 |
---|---|---|---|---|
低 | 低 | 低 | 高 | 欠拟合 |
中 | 中 | 中 | 中 | 适度 |
高 | 高 | 高 | 低 | 过拟合 |

多项式次数 | 模型复杂度 | 训练误差 | 测试误差 |
---|---|---|---|
低 | 低 | 高 | 高 |
中 | 中 | 中 | 低 |
高 | 高 | 低 | 高 |
- 正则化项
添加正则化项(Regularization)相当于对模型参数施加惩罚,压缩了参数的范围,限制了模型的复杂度,从而有助于缓解模型过拟合问题,选择不同的 正则化项权重λ 对模型的影响如下。

正则化项权重λ | 模型复杂度 | 方差 | 偏差 | 过/欠拟合 |
---|---|---|---|---|
大 | 低 | 低 | 高 | 欠拟合 |
中 | 中 | 中 | 中 | 适度 |
小 | 高 | 高 | 低 | 过拟合 |

正则化项权重λ | 模型复杂度 | 训练误差 | 测试误差 |
---|---|---|---|
大 | 低 | 高 | 高 |
中 | 中 | 中 | 低 |
小 | 高 | 低 | 高 |
- 样本数量
一般来说,我们希望样本数量越多越好。随着样本数量增加,训练误差会逐渐增长,测试误差会逐渐降低。



- 神经网络

神经网络结构 | 模型复杂度 | 方差 | 偏差 | 过/欠拟合 |
---|---|---|---|---|
小 | 低 | 低 | 高 | 欠拟合 |
中 | 中 | 中 | 中 | 适度 |
大 | 高 | 高 | 低 | 过拟合 |
K-Fold 交叉验证
计算偏差、方差可以帮助评估不同的假设集合,不过它需要较多的样本,以及重复多次拟合模型,需要比较多的数据和计算资源(参考上面图3)。
实际中,比较常用的方法是K-Fold交叉验证。它与标准的偏差、方差计算过程不太一样。简单的说,就是将训练样本分成k份,每次取其中一份作为验证集,另外 k-1 份作训练集。这样进行 k 次训练得到 k 个模型。这 k 个模型对各自的验证集进行预测,得到 k 个评估值(可以是误差、准确率,或按某种规则计算的得分等等)。注意到每个样本参与了 k-1 个模型的训练(导致模型之间存在关联),每个样本有一次被用作测试(没有用另外的从未见过的测试集数据),所以这与标准的计算过程是不一样的。
不过,K-Fold依然是很有价值的模型性能评估方法。可以直接针对这 k 个模型的评估值(误差、准确率,或按某种规则计算的得分等等)进行分析,取其平均可以体现该模型的预测准确性。对这 k 个值,比如k个误差值,计算方差,可以反应该模型的预测误差的离散程度,即后续用于未见过的样本数据时,模型的预测准确性是否稳定。
参考
维基百科 - Bias–variance tradeoff
Bias-Variance in Machine Learning
维基百科 - 方差
维基百科 - 期望值
《Pattern Recognition and Machine Learning》之 3.2. The Bias-Variance Decomposition
作者:X猪
链接:https://www.jianshu.com/p/8c7f033be58a
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
偏差(Bias)和方差(Variance)——机器学习中的模型选择zz的更多相关文章
- 机器学习中的偏差(bias)和方差(variance)
转发:http://blog.csdn.net/mingtian715/article/details/53789487请移步原文 内容参见stanford课程<机器学习> 对于已建立 ...
- 机器学习(二十四)— 偏差Bias 与方差Variance
1.首先 Error = Bias + Variance Error反映的是整个模型的准确度, Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度, Variance反映的是模 ...
- 模型的偏差bias以及方差variance
1. 模型的偏差以及方差: 模型的偏差:是一个相对来说简单的概念:训练出来的模型在训练集上的准确度. 模型的方差:模型是随机变量.设样本容量为n的训练集为随机变量的集合(X1, X2, ..., Xn ...
- 机器学习中的Bias(偏差),Error(误差),和Variance(方差)有什么区别和联系?
前几天搜狗的一道笔试题,大意是在随机森林上增加一棵树,variance和bias如何变化呢? 参考知乎上的讨论:https://www.zhihu.com/question/27068705 另外可参 ...
- ubuntu之路——day7.1 衡量模型好坏的因素偏差和方差bias&variance 以及在深度学习中的模型优化思路
Error | 误差 Bias | 偏差 – 衡量准确性 Variance | 方差 – 衡量稳定性 首先我们通常在实际操作中会直接用错误率或者与之对应的准确率来衡量一个模型的好坏,但是更加准确的做法 ...
- 斯坦福大学公开课机器学习: advice for applying machine learning | regularization and bais/variance(机器学习中方差和偏差如何相互影响、以及和算法的正则化之间的相互关系)
算法正则化可以有效地防止过拟合, 但正则化跟算法的偏差和方差又有什么关系呢?下面主要讨论一下方差和偏差两者之间是如何相互影响的.以及和算法的正则化之间的相互关系 假如我们要对高阶的多项式进行拟合,为了 ...
- 机器学习中学习曲线的 bias vs variance 以及 数据量m
关于偏差.方差以及学习曲线为代表的诊断法: 在评估假设函数时,我们习惯将整个样本按照6:2:2的比例分割:60%训练集training set.20%交叉验证集cross validation set ...
- 【Udacity】误差原因——方差variance与偏差bias
偏差造成的误差-准确率和欠拟合 方差-精度和过拟合 Sklearn代码 理解bias &variance 在模型预测中,模型可能出现的误差来自两个主要来源,即:因模型无法表示基本数据的复杂度而 ...
- 斯坦福大学公开课机器学习: machine learning system design | error analysis(误差分析:检验算法是否有高偏差和高方差)
误差分析可以更系统地做出决定.如果你准备研究机器学习的东西或者构造机器学习应用程序,最好的实践方法不是建立一个非常复杂的系统.拥有多么复杂的变量,而是构建一个简单的算法.这样你可以很快地实现它.研究机 ...
随机推荐
- imgtobase64
# -*- coding: utf-8 -*- import re import base64 from cStringIO import StringIO from PIL import Image ...
- list.sort和内置方法sorted的区别
1.list.sort会直接修改list,不会把原来的列表复制一份,直接修改list,所以list.sort的返回值为None; 2.sorted(list)的返回值就修改之后的list,原来的lis ...
- VS2015环境下的提示语法错误:编号的预期结尾后有多余文本(extra text after expected end of number)
当工程中有扩展CListCtrl的类代码,并且有自绘单元格的操作, ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnNMCustomdraw) 编辑器语法智能提示就会对这个宏定义 ...
- https://github.com/gaoyangxiaozhu/DockerVI
[更新]分享一个开源项目DockerVI,一个基于NodeJS实现的Docker Swarm可视化解决方案
- nagios监控mysql及邮件报警
1.使用默认监控命令check_http命令+相关的参数来实现,如下: 在command.cfg添加如下关键词监控命令:check_http_word,参数解析:-I指定IP或者主机名,-u指定URL ...
- Taro开发小程序移动地图固定中间获取地址
效果图如下: 绿色地标固定在中间,移动地图的时候获取对应信息. 先定义map. <Map className="location" id={location} latitud ...
- 今天遇到一个怪异的问题,maven生成项目war包中有一个Jar包不是我指定的版本,运行时会找不到符号,o(╥﹏╥)o
我要求的jar包: 这是我parent项目中pom文件的依赖管理 这是我要生成war包那个工程最后依赖的jar包,这个时候它们的版本号还是一致的 最后项目生成的: 下图是Dmaven.test.ski ...
- try-catch-finally 与返回值的修改
先看一段java代码,func返回值为int: public static int func() { int result = 0; try { result = 1; return result; ...
- 关于pycharm有时候提取不了form表单POST提交的数据
1.有可能标签没有name属性 2.name属性要放在第一个位置,放在末尾有时候会出现BUG导致识别不出,提取的值为None.
- Cocos2dx开发之设计模式
cocos2dx的几种常见设计模式 一 单例模式 Cocos2dx中的单例有:CCDirector,CCTextureCache,CCSpriteFrameCache,CCScriptEngineMa ...