原标题:干货 :教你用Python来计算偏差-方差权衡

作者:Jason Brownlee 翻译:吴振东

本文约3800字,建议阅读8分钟。

本文为你讲解模型偏差、方差和偏差-方差权衡的定义及联系,并教你用Python来计算。

衡量一个机器学习模型的性能,可以用偏差和方差作为依据。

一个高偏差的模型,总是会对数据分布做出强假设,比如线性回归。而一个高方差的模型,总是会过度依赖于它的训练集,例如未修剪的决策树。我们希望一个模型的偏差和方差都很低,但更多情况下我们需要在二者之间做出权衡。

在选择和调整模型时,“偏差-方差权衡”是一个非常有用的概念。当然它在一般情况下是无法直接计算的,因为这需要这一问题领域内的全部知识,而我们并不具备。尽管如此,我们可以评估出一个模型的误差,并将其拆分成偏差和方差两部分,从而借此了解该模型的运行方式。

在这篇教程中,你将了解如何计算一个机器学习模型的偏差和方差。

在完成这篇教程后,你将会学到:

模型误差包含模型方差、模型偏差以及不可约误差;

我们希望模型具有低偏差和低方差,但是一般情况下一个值的缩小会导致另一个值的增大;

如何将均方误差分解成模型的偏差和方差。

我的新书《用Python掌握机器学习》(https://machinelearningmastery.com/machine-learning-with-python/)将帮助你开始新的项目,其中包括分步教程和所有示例的Python源代码文件。

让我们开始吧。

教程综述

本篇教程可以分为三部分,分别是:

偏差、方差和不可约误差;

偏差-方差权衡;

计算偏差和方差。

偏差、方差和不可约误差

机器学习模型是用来做预测任务的,例如回归或分类。

一个模型预测性能可以用对未参与训练的样本做预测后的误差来表示,我们将其视作是模型误差。

误差(模型)

模型误差可以被分解为三个部分:模型的方差、模型的偏差以及不可约误差的方差。

误差(模型)= 方差(模型)+ 偏差(模型)+ 方差(不可约误差)

让我们仔细看看这三个术语。

模型偏差

偏差用于衡量一个模型拟合的输入和输出之间关系与真实情况的近似程度。

这能获得模型的刚度:模型对于输入和输出之间的函数的假设强度。

“这能够反映出模型的拟合结果与真实规律之间的差距。”

——《预测模型应用》2013年版,97页

当偏差符合未知的真实规律时,我们可以接受具有高偏差的预测模型。但是,当真实数据函数形式与模型的假设完全不匹配时,例如对一个高度非线性关系的数据使用线性关系的假设,具备过高偏差的模型是毫无用处的。

低偏差:关于对输入到输出映射函数形式的弱假设。

高偏差:关于对输入到输出映射函数形式的强假设。

偏差一定是正值。

模型方差

模型的方差是模型在拟合不同的训练数据时性能的变化大小。它反映特定数据对模型的影响。

“方差指的是,用不同训练数据进行模型评估时,模型表现的变化程度。”

——《统计学习及其在R中的应用》2014年版,第34页

一个高方差的模型在训练数据集发生细小变化时预测结果会发生很大变化。相反,对于低方差的模型,训练数据发生或大或小的改变时,预测结果的变化都很小。

低方差:训练数据集的变化对于模型来说影响很小。

高方差:训练数据集的变化对于模型来说影响很大。

方差一定是正值。

不可约误差

整体而言,模型的误差包含可约误差和不可约误差。

模型误差 = 可约误差 + 不可约误差

可约误差是我们可以去优化的成分。在模型通过学习训练集后这一数值会下降,我们会努力让这一数值尽可能地接近于零。

不可约误差是我们无法从模型中剔除的误差,在任何模型中都不可能被去除。

这一误差源于不可控因素,例如观测中的统计噪声。

“……通常会称之为“不可约噪声”,且不能在建模过程中剔除。”

——《预测模型应用》2013年版,第97页

同样的,尽管我们能够把可约误差压缩到接近于零或者非常小的值,甚至有时能够等于零,但不可约误差依然会存在。这决定了模型性能的下限。

“有一点是我们是需要牢牢记住的,那就是不可约误差始终会作为我们对目标Y预测精确率的下限值,这个边界在实践中永远是未知的。”

——《统计学习及其在R中的应用》2014年版,第19页

这提醒我们任何模型都不是完美的。

偏差-方差的权衡

对于模型的表现来说,偏差和方差是有关联的。

理想情况下,我们希望一个模型能有低偏差和低方差,但是在实际操作中这是非常具有挑战性的。实际上这是机器学习建模的目标。

降低偏差很容易使方差升高。相反,降低方差也会使得偏差升高。

“这被称之为一种‘权衡’,因为一般的方法很容易得到极低的偏差和很高的方差……或很低的方差和很高的偏差……”

——《统计学习及其在R中的应用》2014年版,第36页

这种关系一般被称为“偏差与方差的权衡”。这是一个关于思考如何选择模型和调整模型的概念框架。

我们可以基于偏差和方差来选择模型。简单的模型,例如线性回归和逻辑回归,通常具有高偏差和低方差。而复杂的模型,例如随机森林,通常具有低偏差和高方差。

我们通常会基于模型的偏差和方差所造成的影响来调整模型。对于K-近邻算法来说,超参数k控制着模型的偏差-方差权衡。k取值较小,例如k=1,会得到低偏差高方差的结果。反之k取值较大,如k=21,导致高偏差和低方差。

高偏差和高方差都不一定是坏的,但他们有可能会导致不良的结果。

我们时常要对一组不同的模型和模型参数进行测试,从而在给定的数据集中得到最好的结果。一个高偏差的模型有可能会是过于保守的,出现欠拟合。相反的,一个高方差的模型可能会出现过拟合。

我们有可能会选择提高偏差或方差,来减少模型的整体误差。

计算偏差和方差

我经常会遇到这样的问题:

“如何能量化我的算法在数据集上所得到的偏差-方差权衡呢?”

从技术的角度讲,我们无法进行这样的计算。

我们无法针对一个预测建模问题来计算实际的偏差和方差。因为我们并不知道真实的映射函数。

但是我们可以将偏差、方差、不可约误差和偏差-方差权衡作为帮助我们选择模型、调整模型和解释结果的工具。

“在实际情况中,f是无法被观察到的,所以一般对于统计学习方法来说无法明确计算MSE值、偏差、方差。虽然如此,我们必须要关注偏差-方差权衡。”

——《统计学习及其在R中的应用》2014版,第36页

虽然偏差-方差权衡是一个概念上的工具,某些情况下我们也可以进行估计。

Sebastian Raschka建立的mlxtend库提供了bias_variance_decomp()函数,可以对一个模型采用多重自采样(multiple bootstrap samples)的方式来评估偏差和方差。

首先,你需要安装mlxtend库,例如:

sudo pip install mlxtend

下面这个例子是直接通过URL载入波士顿房价数据集,划分为训练集和测试集,然后估计出对于线性回归的均方根误差(MSE),以及采用200次自采样所获得的偏差和方差模型误差。

#estimate the bias and variance for a regression model

frompandas import read_csv

fromsklearn.model_selection import train_test_split

fromsklearn.linear_model import LinearRegression

frommlxtend.evaluate import bias_variance_decomp

#load dataset

url ='https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'

dataframe= read_csv(url, header=None)

#separate into inputs and outputs

data= dataframe.values

X, y= data[:, :-1], data[:, -1]

#split the data

X_train,X_test, y_train, y_test = train_test_split(X, y, test_size=0.33,random_state=1)

#define the model

model= LinearRegression()

#estimate bias and variance

mse,bias, var = bias_variance_decomp(model, X_train, y_train, X_test, y_test,loss='mse', num_rounds=200, random_seed=1)

#summarize results

print('MSE:%.3f' % mse)

print('Bias:%.3f' % bias)

print('Variance:%.3f' % var)

执行上述代码,记录估计出的误差和模型的偏差和方差。

注意:考虑到算法或评估过程的自然随机性或者是数值精度的不同,你的结果有可能会存在很大的差异。你可以考虑把这段代码反复执行几次,比较结果的平均值。

本例中,我们可以看到这个模型具有高偏差和低方差。这是预料之中的,因为我们用的是线性回归模型。我们还可以看到估计平均值加上方差等于模型的评估误差,即20.726+1.1761=22.487。

MSE:22.487

Bias:20.726

Variance:1.761

深入了解

如果您想进一步了解,本节将提供更多有关该主题的资源。

教程

机器学习中的偏差-方差权衡:

https://machinelearningmastery.com/gentle-introduction-to-the-bias-variance-trade-off-in-machine-learning/

书籍

《统计学习及其在R中的应用》,2014版:

https://amzn.to/2RC7ElX

《预测模型应用》,2013版:

https://amzn.to/3a7Yzrc

文章

偏差-方差权衡,维基百科:

https://en.wikipedia.org/wiki/Bias%E2%80%93variance_tradeoff

偏差方差分解,MLxtend库:

http://rasbt.github.io/mlxtend/user_guide/evaluate/bias_variance_decomp/

总结

在这篇教程中,你掌握了如何计算一个机器学习模型的偏差和方差。

具体而言,你学到了:

模型误差包含模型方差、模型偏差以及不可约误差。

我们寻求具有低偏差和低方差的模型,但是一般情况下一个值的缩小会导致另一个值的增大。

如何将均方误差分解成模型的偏差和方差。

原文标题:

How to Calculate the Bias-Variance Trade-off with Python

原文链接:

https://machinelearningmastery.com/calculate-the-bias-variance-trade-off/

译者简介:吴振东,法国洛林大学计算机与决策专业硕士。现从事人工智能和大数据相关工作,以成为数据科学家为终生奋斗目标。来自山东济南,不会开挖掘机,但写得了Java、Python和PPT。

转自: 数据派THU 公众号;转载请注明原文链接和作者,如有侵权或出处有误请和我们联系。返回搜狐,查看更多

责任编辑:

python 方差分解_干货 :教你用Python来计算偏差-方差权衡相关推荐

  1. 怎么用python自制计算公式_手把手教你用python制作简易计算器,能够记录你使用的情况...

    话不多说,首先先看效果图,它能够记录你在使用过程中的历史,方便你查看是否有错: 接下来就仔细分析一下是如何制作的: 简易计算器 第一步:导入资源库 在过程中使用到了tkinter这个资源库,win+R ...

  2. python 靶心_手把手教你使用Python实战反欺诈模型|原理+代码

    原标题:手把手教你使用Python实战反欺诈模型|原理+代码 作者 | 萝卜 来源 | 早起Python(ID: zaoqi-python) 本文将基于不平衡数据,使用Python进行 反欺诈模型数据 ...

  3. 用python画皇冠_手把手教你用 Python 绘制酷炫的桑基图!

    原标题:手把手教你用 Python 绘制酷炫的桑基图! 作者 | 周志鹏 责编 | 郭 芮 最近,不止一次收到小伙伴的截图追问: "这个图叫什么???" "这个图真好看! ...

  4. python文本分类_手把手教你在Python中实现文本分类.pdf

    手把手教你在Python 中实现文本分类(附代码.数 据集) 引言 文本分类是商业问题中常见的自然语言处理任务,目标是自动将文本文件分到一个 或多个已定义好的类别中.文本分类的一些例子如下: • 分析 ...

  5. python画图宽度_手把手教你用 Python 绘制酷炫的桑基图!

    作者 | 周志鹏 责编 | 郭   芮 最近,不止一次收到小伙伴的截图追问: "这个图叫什么???" "这个图真好看!!!怎么画啊?" ...... 笔者本没有 ...

  6. python私人定制_手把手教你学python第十五讲(魔法方法续私人“定制”)

    python无处不对象的深刻理解 前面写了这么多,我觉得有必要从一个大的层面,也就是OO来看问题的本质.只要你调用对象的语法是合乎python的习惯的,那就是可以的,我们以前从来没有像下面这么写过,对 ...

  7. python 金融分析代码_手把手教你以python为工具进行量化金融分析

    量化交易是指借助现代统计学和数学的方法,利用计算机技术进行投资交易的方式. 对于从未接触过量化的人来说,想要了解量化到底是做什么的,关键掌握四部份的内容:Python基础知识.金融知识.技术指标.量化 ...

  8. 如何用python开发游戏_手把手教你用Python完成一个控制台小游戏-阿里云开发者社区...

    很多人想学Python程序设计或者已经了解过一点Python程序设计基础,却没办法开发出一个项目. 今天,通过演示一个简单的控制台小游戏制作,手把手教你如何用Python编写一个游戏程序,即便你是个新 ...

  9. 利用python编写祝福_手把手|教你用Python换个姿势,送狗年祝福语

    春节既是一个阖家团圆的节日,也是一个集中问候亲朋好友.了解近况的机会.但是也有很多人过年也不能聚在一起,所以就会会选择发短信这一方式来表达自己的祝福.其中大多人都是复制转发,让人一眼就看穿,显得自己在 ...

最新文章

  1. jquery的attr和prop区别之实例
  2. [转] GIS算法源码集合
  3. LeetCode-二叉树-94. 二叉树的中序遍历
  4. 在ElasticSearch之下(图解搜索的故事)
  5. ie8下修改input的type属性报错
  6. python flask 上传下载 api_python – 使用Flask上传和下载文件
  7. [收藏]网络营销十道羊皮卷
  8. 异步加载AsyncTask小谈+实例
  9. scala函数进阶篇
  10. 吴恩达深度学习——卷积神经网络基础
  11. 导入虚拟机vmware,此主机支持Intel VT-x,但Intel VT-x处于禁用状态和黑屏
  12. 第八章(三)滑动窗口
  13. java api1.8中文版(由谷歌,百度,有道,必应翻译).md
  14. 什么水平才能任教清华计算机系?
  15. stata15中文乱码_如何解决 Stata 14 的中文乱码问题?Chinese support in Stata 14
  16. think-cell 无法安装怎么解决?
  17. python3.7的idle打不开解决办法_python3.4idle为什么打不开
  18. 农村集体资产产权改革试点将全面展开
  19. C++ Primer Plus学习(十三)——代码重用(has-a)
  20. oracle rac 部署方案,RAC基础设施部署方案

热门文章

  1. html背景音乐如何隐藏控件菜单栏,【Divi主题教程】divi主题如何设置顶部菜单栏滚动是进行隐藏...
  2. 电脑上超级好用的几款软件, 建议收藏
  3. 伺服阀放大器接线设置
  4. java 内存例子_简单的例子 关于Java内存管理的讲解
  5. java正则表达式判断正整数,看看这篇文章吧!
  6. 西门子GPRS模块开发详解
  7. PCA算法之特征值分解
  8. 操作系统中的调度算法FCFS、SJF、RR算法(Java实现)
  9. typora如何导出深色背景的pdf
  10. 将keil中的数据绘成波形