一、什么是k折交叉验证?

在训练阶段,我们一般不会使用全部的数据进行训练,而是采用交叉验证的方式来训练。交叉验证(Cross Validation,CV)是机器学习模型的重要环节之一。它可以增强随机性,从有限的数据中获得更全面的信息,减少噪声干扰,从而缓解过拟合,增强模型的泛化能力。

比赛一般会只给我们训练集,但是测试集我们是看不到的,所以我们一般会将训练集按照一定的方式划分为训练集和验证集。训练集用于模型的训练,验证集用于本地验证,选取最好的pt权重文件,再提交到比赛官网进行测试集的验证。所以如何划分训练集和验证集,让我们最大限度的利用训练集,学习有效的特征,是至关重要的。交叉验证就是做这个事的。

交叉验证步骤:

  1. 将整个数据集划分为大小相等的K个部分;
  2. 每次选取其中一份作为验证集,其余K-1份作为训练集进行训练;
  3. 重复K次,直至每一份数据都被当作验证集验证了一遍;
  4. 模型的最终精度是通过K个子模型的平均精度来计算的;

下面这个图可以比较好的诠释上面这个过程:

我们一般不会自己实现这个功能,一般都是调用SKLearn包直接使用,SKlearn帮我们实现了KFold、Stratified KFold、Group KFold和Stratified Group KFold四种方式,下面我一一介绍它们的区别和用法。

二、常见的几种交叉验证方式

2.1、KFold

KFold是最简单的一种K折交叉验证,它的具体步骤如下图所示是一个4折交叉验证,橘色代表验证集(1份),蓝色代表训练集(3份),整个数据集有三个类别(对应图中三种颜色的分布情况);这些数据属于很多个不同的组;


可以看的很清楚,这种K折交叉验证,有两个缺点:

  1. 不适应于数据集样本不均衡的情况,因为很可能会把整个少数的类别划分为验证集或训练集;
  2. 不适应于时间序列问题;

2.2、Stratified(分层) KFold

上面讲到,KFold不适应于数据不平衡的问题,所以Stratified KFold(分层)交叉验证就是专门来解决这个问题的。如下图,在分层交叉验证中,数据集依然被划分为K组,但是验证组的目标类别是从各个类中分层抽取出来的,是均匀的,所以就不会存在少数类别被全部划分为验证集或训练集。

特点:可以解决数据不平衡问题,但是不适应于时间序列问题。

2.3、Group (分组)KFold

GroupKFold是KFold一个变体,目的在于将group严格分开,就是说同一个group的数据只能出现在训练集或者验证集,不能同时出现在训练集和验证集,如下图:特点:可以将数据的group完全分开,避免高度相似的样本既出现在训练集又测试在验证集。

2.4、Stratified Group KFold

Group KFold和Stratified KFold的合体,如下图:


特点:可以将数据的group和标签的class完全分层划开,避免出现样本高度相似和标签分布不均的问题。

2.5、Time Series Split

可以解决时间序列相关的问题。对于时间序列数据集,根据时间将数据分为训练和验证,也称为前向链接方法或滚动交叉验证。

使用方式举例:

skf = StratifiedGroupKFold(n_splits=CFG.n_fold, shuffle=True, random_state=CFG.seed)
for fold, (train_idx, val_idx) in enumerate(skf.split(df, df['empty'], groups = df["case"])):

三、什么是TTA?

TTA,即Test time augmention,测试时增强。数据增强一般是出现在训练阶段,使用数据增强一般都能提升性能。而测试时数据增强是指在测试的时候,将原图进行数据增强(比如水平翻转、垂直翻转、对角线翻转、旋转等,这里假设使用了3种数据增强),可以得到4张测试图片,对这四张测试图片分布进行推理,得到推理结果。再对三张增强后的推理结果再变换回来(比如我对原图进行水平翻转,得到的mask,再对mask进行水平翻转)。最后就得到了4张预测结果,对这四张预测结果mask对应位置相加取平均,就得到了最终的mask预测果。

使用方式举例:

       model = build_model(CFG, test_flag=True)model.load_state_dict(torch.load(sub_ckpt_path))model.eval()y_preds = model(images) # [b, c, w, h]y_preds   = torch.nn.Sigmoid()(y_preds)masks += y_preds#x,y,xy flips as TTAif CFG.tta:flips = [[-1]]  # 水平翻转for f in flips:images_f = torch.flip(images, f)y_preds = model(images_f) # [b, c, w, h]y_preds = torch.flip(y_preds, f)y_preds   = torch.nn.Sigmoid()(y_preds)masks += y_predsif CFG.tta:total_ckpt_paths = len(ckpt_paths_dict) * CFG.n_fold * 2else:total_ckpt_paths = len(ckpt_paths_dict) * CFG.n_fold

Reference

知乎: 常见交叉验证方法汇总

【Kaggle比赛常用trick】K折交叉验证、TTA相关推荐

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

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

  2. ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练)

    ML:模型训练/模型评估中常用的两种方法代码实现(留一法一次性切分训练和K折交叉验证训练) 目录 模型训练评估中常用的两种方法代码实现 T1.留一法一次性切分训练 T2.K折交叉验证训 模型训练评估中 ...

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

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

  4. 机器学习(MACHINE LEARNING)交叉验证(简单交叉验证、k折交叉验证、留一法)

    文章目录 1 简单的交叉验证 2 k折交叉验证 k-fold cross validation 3 留一法 leave-one-out cross validation 针对经验风险最小化算法的过拟合 ...

  5. k折交叉验证法python实现_Jason Brownlee专栏| 如何解决不平衡分类的k折交叉验证-不平衡分类系列教程(十)...

    作者:Jason Brownlee 编译:Florence Wong – AICUG 本文系AICUG翻译原创,如需转载请联系(微信号:834436689)以获得授权 在对不可见示例进行预测时,模型评 ...

  6. 机器学习--K折交叉验证(K-fold cross validation)

    K 折交叉验证(K-flod cross validation) 当样本数据不充足时,为了选择更好的模型,可以采用交叉验证方法. 基本思想:把给定的数据进行划分,将划分得到的数据集组合为训练集与测试集 ...

  7. k折交叉验证matlab 流程_第51集 python机器学习:分层K折交叉验证及其他方式

    由于出现类似鸢尾花数据集这种分段数据可能简单的交叉验证无法适用,所以这里引用了分层K折交叉验证.在分层交叉验证中,我们划分数据,使得每个折中类别之间的比例整数与数据集中的比例相同,如下图所示: mgl ...

  8. k折交叉验证优缺点_都说K折交叉验证最常见,你会做吗?

    在临床研究领域,大家特别希望能够未仆先知,于是临床研究者尝试去建立各种预测模型.比如,凭借孕妇的信息预测低出生体重儿的结局.怎么建立预测模型呢?常见的做法是这样的:以低出生体重儿为因变量,以相关的孕妇 ...

  9. 五折交叉验证/K折交叉验证, python代码到底怎么写

    五折交叉验证: 把数据平均分成5等份,每次实验拿一份做测试,其余用做训练.实验5次求平均值.如上图,第一次实验拿第一份做测试集,其余作为训练集.第二次实验拿第二份做测试集,其余做训练集.依此类推~ 但 ...

最新文章

  1. numpy.lib.stride_tricks.as_strided() 高效切分数组
  2. 创业阶段如何找客户_初创企业在不同的创业阶段:如何做好市场营销?
  3. Codeforces Round #732 (Div. 1Div. 2)
  4. equals 和 hashCode 到底有什么联系?一文告诉你
  5. 系统在iis6上部署
  6. 把CNN里的乘法全部去掉会怎样?华为提出移动端部署神经网络新方法
  7. 假设以邻接矩阵作为图的存储结构_学习数据结构第五章:图(图的存储方法)...
  8. Python 监控 DB 服务器信息(cpu, 磁盘,进程,alert log) 脚本
  9. WS2811B驱动使用及使用说明
  10. python opencv导入pbtxt文件出现错误Failed to parse GraphDef file
  11. 统计学中sp_用excel和sp和ss学统计学.doc
  12. JavaScript 编程精解 中文第三版 四、数据结构:对象和数组
  13. Vimium插件使用方法(其实就是盗了一张图)
  14. 微软认知服务应用秘籍 – 君子动口不动手
  15. 数据结构实验二——队列(银行叫号系统)
  16. 【巨人的肩膀上制造世界】——5——Unity3D实用插件之Mouse Interaction-Object Highlight,快速构建模型的悬浮高亮!悬浮提示!悬浮动画!
  17. 0xc000007b错误、DirectX、C++组件、缺少msvcr120.dll文件等
  18. 测试工作3年还在基础岗?可能只是因为你的工作能力差
  19. HTML小黄人吃球球GO域名跳转源码
  20. 第三章:先从整理头脑开始---断舍离的思考准则

热门文章

  1. 基于SSM的助学贷款管理系统
  2. OCR表格识别—企业应用的技术新秀
  3. java重载运算符_流形:Java的运算符重载
  4. 沐风老师3DMAX管道建模教程
  5. 超图UDB格式精模数据进入 ArcGIS平台
  6. 上海交通大学计算机考研信息汇总
  7. Jase面向对象基础
  8. word/excel/cad中插入二维码
  9. python去噪笔记
  10. 安全防御——IDS(入侵检测系统)