偏差-方差分解

参考链接:https://www.zhihu.com/question/20448464
https://blog.csdn.net/simple_the_best/article/details/71167786
算法在不同的训练集的上学得的模型是不同的,即使训练集来自同一分布。对测试样本xxx,令yDy_{D}yD​为x\mathbf{x}x在数据集上的标记,yyy为x\mathbf{x}x的真实标记,f(x;D)f(\mathbf{x};D)f(x;D)为训练集DDD上训练所得模型fff在x(x不一定∈D)\mathbf{x}(\mathbf{x}不一定\in D)x(x不一定∈D)上的预测输出。
算法在不同数据集DDD上的期望预测为:fˉ(x)=ED[f(x;D)]\bar{f}(x)=E_{D}[f(x;D)]fˉ​(x)=ED​[f(x;D)]
上式为从不同训练集DDD上训练的不同的fff,对输入的x\mathbf{x}x的预测值的期望。

泛化误差:
以回归问题为例,模型的平方误差期望为:err(x)=ED[(yD−f(x;D))2]err(\mathbf{x})=E_{D}[(y_{D}-f(\mathbf{x};D))^{2}]err(x)=ED​[(yD​−f(x;D))2]
上式为从不同训练集DDD上训练的不同的fff,对输入的x\mathbf{x}x的预测值误差的期望。
偏差:模型期望预测值与真实值之间的偏离程度,刻画了模型的拟合能力。
bias2(x)=(fˉ(x)−y)2bias^{2}(x)=(\bar{f}(x)-y)^{2}bias2(x)=(fˉ​(x)−y)2
方差:度量了相同样本数量的不同训练集的变动所导致的学习性能变化,刻画了数据扰动所造成的影响。
var(x)=ED[(f(x;D)−fˉ(x))2]var(x)=E_{D}[(f(x;D)-\bar{f}(x))^{2}]var(x)=ED​[(f(x;D)−fˉ​(x))2]
噪声: 样本在数据集中的标记与真实标记的误差。表示了算法期望泛化误差的下限,刻画了问题本身的难度。因为假设数据很烂,噪声高,此时模型再厉害也很难学习好,造成了该问题很难解决。ε2=ED[(yD−y)2]\varepsilon^{2}=E_{D}[(y_{D}-y)^{2}]ε2=ED​[(yD​−y)2]
为便于讨论,假定无噪声,ED[yD−y]=0E_{D}[y_{D}-y]=0ED​[yD​−y]=0。对算法的期望泛化误差进行分解:

上式推理中:ED[2(f(x;D)−fˉ(x))(fˉ(x)−yD)]=0E_{D}[2(f(\bm{x};D)-\bar{f}(\bm{x}))(\bar{f}(\bm{x})-y_{D})]=0ED​[2(f(x;D)−fˉ​(x))(fˉ​(x)−yD​)]=0,展开过程如下:
ED[f(x;D)fˉ(x)−f(x;D)yD−fˉ2(x)+fˉ(x)yD)]=ED[f(x;D)fˉ(x)−fˉ2(x)]+ED[fˉ(x)yD−f(x;D)yD]=fˉ(x)ED[f(x;D)]−fˉ2(x)+fˉ(x)ED(yD)−ED[f(x;D)yD]=fˉ2(x)−fˉ2(x)+fˉ(x)ED(yD)−fˉ(x)ED(yD)=0E_{D}[f(\bm{x};D)\bar{f}(\bm{x})-f(\bm{x};D)y_{D}-\bar{f}^{2}(\bm{x})+\bar{f}(\bm{x})y_{D})] \\ =E_{D}[f(\bm{x};D)\bar{f}(\bm{x})-\bar{f}^{2}(\bm{x})]+E_{D}[\bar{f}(\bm{x})y_{D}-f(\bm{x};D)y_{D}] \\ =\bar{f}(\bm{x})E_{D}[f(\bm{x};D)]-\bar{f}^{2}(\bm{x})+\bar{f}(\bm{x})E_{D}(y_{D})-E_{D}[f(\bm{x};D)y_{D}]\\ =\bar{f}^{2}(\bm{x})-\bar{f}^{2}(\bm{x})+\bar{f}(\bm{x})E_{D}(y_{D})-\bar{f}(\bm{x})E_{D}(y_{D})=0ED​[f(x;D)fˉ​(x)−f(x;D)yD​−fˉ​2(x)+fˉ​(x)yD​)]=ED​[f(x;D)fˉ​(x)−fˉ​2(x)]+ED​[fˉ​(x)yD​−f(x;D)yD​]=fˉ​(x)ED​[f(x;D)]−fˉ​2(x)+fˉ​(x)ED​(yD​)−ED​[f(x;D)yD​]=fˉ​2(x)−fˉ​2(x)+fˉ​(x)ED​(yD​)−fˉ​(x)ED​(yD​)=0
泛化误差可分解为偏差、方差和噪声之和。偏差-方差分解说明,为了取得好的泛化性能,则需使偏差较小,能够充分拟合数据,并且使方差较小,使得数据扰动产生的影响小。
偏差与方差是有冲突的,称为偏差-方差窘境(bias-variance dilemma).在训练不足时,模型的拟合能力不强,训练数据的扰动不足以使得模型产生显著变化,此时偏差在主导了泛化误差;随着训练程度的加深,学习器的拟合能力增强,训练数据产生的扰动渐渐能被渐渐能被学到,方差主导了泛化错误率;在训练程度充足时,模型的拟合能力非常强,训练数据的发生的轻微扰动都会使得模型发生显著变化。


如图所示为多项式的次数与误差的关系。
高偏差:相当于图中的左侧。
Jtrain(θ)较大,Jtrain(θ)≈JCV(θ)J_{train}(\theta)较大,J_{train}(\theta) \approx J_{CV}(\theta)Jtrain​(θ)较大,Jtrain​(θ)≈JCV​(θ)

高方差:相当于图中的右侧。
Jtrain(θ)较小,Jtrain(θ)≪JCV(θ)J_{train}(\theta)较小,J_{train}(\theta) \ll J_{CV}(\theta)Jtrain​(θ)较小,Jtrain​(θ)≪JCV​(θ)
训练得到的模型太拟合训练数据了。不同的训练数据训练的模型效果波动很大。

#学习曲线
参考:http://scikit-learn.org/stable/modules/learning_curve.html#learning-curve
学习曲线即为准确率随训练样本数量的变化曲线。更多的训练样本有助于降低过拟合程度,在实践中,收集更多的数据会带来高昂的成本。通过将模型的训练及验证准确率看作是训练数据集大小的函数,并绘制图像,可以很容易看出收集更多的数据是否有助于解决问题。
使用威斯康星乳腺癌数据集绘制学习曲线:

import matplotlib.pyplot as plt
from sklearn.model_selection import learning_curve
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split'''
读取乳腺癌数据集
数据集前两列存储样本ID和诊断结果(M代表恶性,B代表良性)
3~32列包含了30个特征
'''
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases'+ '/breast-cancer-wisconsin/wdbc.data',header=None)
X = df.loc[:, 2:].values
y = df.loc[:, 1].values
le =LabelEncoder()
# 将类标从字符串(M或B)变为整数的(0,1)
y = le.fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)'''
在流水线中集成标准化操作以及分类器
PipeLine对象采用元组的序列作为输入,每个元组第一个值为字符串,
可以通过字符串访问流水线的元素,第二个值为sklearn中的转换器或评估器
'''
pipe_lr = Pipeline([('scl', StandardScaler()),('clf', LogisticRegression(penalty='l2', random_state=0))
])
'''
learning_curve默认使用分层K折交叉验证
'''
train_sizes, train_scores, valid_scores = \learning_curve(estimator=pipe_lr,X=X_train,y=y_train,train_sizes=np.linspace(0.1, 1.0, 10),cv=10)train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
valid_mean = np.mean(valid_scores, axis=1)
valid_std = np.std(valid_scores, axis=1)plt.plot(train_sizes, train_mean, c='blue', marker='o', markersize=5,label='training accuracy')
plt.fill_between(train_sizes,train_mean - train_std,train_mean + train_std,alpha=0.15, color='blue')plt.plot(train_sizes, valid_mean, c='green', marker='o', markersize=5,linestyle='--', label='validation accuracy')
plt.fill_between(train_sizes,valid_mean - valid_std,valid_mean + valid_std,alpha=0.15, color='green')plt.grid()
plt.xlabel('Number of training samples')
plt.ylabel('Accuracy')
plt.legend(loc='best')
plt.ylim([0.8, 1.01])
plt.show()

从图中可以看出,数据集样本的数量在300~350之间时,泛化能力最强。模型在数据集较小的情况下,随着样本数量的增多训练准确率下降,说明模型陷入了过拟合。在250样本数量之后,模型趋于饱和和稳定,并具有轻微的过拟合现象。

#验证曲线
验证曲线是准确率与模型超参数之间的关系,可以从关系中看出超参数在什么时候泛化能力最强,以及什么时候会陷入欠拟合或者过拟合。
使用逻辑斯谛回归中的正则化参数CCC绘制验证曲线:

import matplotlib.pyplot as plt
from sklearn.model_selection import validation_curve
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split'''
读取乳腺癌数据集
数据集前两列存储样本ID和诊断结果(M代表恶性,B代表良性)
3~32列包含了30个特征
'''
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases'+ '/breast-cancer-wisconsin/wdbc.data',header=None)
X = df.loc[:, 2:].values
y = df.loc[:, 1].values
le =LabelEncoder()
# 将类标从字符串(M或B)变为整数的(0,1)
y = le.fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)'''
在流水线中集成标准化操作以及分类器
PipeLine对象采用元组的序列作为输入,每个元组第一个值为字符串,
可以通过字符串访问流水线的元素,第二个值为sklearn中的转换器或评估器
'''
pipe_lr = Pipeline([('scl', StandardScaler()),('clf', LogisticRegression(penalty='l2', random_state=0))
])param_range = [0.001, 0.01, 0.1, 1.0, 10.0, 100.0]
train_scores, valid_scores = \validation_curve(estimator=pipe_lr,X=X_train,y=y_train,# 可以通过estimator.get_params().keys()获取param索引名param_name='clf__C',param_range=param_range,cv=10)train_mean = np.mean(train_scores, axis=1)
train_std = np.std(train_scores, axis=1)
valid_mean = np.mean(valid_scores, axis=1)
valid_std = np.std(valid_scores, axis=1)plt.plot(param_range, train_mean, c='blue', marker='o', markersize=5,label='training accuracy')
plt.fill_between(param_range,train_mean - train_std,train_mean + train_std,alpha=0.15, color='blue')plt.plot(param_range, valid_mean, c='green', marker='o', markersize=5,label='validation accuracy')
plt.fill_between(param_range,valid_mean - valid_std,valid_mean + valid_std,alpha=0.15, color='green')plt.grid()
plt.xscale('log')
plt.xlabel('Parameter C')
plt.ylabel('Accuracy')
plt.legend(loc='best')
plt.ylim([0.8, 1.0])
plt.show()

从图中可以看出,最优点在C=0.1附件。C值较小时,随着C值越大,训练准确率和验证准确率逐渐上升,说明模型处于欠拟合;C值较大时,随着C值越大,训练准确率逐渐上升,验证准确率下降,说明模型处于过拟合。

偏差-方差分解,学习和验证曲线评估模型相关推荐

  1. 机器学习之过拟合与欠拟合以及偏差-方差分解

    1.过拟合 所谓过拟合就是:把训练样本自身的一些特点当作了所有潜在样本都会具有的一般性质,这样就会导致训练出的模型其泛化能力降低,这就是过拟合. 如何解决? 1)Early stopping Earl ...

  2. 【机器学习-西瓜书】二、偏差-方差分解;泛化误差

    2.5偏差与方差 关键词:偏差-方差分解:泛化误差 . 偏差-方差分解是解释算法泛化性能的一种重要工具.偏差-方差分解试图对学习算法的期望泛化错误率进行拆解. 泛化误差可分解为:偏差,方差与噪声之和. ...

  3. 1.2 偏差/方差-深度学习第二课《改善深层神经网络》-Stanford吴恩达教授

    ←上一篇 ↓↑ 下一篇→ 1.1 训练/开发/测试集 回到目录 1.3 机器学习基础 偏差/方差 (Bias/Variance) 我注意到,几乎所有机器学习从业人员都期望深刻理解偏差和方差,这两个概念 ...

  4. 5折交叉验证_交叉验证:评估模型表现

    注明:本文章所有代码均来自scikit-learn官方网站 在实际情况中,如果一个模型要上线,数据分析员需要反复调试模型,以防止模型仅在已知数据集的表现较好,在未知数据集上的表现较差.即要确保模型的泛 ...

  5. 偏差-方差分解 Bias-Variance Decomposition(转载)

    转载自http://www.cnblogs.com/jmp0xf/archive/2013/05/14/Bias-Variance_Decomposition.html 完全退化了,不会分解,看到别人 ...

  6. 【机器学习】什么是学习曲率?如何解决模型中方差和偏差问题?什么是迁移学习?什么是模型的精确率和召回率?

    系列文章目录 第十二章 Python 机器学习入门之构建机器学习系统 系列文章目录 文章目录 一.学习曲率 二.利用大型神经网络解决方差和偏差问题 三.机器学习开发的迭代循环 四.误差分析 五. 添加 ...

  7. python 方差分解_干货 :教你用Python来计算偏差-方差权衡

    原标题:干货 :教你用Python来计算偏差-方差权衡 作者:Jason Brownlee 翻译:吴振东 本文约3800字,建议阅读8分钟. 本文为你讲解模型偏差.方差和偏差-方差权衡的定义及联系,并 ...

  8. 机器学习_周志华_西瓜书_学习笔记_第二章--模型的评估与选择

    2 模型的评估与选择 2.1 误差与过拟合 我们将学习器对样本的实际预测结果与样本的真实值之间的差异成为:误差(error).定义: 在训练集上的误差称为训练误差(training error)或经验 ...

  9. 独家 | 教你用Python来计算偏差-方差权衡

    作者:Jason Brownlee 翻译:吴振东 校对:车前子 本文约3800字,建议阅读8分钟. 本文为你讲解模型偏差.方差和偏差-方差权衡的定义及联系,并教你用Python来计算. 衡量一个机器学 ...

最新文章

  1. 20162313苑洪铭 第一周作业
  2. 写出一个超强的lighttpd模块
  3. 【控制】《现代控制理论》谢克明老师-第2章-线性控制系统状态空间表达式的求解
  4. 利用CORS实现跨域请求--转
  5. TypeScript学习笔记1:变量赋值及书写方式
  6. async await实例
  7. 最优化课堂笔记02:第二章 线性规划
  8. redirect重定向后https变成了http如何解决
  9. 洛谷 P2341 [HAOI2006]受欢迎的牛
  10. 怎么在InfoPath Web浏览器表单中弹出对话框?
  11. conda - 创建虚拟环境并配置tensorflow-gpu
  12. 基于bp神经网络的房价预测,房价预测 神经网络
  13. PC/104总线简述
  14. 小米wifi显示无网络连接到服务器,小米路由器wifi连接上不能上网怎么办?
  15. 第8节 破解系统密码—利用win7漏洞和PE系统破解密码
  16. gentoo mysql_Gentoo 安装 Mysql
  17. kali 安装volatility_Linux下内存取证工具Volatility的使用
  18. 一张图,理清微服务架构路线(收藏)
  19. 互联网+双“高新”时代
  20. 使用Qt做一个简单计算器

热门文章

  1. 【源码分析设计模式 5】Java I/O系统中的装饰器模式
  2. 雅克比矩阵(上)-----雅克比推导
  3. 微信小程序 超市购物页面
  4. 基于JAVA社区生活超市管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
  5. java程序读取excel表格并存入mysql数据库详细教程
  6. win10美化成macos
  7. java.lang.UnsatisfiedLinkError:sayHello()
  8. ios swift5 自定义初始化方法 convenience init UIViewController
  9. 树的3种常用链表结构
  10. opencv-python 指静脉的手指轮廓提取实现