在机器学习中,我们训练数据集去训练一个model(模型),通常的做法是定义一个Loss function(损失函数),通过这个最小化loss的过程来提高模型的性能。然而我们学习模型的目的是为了解决实际问题(或者说是训练这个数据集领域中的一般化问题),单纯的将训练数据集的loss最小化,并不能保证在解决更一般的问题时模型仍然是最优,甚至不能保证模型是可用的。这个训练数据集的loss与一般化的数据集的loss之间的差异就叫做generalization error=bias+variance。注意:bias和variance是针对Generalization(一般化,泛化)来说的。

一、Bias

       我们先来看个栗子(参考程序员在深圳的博主的博客),假设实验室收集了老鼠的体重和大小的数据,我们可以建立一个模型,通过输入老鼠的大小来预测老鼠的体重,部分数据的散点图如下。在训练之前,我们还是将数据拆分为两部分,红色的点为训练集,绿色的点表示测试集:

       接下来我们用两个模型来拟合数据(可以使用最小二乘法来拟合),第一个模型如下图所示:

模型一

       可以看到线性模型不能很好的拟合描绘真实数据,我们一般使用 MSE (Mean Squared Error) 来量化这种拟合能力,即预测值和实际值之间的差值的平方的均值。

       第二个模型如下图 所示 :

模型二

       第二个模型完全与数据贴合 ,即用该模型训练数据时,获得的预测值与真实值相等。至此给出bias的定义就不难理解了:

Bias反映的是模型在样本上的输出与真实值之间的误差,即模型本身的精准度,即算法本身的拟合能力。

       从上面的例子可以看出,模型一的bias远大于模型二的bias

二、Variance   

训练完模型后,我们还需要使用测试集对模型进行评估,下图是模型一的评估结果,我们用蓝色虚线来表示测试结果中,预测值和实际情况的差异:

模型一

同样,模型二的评估结果如下:

模型二

通过模型一和模型二可以看出,模型一的预测效果却远远好于模型二的,这说明模型二的预测能力并不稳定,即模型二的variance大于模型一的variance,下面给出variance的定义:

Variance反映的是模型每一次输出结果与模型输出期望之间的误差,即模型的稳定性。反应预测的波动情况。

三、Bias&Variance 

       举个简单的例子(开枪问题)来理解Bias和Variance

想象你开着一架黑鹰直升机,得到命令攻击地面上一只敌军部队,于是你连打数十梭子,结果有一下几种情况:

1.子弹基本上都打在队伍经过的一棵树上了,连在那棵树旁边等兔子的人都毫发无损,这就是方差小(子弹打得很集中),偏差大(跟目的相距甚远)。

2.子弹打在了树上,石头上,树旁边等兔子的人身上,花花草草也都中弹,但是敌军安然无恙,这就是方差大(子弹到处都是),偏差大(同1)。

3.子弹打死了一部分敌军,但是也打偏了些打到花花草草了,这就是方差大(子弹不集中),偏差小(已经在目标周围了)。

4.子弹一颗没浪费,每一颗都打死一个敌军,跟抗战剧里的八路军一样,这就是方差小(子弹全部都集中在一个位置),偏差小(子弹集中的位置正是它应该射向的位置)。

       直观解释如下图所示 :

      

       上图可以对照开枪问题来理解,我们可以看到,Low Variance的这一列数据的集中,稳定性很好,方差很小 ;而High Variance这一列的数据比较分散,说明稳定性不好,也就是方差很大。对于Low Bias这一行,数据大都聚集在中心红点,说明偏差比较小;而对于High Bias这一行,数据与中心红点有一定的偏离,说明偏差比较大。图的右上角代表了过拟合。

四、交叉验证的产生

人们发现用同一数据集,既进行训练,又进行模型误差估计,对误差估计的很不准确,这就是所说的模型误差估计的乐观性。为了克服这个问题,提出了交叉验证。基本思想是将数据分为两部分,一部分数据用来模型的训练,称为训练集;另外一部分用于测试模型的误差,称为验证集。由于两部分数据不同,估计得到的泛化误差更接近真实的模型表现。数据量足够的情况下,可以很好的估计真实的泛化误差。但是实际中,往往只有有限的数据可用,需要对数据进行重用,从而对数据进行多次切分,得到好的估计。(参考听风1996 简书)

五、K-交叉验证的原理 

K-交叉验证是指将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类器的性能指标。K一般大于等于2,实际操作时一般从3开始取,只有在原始数据集合数据量小的时候才会尝试取2.。而K-CV 的实验共需要建立 k 个models,并计算 k 次 test sets 的平均辨识率。在实作上,k 要够大才能使各回合中的 训练样本数够多,一般而言 k=10 (作为一个经验参数)算是相当足够了。

举个栗子:假设将数据集D分为K个包(这里K = 6),每次将其中一个包作为验证集,其他K-1个包作为训练集

六、 Bias、Variance和K-交叉验证关系

K-交叉验证常用来确定不同类型的模型哪一种更好,为了减少数据划分对模型产生的影响 ,最终选取的模型类型是通过K次建模的误差平均值最小的模型。当k较大时,经过更多次数的平均可以学习得到更符合真实数据分布的模型,Bias就小了,但是这样一来模型就更加拟合训练数据集,再去测试集上预测的时候预测误差的期望值就变大了,从而Variance就大了;反之,k较小时模型不会过度拟合训练数据,从而Bias较大,但是正因为没有过度拟合训练数据,Variance也较小。(参考听风1996 简书)

七、K-交叉验证简单代码实现 

假设有数据 X = ([1,2], [3,4], [1,3], [3,5]),Y = ([1, 2, 3, 4]),这里使用的是从sklearn库中引入的KFold

##一个简单的4折交叉验证
from sklearn.model_selection import KFold
import numpy as np
import matplotlib.pyplot as pltX = np.array([[1,2], [3,4], [1,3], [3,5]])
Y = np.array([1, 2, 3, 4])KF = KFold(n_splits = 4)  #建立4折交叉验证方法 查一下KFold函数的参数
for train_index, test_index in KF.split(X):print("TRAIN", train_index, "TEST", test_index)X_train, X_test = X[train_index], Y[test_index]Y_train, Y_test = Y[train_index], Y[test_index]print("对于数据X训练数据:", X_train)print("对于数据X测试数据:", X_test)print("对于数据Y训练数据:", Y_train)print("对于数据Y测试数据:", Y_test)

输出结果:

TRAIN [1 2 3] TEST [0]
对于数据X训练数据: [[3 4][1 3][3 5]]
对于数据X测试数据: [1]
对于数据Y训练数据: [2 3 4]
对于数据Y测试数据: [1]
TRAIN [0 2 3] TEST [1]
对于数据X训练数据: [[1 2][1 3][3 5]]
对于数据X测试数据: [2]
对于数据Y训练数据: [1 3 4]
对于数据Y测试数据: [2]
TRAIN [0 1 3] TEST [2]
对于数据X训练数据: [[1 2][3 4][3 5]]
对于数据X测试数据: [3]
对于数据Y训练数据: [1 2 4]
对于数据Y测试数据: [3]
TRAIN [0 1 2] TEST [3]
对于数据X训练数据: [[1 2][3 4][1 3]]
对于数据X测试数据: [4]
对于数据Y训练数据: [1 2 3]
对于数据Y测试数据: [4]

八、代码解释

   1、KFold(n_splits = 4)            2、KF.split(X)

n_splits:表示划分几等份

shuffle:在每次划分时,是否进行洗牌,①若为Falses时,其效果等同于random_state等于整数,每次划分的结果相同,②若为True时,每次划分的结果都不一样,表示经过洗牌,随机取样的

random_state:随机种子数

split():将数据集划分成训练集和测试集,返回索引生成器

from sklearn.model_selection import KFoldkf = KFold(n_splits=5, random_state=43, shuffle=True)
a=[[1,2],[3,4],[5,6],[7,8],[9,10]]
b=[1,2,3,4,5]
for i,j in kf.split(a,b):print(i,j)
[0 1 2 4] [3]
[0 1 3 4] [2]
[0 2 3 4] [1]
[1 2 3 4] [0]
[0 1 2 3] [4]

以上是对K-交叉验证的总结,如果有什么理解不到位的地方还请指点改正。

K-折交叉验证(原理及实现)相关推荐

  1. python 实现k折交叉验证

    k折交叉验证原理: k折交叉验证是将数据分为k份,选取其中的k-1份为训练数据,剩余的一份为测试数据.k份数据循环做测试集进行测试.此原理适用于数据量小的数据. # k-折交叉验证(此处设置k=10) ...

  2. k折交叉验证(原理+python实现)

    交叉验证用于数据集的数据量不充足情况,将数据集分成训练集.验证集.测试集. k折交叉验证,将数据集先分为训练集与测试集,再把训练集分成k份(大小相等).其中,k-1份作为训练集训练模型,剩下的1份作为 ...

  3. k折交叉验证python代码_K折交叉验证法原理及python实现

    本文为原创文章,转载请注明出处! 在训练数据的过程或者参加数据比赛的时候,常常会遇到数据量不够大的情况,在一次比赛过程我学到一个小技巧-K折交叉验证法(k-fold CrossValidation), ...

  4. Kaggle上分技巧——单模K折交叉验证训练+多模型融合

    一.K折交叉验证训练单个模型 1.1 k 折交叉验证(K-Fold Cross Validation)原理 通过对 k 个不同分组训练的结果进行平均来减少方差,因此模型的性能对数据的划分就不那么敏感, ...

  5. k折交叉验证 python_Python实现K折交叉验证法的方法步骤

    学习器在测试集上的误差我们通常称作"泛化误差".要想得到"泛化误差"首先得将数据集划分为训练集和测试集.那么怎么划分呢?常用的方法有两种,k折交叉验证法和自助法 ...

  6. matlab-K折交叉验证与分层K折交叉验证

    文章目录 K折交叉验证有什么用? 如何实现K折交叉验证? K折交叉验证的要点:(文字版) 如何实现K折交叉验证(图片版) 如何实现K折交叉验证(matlab版) 为啥我们需要分层K折交叉验证? 如何实 ...

  7. Pytorch最简单的图像分类——K折交叉验证处理小型鸟类数据集分类2.0版本ing

    https://blog.csdn.net/hb_learing/article/details/110411532 https://blog.csdn.net/Pl_Sun/article/deta ...

  8. 训练集、测试集的划分——K折交叉验证

    文章目录 一.训练集.测试集 二.交叉验证法 1.目的 2.原理 3.具体步骤 一.训练集.测试集 训练集(Training Set):帮助我们训练模型,简单的说就是通过训练集的数据让我们确定拟合曲线 ...

  9. 机器学习实战---朴素贝叶斯算法实现+使用K折交叉验证(代码详解+创新)

    <机器学习实战朴素贝叶斯算法实现+使用K折交叉验证> 未经允许,不得擅自转载! 提供数据集如下(永久有效,需要的自行下载): 链接:https://pan.baidu.com/s/1Sv0 ...

  10. 【机器学习】Stacking与K折交叉验证

    其他机器学习系列文章见于专题:机器学习进阶之路--学习笔记整理,欢迎大家关注. 1. Stacking定义   Stacking并不是简单地对个体学习器的结果做简单逻辑处理,而是先从初始数据集训练出初 ...

最新文章

  1. 在express.js上启用HTTPS
  2. 书多嚼不烂,看书的方法
  3. linux 在某个core上的中断 affinity c语言函数,Linux中断处理体系结构
  4. A. Powered Addition【贪心】
  5. Linux深入理解Socket异常
  6. TCP的三次握手和四次挥手的过程?
  7. 论文遇到的格式问题和修正方式
  8. MapReduce论文
  9. java处理excel的读写
  10. poj2054 Color a Tree
  11. python怎么安装requests包_python怎么安装requests库
  12. NRF52832-USB-Dangle-DIY笔记
  13. hardfault常见原因_STM32 出现 hardfault_handler 处理方法
  14. Halcon学习-算子学习-映射/傅里叶变换/gen_grid_region/rft_generic例程
  15. inflect java_在native线程利用JNI 反射自定义类
  16. matlab 输出矩阵 逗号隔开,在MATLAB中自定义矩阵时,矩阵同行元素之间用逗号隔开,而每一行元素之间用分号隔开。...
  17. git 清除版本库中的忽略文件
  18. 少儿美术课儿童画之水彩画第3集《高高的长颈鹿》
  19. NTC转0-10V/0-5V热敏电阻转模拟信号温度变送器/温度变送器Cu50 PT100热电阻K型S型电偶NTC转4-20mA 0-10V模拟量NTC热敏电阻转电压10K NTC转0-5V0-10V
  20. 设备管理器里“SM总线控制器”、“其他PCI桥设备”驱动有问题

热门文章

  1. 胡因梦-生命的不可思议
  2. python 化学反应_有意思的Python:用python配平化学方程式
  3. 如何在iPhone上禁用Apple CarPlay
  4. 怎样选择合适的电流继电器
  5. Lipschitz连续
  6. 深度学习论文翻译解析(二十):YOLOv4: Optimal Speed and Accuracy of Object Detection
  7. java技术英文名词读音_Java开发,Java development,音标,读音,翻译,英文例句,英语词典...
  8. MMQ 开源免费 同时支持分布式架构和数据持久化、规则引擎、ACL的MQTT broker。
  9. android安卓使用socketIO实现聊天室功能
  10. 微信公众号授权 提示内容与下载文件不符,请检查文件内容或重新上传