|如何用Python来计算偏差-方差权衡?



|如何用Python来计算偏差-方差权衡?
本文插图

作者:Jason Brownlee翻译:吴振东校对:车前子本文约3800字 , 建议阅读8分钟 。 本文为你讲解模型偏差、方差和偏差-方差权衡的定义及联系 , 并教你用Python来计算 。
衡量一个机器学习模型的性能 , 可以用偏差和方差作为依据 。
一个高偏差的模型 , 总是会对数据分布做出强假设 , 比如线性回归 。 而一个高方差的模型 , 总是会过度依赖于它的训练集 , 例如未修剪的决策树 。 我们希望一个模型的偏差和方差都很低 , 但更多情况下我们需要在二者之间做出权衡 。
在选择和调整模型时 , “偏差-方差权衡”是一个非常有用的概念 。 当然它在一般情况下是无法直接计算的 , 因为这需要这一问题领域内的全部知识 , 而我们并不具备 。 尽管如此 , 我们可以评估出一个模型的误差 , 并将其拆分成偏差和方差两部分 , 从而借此了解该模型的运行方式 。
在这篇教程中 , 你将了解如何计算一个机器学习模型的偏差和方差 。
在完成这篇教程后 , 你将会学到:

  • 模型误差包含模型方差、模型偏差以及不可约误差;
  • 我们希望模型具有低偏差和低方差 , 但是一般情况下一个值的缩小会导致另一个值的增大;
  • 如何将均方误差分解成模型的偏差和方差 。
我的新书《用Python掌握机器学习》(https://machinelearningmastery.com/machine-learning-with-python/)将帮助你开始新的项目 , 其中包括分步教程和所有示例的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= http://news.hoteastday.com/a/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
深入了解
如果您想进一步了解 , 本节将提供更多有关该主题的资源 。
  • 教程
机器学习中的偏差-方差权衡:
【|如何用Python来计算偏差-方差权衡?】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/
编辑:晏斓辉
译者简介
|如何用Python来计算偏差-方差权衡?
本文插图

吴振东 , 法国洛林大学计算机与决策专业硕士 。 现从事人工智能和大数据相关工作 , 以成为数据科学家为终生奋斗目标 。 来自山东济南 , 不会开挖掘机 , 但写得了Java、Python和PPT 。
——END——
想要获得更多数据科学领域相关动态 , 诚邀关注清华-青岛数据科学研究院官方微信公众平台“ 数据派THU ” 。 欢迎大家评论区讨论和留言~


    推荐阅读