当前位置: 首页 > news >正文

详解交叉验证中【KFold】【Stratified-KFold】【StratifiedShuffleSplit】的区别

       交叉验证是一种统计分析方法,它的目的是通过在同一数据集上重复并分割训练和测试数据,来评估机器学习模型的性能。以下是​这三种交叉验证方法的区别:

  1. KFold(K-折叠)

    • 在KFold交叉验证中,原始数据集被分为K个子集。
    • 每次,其中的一个子集被用作测试集,而其余的K-1个子集合并后被用作训练集。
    • 这个过程重复进行K次,每次选择不同的子集作为测试集。
    • KFold不保证每个折叠的类分布与完整数据集中的分布相同。
  2. Stratified-KFold(分层K-折叠)

    • Stratified-KFold是KFold的变体,它会返回分层的折叠:每个折叠中的标签分布都尽可能地与完整数据集中的标签分布相匹配。
    • 这种方法特别适用于类分布不均衡的情况,确保每个折叠都有代表性的类比例。
    • 就像KFold一样,每个折叠轮流被用作测试集,其他折叠用作训练集。
  3. StratifiedShuffleSplit(分层随机分割)

    • StratifiedShuffleSplit是另一种分层抽样技术,它也确保了每次分割中都能维持原始数据集中各个类的比例。
    • 与Stratified-KFold不同,StratifiedShuffleSplit将数据集随机打乱,然后切分为训练集和测试集。这个过程会根据需要重复多次。
    • 这种方法提供了更多的随机性,并可以通过指定测试集的大小来控制训练集和测试集的比例。

接下来我们用代码来解释他们的区别:

一. Kfold

先来创建数据集:

splits = 5
tx = range(10)
ty = [0] * 5 + [1] * 5

再来导入相应的模块:

from sklearn.model_selection import KFold
from sklearn.model_selection import StratifiedKFold
from sklearn.model_selection import StratifiedShuffleSplit, 
from sklearn import datasets

先实例化一个KFold,shuffle = Flase的情况:

Kfold = KFold (n_splits=splits, shuffle=False)

再来看看Kfold是如何来做交叉验证的:

print("Fold")
for train_index, test_index in Kfold.split(tx, ty):print("TRAIN:", train_index, "TEST:", test_index)

输出结果为:

可以看到,Kfold的测试集是按照顺序不重复的每次取出两个,一共做5次训练。

当shuffle = true时再来运行一次代码:

Kfold = KFold (n_splits=splits, shuffle=False)print("Fold")
for train_index, test_index in Kfold.split(tx, ty):print("TRAIN:", train_index, "TEST:", test_index)

可以看到Kfold的测试集是无规则不重复的每次取出两个,一共做5次训练。

二. Stratified-KFold

我们用相同的数据集,先来看看shuffle = False的情况:

stratKfold = StratifiedKFold(n_splits=splits, shuffle=False)
print("stratKFold")
for train_index, test_index in stratKfold.split(tx, ty):print("TRAIN:", train_index, "TEST:", test_index)

可以看到测试集被分层了。因为我们是二分类数据,所以每次都是从0类中抽一个,1类中抽一个,而且是按顺序抽取,即从0类的第一个数据,1类的第一个数据组合形成一个测试集。数据是不重复的。

先来看看shuffle = true的情况:

可以看到测试集依然被分层抽取,但不是按照顺序抽取,且依旧保证数据是不重复的。

三. StratifiedShuffleSplit

先来实例化一个StratifiedShuffleSplit并分隔数据集:

shufflesplit = StratifiedShuffleSplit(n_splits=splits, random_state=42, test_size=2)
for train_index, test_index in shufflesplit.split(tx, ty):print("TRAIN:", train_index, "TEST:", test_index)

可以看到测试集被分层了,同时我们可以根据test_size选择测试集的比例,并且数据是可以重复的,可以看到测试集3出现了2次。但我们把test_size设置为0.3时:

可以看到测试集有3个样本,多个数据发生了重复。

总结一下:Kfold交叉验证不考虑样本标签是否均衡的问题,仅是单纯的将样本分为K份,1份是测试,k-1份做训练;Stratified-KFold会根据样本标签分类,让训练集和测试集都保持原有样本的标签分类情况,shuffle = False or true决定的是分隔是顺序分隔还是随机分隔,同时数据是不可重复利用的;StratifiedShuffleSplit可以对数据进行重复利用,也只有StratifiedShuffleSplit可以控制测试集和训练集的比例。

http://www.lryc.cn/news/222250.html

相关文章:

  • 数学建模比赛中常用的建模提示词(数模prompt)
  • Spark 新特性+核心回顾
  • STM32 TIM定时器,配置,详解(1)
  • Helix Toolkit:为.NET开发者带来的3D视觉盛宴
  • PHP分类信息网站源码系统 电脑+手机+微信端三合一 带完整前后端部署教程
  • 2023年辽宁省数学建模竞赛B题数据驱动的水下导航适配区分类预测
  • 完蛋!百融云被大阳线包围了!
  • 数据结构 编程1年新手视角的平衡二叉树AVL从C与C++实现③
  • 数据可视化PCA与t-SNE
  • Kubernetes rancher、prometheus、ELK的安装
  • 为什么我们要努力的学习编程?初学编程从哪里开始学起?
  • ffmpeg 从内存中读取数据(或将数据输出到内存)
  • Flink(一)【WordCount 快速入门】
  • 【Redis】hash数据类型-常用命令
  • 【大数据】Apache NiFi 数据同步流程实践
  • git怎么使用 拉取代码
  • Apple :苹果将在明年年底推出自己的 AI,预计将随 iOS 18 一起推出
  • 数据结构-双向链表
  • CV计算机视觉每日开源代码Paper with code速览-2023.11.6
  • GB28181学习(十五)——流传输方式
  • 【Linux】:初识git || centos下安装git || 创建本地仓库 || 配置本地仓库 || 认识工作区/暂存区(索引)以及版本库
  • Vue 3 中,watch 和 watchEffect 的区别
  • 鲜花展示服务预约小程序的效果如何
  • Linux下多个盘符乱的问题处理
  • uniapp小程序使用web-view组件页面分享后,点击没有home小房子解决办法
  • SLAM_语义SLAM相关论文
  • 【技巧】并发读取Mysql数据保证读取到的数据不重复
  • Lavarel异步队列的使用
  • JVM知识分享(PPT在资源里)
  • 整合Salesforce Org需要避免的3大风险