一、前言

在机器学习建模过程中,通行的做法是将数据分为训练集和测试集。测试集是与训练独立的数据,完全不参与训练,用于最终模型的评估。在训练过程中,经常会出现过拟合的问题,就是模型可以很好的匹配训练数据,却不能很好在预测训练集外的数据。如果此时就使用测试数据来调整模型参数,就相当于在训练时已知部分测试数据的信息,会影响最终评估结果的准确性。通常的做法是在训练数据再中分出一部分做为验证(Validation)数据,用来评估模型的训练效果。

验证数据取自训练数据,但不参与训练,这样可以相对客观的评估模型对于训练集之外数据的匹配程度。模型在验证数据中的评估常用的是交叉验证,又称循环验证。它将原始数据分成K组(K-Fold),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型。这K个模型分别在验证集中评估结果,最后的误差MSE(Mean Squared Error)加和平均就得到交叉验证误差。交叉验证有效利用了有限的数据,并且评估结果能够尽可能接近模型在测试集上的表现,可以做为模型优化的指标使用。

补充:

  • 训练集(train set) —— 用于模型拟合的数据样本。
  • 验证集(development set)—— 是模型训练过程中单独留出的样本集,它可以用于调整模型的超参数和用于对模型的能力进行初步评估。

       在普通的机器学习中常用的交叉验证(Cross Validation) 就是把训练数据集本身再细分成不同的验证数据集去训练模型。

  • 测试集 —— 用来评估模最终模型的泛化能力。但不能作为调参、选择特征等算法相关的选择的依据。
类别 验证集 测试集
是否被训练到
作用 用于调超参数,监控模型是否发生过拟合(以决定是否停止训练) 为了评估最终模型泛化能力
使用次数 多次使用,以不断调参 仅仅一次使用
缺陷 模型在一次次重新手动调参并继续训练后所逼近的验证集,可能只代表一部分非训练集,导致最终训练好的模型泛化性能不够 测试集为了具有泛化代表性,往往数据量比较大,测试一轮要很久,所以往往只取测试集的其中一小部分作为训练过程中的验证集

一个形象的比喻:

训练集-----------学生的课本;学生 根据课本里的内容来掌握知识。

验证集------------作业,通过作业可以知道 不同学生学习情况、进步的速度快慢。

测试集-----------考试,考的题是平常都没有见过,考察学生举一反三的能力。

传统上,一般三者切分的比例是:6:2:2,验证集并不是必须的。

为什么要测试集

a)训练集直接参与了模型调参的过程,显然不能用来反映模型真实的能力(防止课本死记硬背的学生拥有最好的成绩,即防止过拟合)

b)验证集参与了人工调参(超参数)的过程,也不能用来最终评判一个模型(刷题库的学生不能算是学习好的学生)。

c) 所以要通过最终的考试(测试集)来考察一个学(模)生(型)真正的能力(期末考试)

但是仅凭一次考试就对模型的好坏进行评判显然是不合理的,所以接下来就要介绍交叉验证法

二、 K折交叉验证:sklearn.model_selection.KFold(n_splits=3, shuffle=False, random_state=None)

2.1 KFold简介

一般情况将K折交叉验证用于模型调优,找到使得模型泛化性能最优的超参值。找到后,在全部训练集上重新训练模型,并使用独立测试集对模型性能做出最终评价。K折交叉验证使用了无重复抽样技术的好处:每次迭代过程中每个样本点只有一次被划入训练集或测试集的机会。

2.2 原理介绍

K折交叉验证,就是将数据集等比例划分成K份,以其中的一份作为测试数据,其他的K-1份数据作为训练数据。然后,这样算是一次实验,而K折交叉验证只有实验K次才算完成完整的一次,也就是说交叉验证实际是把实验重复做了K次,每次实验都是从K个部分选取一份不同的数据部分作为测试数据(保证K个部分的数据都分别做过测试数据),剩下的K-1个当作训练数据,最后把得到的K个实验结果进行平分。

具体来说就是,如下图,将数据集D分为10等份,每次按照顺序将一份作为测试集,剩下的九份作为训练集。这样就相当于得到了十份不同的数据集,对这10份不同的数据集运行,然后取平均得到结果就可以了。

(图中红色的部分为每次从样本数据集中抽取出来作为测试集的部分。) 

补充:

1. 如果训练数据集相对较小,则增大k值。

增大k值,在每次迭代过程中将会有更多的数据用于模型训练,能够得到最小偏差,同时算法时间延长。且训练块间高度相似,导致评价结果方差较高。

2.如果训练集相对较大,则减小k值。

减小k值,降低模型在不同的数据块上进行重复拟合的性能评估的计算成本,在平均性能的基础上获得模型的准确评估。

2.3 代码展示

sklearn.model_selection.KFold(n_splits=3, shuffle=False, random_state=None)

思路:将数据集划分n_splits个互斥子集,每次用其中一个子集当作验证集,剩下的n_splits-1个作为训练集,进行n_splits次训练和测试,得到n_splits个结果(即2.2中所说的分成k等份)

参数说明:

n_splits:表示划分几等份

shuffle:在每次划分时,是否进行洗牌

①若为Falses时,其效果等同于random_state等于整数,每次划分的结果相同

②若为True时,每次划分的结果都不一样,表示经过洗牌,随机取样的

random_state:随机种子数,如果设置了具体数值比如42(随便一个具体数值),那么每次运行结果都是一样的,不会随机产生结果,即每次运行结果都可以复现

from sklearn.model_selection import KFold
import numpy as np
X = ['a','b','c','d']
kf = KFold(n_splits=4)
for train, test in kf.split(X):print(train,test)print("--------")print(np.array(X)[train], np.array(X)[test])print("*"*50)

结果

2.4 经验总结

运用Kfold交叉验证时,在一个限度内k的值越大越好。因为k越大我们验证的次数就越多,最后取出来的平均数越能代表训练模型的准确度。

但是k是需要在一个限度之内的。k太大有两个坏处:

1. 容易给机器造成过重负担,花费大量时间。

2. 每一次验证的测试集(或验证集)中数据太少,很难得到准确的误报率。

总体而言,k一般取10,取值依不同项目情况而定,当然一定存在k<n(训练集数据条数)。

KFold----交叉验证相关推荐

  1. Kfold交叉验证心得

    运用Kfold交叉验证时,在一个限度内k的值越大越好.因为k越大我们验证的次数就越多,最后取出来的平均数越能代表训练模型的准确度. 但是k是需要在一个限度之内的.k太大有两个坏处. 1. 容易给机器造 ...

  2. sklearn K折(KFold)交叉验证案例,展开细节代码与cross_validate简写

    文章目录 一.通常的随机森林模型代码 二.K折交叉验证的随机森林代码 1. 切分方式:随机切分 2.切分方式:不均衡数据集下按比例切分 三.KFold的简便写法 四.随机森林预测与KFold交叉验证完 ...

  3. python kfold交叉验证_Scikit Learn-使用KFold交叉验证的决策树

    我对scikit学习/机器学习比较陌生 . 我必须使用Titanic数据集创建决策树,并且需要使用5倍的KFold交叉验证 . 这是我到目前为止所拥有的: cv = KFold(n_splits=5) ...

  4. python kfold交叉验证_KFold交叉验证

    KFold模块 from sklearn.model_selection import KFold 为什么要使用交叉验证?交叉验证的介绍 交叉验证是在机器学习建立模型和验证模型参数时常用的办法. 交叉 ...

  5. K-Fold交叉验证 原理+python实现

    K-交叉验证是指将原始数据分成K组(一般是均分),将每个子集数据分别做一次验证集,其余的K-1组子集数据作为训练集,这样会得到K个模型,用这K个模型最终的验证集的分类准确率的平均数作为此K-CV下分类 ...

  6. python kfold交叉验证_Python sklearn KFold 生成交叉验证数据集的方法

    源起: 1.我要做交叉验证,需要每个训练集和测试集都保持相同的样本分布比例,直接用sklearn提供的KFold并不能满足这个需求. 2.将生成的交叉验证数据集保存成CSV文件,而不是直接用sklea ...

  7. python kfold交叉验证_Python sklearn KFold 生成交叉验证数据集

    源起: 1.我要做交叉验证,需要每个训练集和测试集都保持相同的样本分布比例,直接用sklearn提供的KFold并不能满足这个需求. 2.将生成的交叉验证数据集保存成CSV文件,而不是直接用sklea ...

  8. KFold交叉验证实现

    实现代码 import pandas as pd from sklearn.model_selection import GroupKFoldtrain = pd.read_csv("../ ...

  9. KFold交叉验证的用法

    from sklearn.model_selection import KFoldkfold = KFold(n_splits=5, shuffle=False) # n_splits:将原始数据分成 ...

  10. python kfold交叉验证_kfold交叉验证python

    我是python的初学者.我写了下面的函数来分区从csv文件读取的数据.索引生成没有错误,但是当我用这个索引拆分df时,结果是不正确的.我的代码怎么了?在def partition(k, number ...

最新文章

  1. 手摸手入门前端--01.webpack4
  2. poj pku 2528 线段树的基础应用
  3. html+js获取系统当前日期并输出
  4. CTFshow php特性 web125
  5. EF Core Model更新迁移
  6. 使用mybatis-generator-core实现自动创建项目
  7. NYOJ 128 前缀式计算
  8. jupyter下使用conda环境
  9. Kibana部署及配置(四)
  10. leetcode645. 错误的集合
  11. 阿里依然在“飙车”!第一财季净利润309.49亿元 同比增长54%
  12. leetcode-6-Z字形变换
  13. Tensorflow中的TFRecord、Queue和多线程
  14. WPF事件,路由事件
  15. 如何用hover实现下拉菜单
  16. antdesignpro 重定向到登录页面_Bluehost 域名解析和 301 重定向设置
  17. 普元EOS之性能调优
  18. 计算机组装需要注意什么东西,自己组装电脑需注意事项图文详情
  19. 【图像处理】多光谱 波长波段划分 主要波段特性 植被遥感原理 典型植被指数
  20. vue实现搜索框记录搜索历史_Vue 实现输入框新增搜索历史记录功能

热门文章

  1. android中radiogroup作用,Android View系列---RadioGroup与RadioButton
  2. 六年前网瘾少年,六年后20k北漂测试人,过来人给朋友们一些建议。
  3. 关于CSS中position属性和overflow属性的使用小结
  4. 计算机系统装机教程,电脑装机教程,详细教您如何给电脑装机
  5. 孙强:IT治理需六方结合
  6. 贪心算法之阿里巴巴与四十大盗——背包问题
  7. cuda入门——记录
  8. 使用junit测试遇到@test cannot resolve symble
  9. OCR-paddleocr
  10. linux安装SELinux管理工具,配置SELinux