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

但是,道理都挺简单的,但是代码我就不会写,比如我怎么把数据平均分成5份?我怎么保证每次实验的时候,数据都是这么划分的?本来一般的训练时,把数据按6:2:2分成训练集、验证集和测试集,在训练集上训练图像,验证集上保存最佳模型,测试集用来最后的测试。现在交叉验证没有验证集了,怎么保存模型?以下为大家一一解答。

文章目录

  • 1.把数据平均分成K等份
    • 举例1:设置shuffle=False,每次运行结果都相同
    • 举例2:设置shuffle=True,每次运行结果都不相同
    • 举例3:设置shuffle=True和random_state=整数,每次运行结果相同
    • 举例4: 真实案例数据划分
  • 2.没有验证集了,怎么保存最佳模型

1.把数据平均分成K等份

使用KFold类。
class sklearn.model_selection.KFold(n_splits=5, *, shuffle=False, random_state=None)
sklearn提供的这个函数就是用来做K折交叉验证的。
提供训练集/测试集索引以分割数据。将数据集拆分为k折(默认情况下不打乱数据。

参数介绍
n_splits:int, 默认为5。表示拆分成5折
shuffle: bool, 默认为False。切分数据集之前是否对数据进行洗牌。True洗牌,False不洗牌。
random_state:int, 默认为None 当shuffle为True时,如果random_state为None,则每次运行代码,获得的数据切分都不一样,random_state指定的时候,则每次运行代码,都能获得同样的切分数据,保证实验可重复。random_state可按自己喜好设定成整数,如random_state=42较为常用。当设定好后,就不能再更改。

使用KFold类需要先初始化,然后再调用它的方法实现数据划分。它的两个方法为:

  • get_n_splits(X=None, y=None, groups=None)
    返回交叉验证器中的拆分迭代次数
  • split(X, y=None, groups=None)
    生成索引,将数据拆分为训练集和测试集。
    X: 数组, 形状为: (n_samples, n_features)
    其中n_samples是样本数,n_features是特征数。
    y: 数组,形状为(n_samples,), default=None。可要可不要
    return:train和test的索引,注意返回的是每个集合的索引,而不是数据

举例1:设置shuffle=False,每次运行结果都相同

from sklearn.model_selection import KFold
import numpy as np
X = np.arange(24).reshape(12,2)
y = np.random.choice([1,2],12,p=[0.4,0.6])
kf = KFold(n_splits=5,shuffle=False)  # 初始化KFold
for train_index , test_index in kf.split(X):  # 调用split方法切分数据print('train_index:%s , test_index: %s ' %(train_index,test_index))

结果:5折数据的索引
train_index:[ 3 4 5 6 7 8 9 10 11] , test_index: [0 1 2]
train_index:[ 0 1 2 6 7 8 9 10 11] , test_index: [3 4 5]
train_index:[ 0 1 2 3 4 5 8 9 10 11] , test_index: [6 7]
train_index:[ 0 1 2 3 4 5 6 7 10 11] , test_index: [8 9]
train_index:[0 1 2 3 4 5 6 7 8 9] , test_index: [10 11]

通过索引去获取数据和对应的标签可用:

fold1_train_data, fold1_train_label = X[train_index], y[train_index]

举例2:设置shuffle=True,每次运行结果都不相同

举例3:设置shuffle=True和random_state=整数,每次运行结果相同


因此,实际使用的时候建议采用案例3这种方式,即可保证实验可重复,有增加了数据的随机性。

举例4: 真实案例数据划分

我有一些nii.gz的三维数据用来做分割,图像和label分别放在不同的文件夹。如:
└── 根目录
└── image
│ ├── 1.nii.gz
│ │── 2.nii.gz
│ └── 3.nii.gz

── label
│ ├── 1.nii.gz
│ │── 2.nii.gz
│ └── 3.nii.gz

 images1 = sorted(glob.glob(os.path.join(data_root, 'ImagePatch', 'l*.nii.gz')))labels1 = sorted(glob.glob(os.path.join(data_root, 'Mask01Patch', 'l*.nii.gz')))images2 = sorted(glob.glob(os.path.join(data_root, 'ImagePatch', 'r*.nii.gz')))labels2 = sorted(glob.glob(os.path.join(data_root, 'Mask01Patch', 'r*.nii.gz')))data_dicts1 = [{'image': image_name, 'label': label_name}for image_name, label_name in zip(images1, labels1)]data_dicts2 = [{'image': image_name, 'label': label_name}for image_name, label_name in zip(images2, labels2)]all_files = data_dicts1 + data_dicts2# 把image和label创建成字典,统一放在列表里


all_files是一个包含所有数据的列表,但列表里的每一个数据又是一个字典,分别当image和label的数据地址。
我们对 all_files的数据进行五折交叉验证:

    floder = KFold(n_splits=5, random_state=42, shuffle=True)train_files = []   # 存放5折的训练集划分test_files = []     # # 存放5折的测试集集划分for k, (Trindex, Tsindex) in enumerate(floder.split(all_files)):train_files.append(np.array(all_files)[Trindex].tolist())test_files.append(np.array(all_files)[Tsindex].tolist())# 把划分写入csv,检验每次是否相同df = pd.DataFrame(data=train_files, index=['0', '1', '2', '3', '4'])df.to_csv('./data/Kfold/train_patch.csv')df1 = pd.DataFrame(data=test_files, index=['0', '1', '2', '3', '4'])df1.to_csv('./data/Kfold/test_patch.csv')

我们把数据集的划分保存到csv里面,以防止代码改动丢失了原本的划分方法。

数据集划分好了,就可以进行训练和测试了。每一次拿划分好的一折数据就行。

    # 五折分开train, 每次拿一折train 和 testtrain(train_files[0], test_files[0])test(test_files[0])

在train和test方法里面,肯定要写好对应的dataloder, 因为我们刚只是把数据的名字进行了划分,并没有加载数据集。

通常的做法里,会循环5次,运行一次代码,把五折的结果都做出来。但是我们这种写法的好处在于,你想训练第几折,就把索引值改一下就是,不需要一下子全部训练完。只要你不动代码,你一年后再训练,数据集的划分都不会变。变了也不怕,我们把划分已经保存成csv了。

当然,这只是一种写法,如果有更好的方案,欢迎留言探讨~~

2.没有验证集了,怎么保存最佳模型

这是我之前一直好奇的问题。因为,如果不做交叉验证,那么我会根据测试集上的指标保存最佳模型。比如以下代码是在验证集上完成的。

if metric > best_metric:best_metric = metricbest_metric_epoch = epoch + 1save_dir = 'checkpoints/checkpoint_04264/'if not os.path.exists(save_dir):os.makedirs(save_dir)save_path = save_dir + str(epoch + 1) + "best_metric_model.pth"torch.save(model.state_dict(), save_path)print('saved new best metric model')

但是,现在,没有验证集了,我是根据训练集上的指标保存模型呢,还是根据测试集上的指标?这个问题,没有统一答案,两者做法都有。正因为没有统一答案,那我们可以选择对自己最有利的答案啊

五折交叉验证/K折交叉验证, python代码到底怎么写相关推荐

  1. 在Mnist数据上使用k折交叉验证训练,pytorch代码到底怎么写

    前言 最近学到了K折交叉验证,已经迫不及待去实验一下他的效果是不是如老师讲的一样好,特此写下本文. 本文运行环境为:sklearn.pytorch .jupyter notebook k折交叉验证介绍 ...

  2. 5折交叉验证_[Machine Learning] 模型评估——交叉验证/K折交叉验证

    首先区分两个概念:'模型评估' 与 '模型性能度量' 模型评估:这里强调的是如何划分和利用数据,对模型学习能力的评估,重点在数据的划分方法. Keywords: 划分.利用数据 模型性能度量:是在研究 ...

  3. 算法-聚类-K均值与模糊K均值:原理+python代码

    这篇文章是根据作业修改后得到的,个人感觉写的比较详细了.但还有许多不足,希望大家评论指出. K均值聚类与模糊K均值 1. 算法原理及流程 相关名词解释如表1. 表1-相关名词解释 1.1 K均值算法原 ...

  4. 马科维茨模型的实例验证与思考(含Python代码)

    目录 马科维兹模型简述 一.原理 二.相关公式 实例验证 一.方法选择 二.思路 ①假设 ②设定 ③注意 三.实践 ①数据准备 ②用蒙特卡洛方法计算组合权重 ③把有效前沿组合选出来 ④测试时间段股票表 ...

  5. 【目标检测】将目标检测数据集划分为训练集、验证集与测试集 python代码

    文件结构 数据集data_dir文件结构: ├── data_dir: 数据集图片所在目录(可包含其他合适文件,本脚本只对图片进行统计)├── 1.jpg: 图片1├── 2.jpg: 图片2└── ...

  6. 第k大的数python代码_【Python】【输出前m大的数】

    问题: 给定一个数组包含n个元素,统计前m个大的数,并把这m大的数从大到小排列给出 输入 第一行为一个整数,表述要输出的前m个数 第二行为n个整数,给出需要排序的数组 输出 从大到小的m大的数 例子 ...

  7. 独家 | 每个数据科学家应该知道的五种检测异常值的方法(附Python代码)

    作者:Will Badr 翻译:顾伟嵩校对:欧阳锦本文约1600字,建议阅读5分钟本文介绍了数据科学家必备的五种检测异常值的方法. 无论是通过识别错误还是主动预防,检测异常值对任何业务都是重要的.本文 ...

  8. 第k大的数python代码_Python实现查找数组中任意第k大的数字算法示例

    本文实例讲述了Python实现查找数组中任意第k大的数字算法.分享给大家供大家参考,具体如下: 模仿partion方法,当high=low小于k的时候,在后半部分搜索,当high=low大于k的时候, ...

  9. k均值聚类的python代码_k-均值聚类Python代码实现

    这里给出两种方式的k-均值实现,code主要来自于网络: # reference: https://mubaris.com/2017/10/01/kmeans-clustering-in-python ...

最新文章

  1. R语言包_recharts
  2. NumSharp v0.8.0 发布,C# 张量计算库
  3. JavaScript字幕滚动效果
  4. 没有足够的系统内存来运行此查询。
  5. Hadoop For Windows
  6. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言——1069:乘方计算
  7. 浮点数计算机的表示案例,计算机中的数据及其应用案例.docx
  8. 大数据可视化html模板开源_8个可靠好用的开源数据可视化工具推荐
  9. springboot悠悠转二手网站毕业设计源码181134
  10. 关于PLC手册中的源型和漏型
  11. matlab删掉txt文件中的数据,matlab中读取txt数据文件(txt文本文档)
  12. 如何在生化实验中选择合适的牛血清白蛋白(BSA)?
  13. 计算机word安装程序,word2007电脑版安装包
  14. 5.9.1_P163《C++ Primer Plus (6th)》编程练习 答案
  15. C#海伦公式三边计算三角形面积
  16. java p2p 下载_java p2p文件传输(含服务器端与jsp源码)
  17. 微信小程序带给我们哪些便利
  18. 用Python实现文本内容生成二维码
  19. zemax-06扫描系统
  20. (转)IT人员必读10个小故事

热门文章

  1. iPadPro看电影之MKV转MP4视频格式教程
  2. EtherCAT,PowerLink和Ethernet/IP三种协议的比较
  3. BC20 MQTT与GPS功能测试
  4. DM8 数据库连接Alibaba druid 提示:dbType not support
  5. 互联网日报 | 6月20日 星期日 | 宁德时代否认强制员工购买特斯拉;小米618支付金额破190亿元;岚图FREE正式上市...
  6. 冥想-提高专注力和自控力的方法
  7. MODIS 产品介绍
  8. python除以10取整_python中整数除以整数的结果是取整数
  9. 甘肃环讯信息科技有限公司加入openGauss社区
  10. 成都普赛睿生物医药科技有限公司-IT岗位招聘