-
2021-10-08 15:39:06
k折交叉验证原理:
k折交叉验证是将数据分为k份,选取其中的k-1份为训练数据,剩余的一份为测试数据。k份数据循环做测试集进行测试。此原理适用于数据量小的数据。
# k-折交叉验证(此处设置k=10) from sklearn import datasets from sklearn.model_selection import KFold iris = datasets.load_iris() data, target = iris.data, iris.target kf = KFold(n_splits = 10, shuffle=True, random_state=0) # 10折 for train_index, test_index in kf.split(data): # 将数据划分为k折 train_data = data[train_index] # 选取的训练集数据下标 test = data[test_index] # 选取的测试集数据下标
更多相关内容 -
Python实现K折交叉验证法的方法步骤
2020-09-19 02:39:18主要介绍了Python实现K折交叉验证法的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
K折交叉验证python实现
2019-12-10 21:59:58用KNN算法训练iris数据,并使用K折交叉验证方法找出最优的K值 import numpy as np from sklearn import datasets from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import KFold #...用KNN算法训练iris数据,并使用K折交叉验证方法找出最优的K值
import numpy as np from sklearn import datasets from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import KFold # 主要用于K折交叉验证 # 导入iris数据集 iris = datasets.load_iris() X = iris.data y = iris.target print(X.shape,y.shape) # 定义想要搜索的K值,这里定义8个不同的值 ks = [1,3,5,7,9,11,13,15] # 进行5折交叉验证,KFold返回的是每一折中训练数据和验证数据的index # 假设数据样本为:[1,3,5,6,11,12,43,12,44,2],总共10个样本 # 则返回的kf的格式为(前面的是训练数据,后面的验证集): # [0,1,3,5,6,7,8,9],[2,4] # [0,1,2,4,6,7,8,9],[3,5] # [1,2,3,4,5,6,7,8],[0,9] # [0,1,2,3,4,5,7,9],[6,8] # [0,2,3,4,5,6,8,9],[1,7] kf = KFold(n_splits = 5, random_state=2001, shuffle=True) # 保存当前最好的k值和对应的准确率 best_k = ks[0] best_score = 0 # 循环每一个k值 for k in ks: curr_score = 0 for train_index,valid_index in kf.split(X): # 每一折的训练以及计算准确率 clf = KNeighborsClassifier(n_neighbors=k) clf.fit(X[train_index],y[train_index]) curr_score = curr_score + clf.score(X[valid_index],y[valid_index]) # 求一下5折的平均准确率 avg_score = curr_score/5 if avg_score > best_score: best_k = k best_score = avg_score print("current best score is :%.2f" % best_score,"best k:%d" %best_k) print("after cross validation, the final best k is :%d" %best_k)
-
K折交叉验证法原理及python实现
2021-03-03 15:40:56本文为原创文章,转载请注明出处!在训练数据的过程或者...1 变形前的K折在遇到K折交叉验证之前,往往使用的是简单交叉验证(hold -out cross validation),也就是从全部的训练数据 D中随机选择 d的样例作为训练集 t...本文为原创文章,转载请注明出处!
在训练数据的过程或者参加数据比赛的时候,常常会遇到数据量不够大的情况,在一次比赛过程我学到一个小技巧—K折交叉验证法(k-fold CrossValidation),下面和大家分享一下。
1 变形前的K折
在遇到K折交叉验证之前,往往使用的是简单交叉验证(hold -out cross validation),也就是从全部的训练数据 D中随机选择 d的样例作为训练集 train,剩余的作为测试集 test(红色方框表示)。相信大家一定都非常熟悉,如果还不是很了解赶紧看看大牛Andrew Ng的课程吧。
在这里,数据都只被所用了一次,没有被充分利用
那么,怎样提高数据的利用率呢?
2 K折就是讲数据集切分成K小块,验证集和测试集相互形成补集,循环交替
纽约大学博士Seymour Geisser提出K折交叉验证法,具体步骤如下:
将数据集D随机分为k个包(这里假定K=6)。
每次将其中一个包作为测试集test,剩下k-1个包作为训练集train进行训练。
此时训练集train由D变成了K*D,
最后计算k次求得的分类率的平均值,作为该模型或者假设函数的真实分类率。
它有效的避免过学习以及欠学习状态的发生,最后得到的结果也比较具有说服性
你可能会问K选多少合适呢?
根据情况和个人喜好调节,常用的K值有3,6,10等。
3 python实现
在scikit-learn中有CrossValidation的实现代码,地址:scikit-learn官网crossvalidation文档
使用方法:
>>>import numpy as np
>>>from sklearn.model_selection import KFold
>>>X = ["a", "b", "c", "d"]
>>>kf = KFold(n_splits=2)
>>>for train, test in kf.split(X):
... print("%s %s" % (train, test))
[2 3] [0 1]
[0 1] [2 3]
-
五折交叉验证/K折交叉验证, python代码到底怎么写
2021-04-28 19:30:35五折交叉验证: 把数据平均分成5等份,每次实验拿一份做测试,其余用做训练。实验5次求平均值。如上图,第一次实验拿第一份做测试集,其余作为训练集。第二次实验拿第二份做测试集,其余做训练集。依此类推~ 但是,...
五折交叉验证: 把数据平均分成5等份,每次实验拿一份做测试,其余用做训练。实验5次求平均值。如上图,第一次实验拿第一份做测试集,其余作为训练集。第二次实验拿第二份做测试集,其余做训练集。依此类推~但是,道理都挺简单的,但是代码我就不会写,比如我怎么把数据平均分成5份?我怎么保证每次实验的时候,数据都是这么划分的?本来一般的训练时,把数据按6:2: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.gzimages1 = 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 和 test train(train_files[0], test_files[0]) test(test_files[0])
在train和test方法里面,肯定要写好对应的dataloder, 因为我们刚只是把数据的名字进行了划分,并没有加载数据集。
通常的做法里,会循环5次,运行一次代码,把五折的结果都做出来。但是我们这种写法的好处在于,你想训练第几折,就把索引值改一下就是,不需要一下子全部训练完。只要你不动代码,你一年后再训练,数据集的划分都不会变。变了也不怕,我们把划分已经保存成csv了。
当然,这只是一种写法,如果有更好的方案,欢迎留言探讨~~
2.没有验证集了,怎么保存最佳模型
这是我之前一直好奇的问题。因为,如果不做交叉验证,那么我会根据测试集上的指标保存最佳模型。比如以下代码是在验证集上完成的。
if metric > best_metric: best_metric = metric best_metric_epoch = epoch + 1 save_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')
但是,现在,没有验证集了,我是根据训练集上的指标保存模型呢,还是根据测试集上的指标?这个问题,没有统一答案,两者做法都有。正因为没有统一答案,那我们可以选择对自己最有利的答案啊😜。比如,写论文的时候,根据测试集上的结果保存模型,那肯定得到的结果更好啊。
而且,还有一个小tips, 用交叉验证的得到的结果通常比按6:2:2划分训练集验证集测试集上的结果要好。想想是为什么😉
- get_n_splits(X=None, y=None, groups=None)
-
机器学习-k折交叉验证法(python实现)
2022-04-23 10:49:40看了网上的很多k-fold的程序,发现都是机器学习方面的数据操作,而非文件操作(一位不愿意透露姓名的资深大冤种本着“能花钱就不动脑”的原则还付费了几个程序,全是bug,我真的会谢)。 然后自己写了一个k-fold... -
Python实现K折交叉验证
2022-05-09 23:17:32当我们的模型训练好之后,我们并不知道模型表现的怎么样,这个时候就可以使用验证集(Validation Dataset)来看看模型在新数据(验证集和测试集是不用的数据)上的表现如何。同时通过调整超参数,让模型处于最好... -
python中sklearnk折交叉验证
2021-04-26 17:20:29python中sklearnk折交叉验证发布时间:2018-06-10 11:09,浏览次数:492, 标签:pythonsklearnk1.模型验证回顾进行模型验证的一个重要目的是要选出一个最合适的模型,对于监督学习而言,我们希望模型对于未知数据的... -
Python sklearn KFold 生成交叉验证数据集的方法
2020-09-19 20:53:47今天小编就为大家分享一篇Python sklearn KFold 生成交叉验证数据集的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 -
K折交叉验证原理及其python实现
2019-07-17 15:15:54K折交叉验证用于模型调优,所有的数据都被用来训练,会导致过拟合,K折交叉验证可以缓解过拟合。 将数据分为k组,每次从训练集中,抽取出k份中的一份数据作为验证集,剩余数据作为测试集。测试结果采用k组数据的... -
K折交叉验证代码
2022-04-01 19:19:50K折交叉验证代码部分 文章目录K折交叉验证代码部分一、K折交叉验证是什么?二、代码1.代码部分2.keras的便捷功能 一、K折交叉验证是什么? 通过每个epoch,将数据划分为K等分,将K-1份作为训练集,其中1份作为验证... -
k折交叉验证(原理+python实现)
2022-04-30 13:36:16k折交叉验证的原理及python代码实现,以5折为例 -
k折交叉验证(matlab和python程序实现)
2020-12-03 14:30:38三、利用十折交叉验证计算错误分类率 3.1代码部分 load fisheriris indices = crossvalind('Kfold',species,10); cp = classperf(species); for i = 1:10 test = (indices == i); train = ~test; %分别取第1、2、..... -
Python 实现K折交叉验证
2020-04-25 20:41:25有时候进行十次十折数据分块实现交叉验证的时候需要每一折的训练测试集。写了个小函数,用的时候直接for循环调用就行。 import numpy as np # 导入numpy包 from sklearn.model_selection import KFold # 从sklearn... -
K折交叉验证:传统的求准确度的方法是将整个数据分为训练集和测试集,并根据测试数据计算出准确度,但这并...
2021-02-09 16:42:24K折交叉验证:传统的求准确度的方法是将整个数据分为训练集和测试集,并根据测试数据计算出准确度,但这并不是最佳方法,因此我们采用K折交叉验证是许多精度的平均值,并且它还提供了精度的标准偏差,这是评估模型的... -
matlab-K折交叉验证与分层K折交叉验证
2020-10-12 21:21:09K折交叉验证的要点:(文字版)如何实现K折交叉验证(图片版)如何实现K折交叉验证(matlab版)为啥我们需要分层K折交叉验证?如何实现分层k折交叉验证如何实现分层k折交叉验证(文字版)如何实现分层k折交叉验证(图片... -
如何为此CNN使用K折交叉验证?
2021-07-17 03:38:13I have tried to implement K Fold Cross Validation for my binary image classifier, but I have been struggling for a while as I have been stuck with the whole data processing side of things. I have incl... -
西瓜书ID3决策树生成以及预测(采用k折交叉验证),不使用sklearn库
2021-11-26 20:53:01基于西瓜书西瓜数据集2.0生成决策树,画出决策树,并输入...对breast_cancer数据集采用十次十折交叉验证法进行验证: 取其中一折生成决策树图: 分类精度: #西瓜书ID3决策树的生成 import matplotlib im... -
机器学习代码实战——K折交叉验证(K Fold Cross Validation)
2020-04-09 10:52:24随机森林 rf_scores = cross_val_score(RandomForestClassifier(n_estimators=40),iris.data,iris.target,cv=10) rf_scores np.average(rf_scores) 小结:通过对比四个模型的10折交叉验证结果,可见支持向量机效果... -
pytorch中把ImageFolder划分做K折交叉验证的代码框架
2021-10-12 18:27:50在图像分类任务中,有时候需要把图像数据分为K折做交叉验证,以评估模型的性能。但是在pytorch中并没有相应的代码,因此自己写了一个框架,以便调用 import os import torch from torch.utils.data import Dataset, ... -
如何用tensorflow进行k折交叉验证?
2021-03-03 15:41:37我知道这个问题已经过时了,但如果有人想做类似的事情,请扩展一下ahmedhosny's答案:新的tensorflow数据集API能够使用python生成器创建数据集对象,因此除了scikit learn的KFold选项外,还可以使用KFold.split()... -
预处理--python实现scikit-learn的k折交叉验证得分器(评估模型)
2020-11-26 22:36:05预处理(5):python实现scikit-learn的k折交叉验证得分器(评估模型) cross_val_score方法极为有用的功能是可以把不同分区的评估任务分给计算机的多个CPU。假设把n_jobs设为1,只有一个CPU会用于性能评估,就像... -
Python:K折交叉验证,将数据集分成训练集与测试集
2021-09-30 15:33:52输入:数据集路径 保存数据集的位置 k折交叉验证 输出:k个数据集 将一个数据集分成k份,其中由k-1份组成训练集 余下1份组成测试集 """ import os import shutil import time from sklearn.model_selection import ... -
K折交叉验证的数据拆分python实现
2020-09-29 15:06:45import numpy as np from sklearn.model_selection import StratifiedKFold ... skf = StratifiedKFold(n_splits=K, shuffle=True, random_state=random_state) i = 0 for train_index, dev_index in skf.s. -
lgb,xgb,cat k折交叉验证
2022-04-21 23:23:13import lightgbm as lgb import xgboost as xgb import catboost as cat #传入:模型,训练集x,训练集y,测试集x,模型的名字 def cv_model(clf, train_x, train_y, test_x, clf_name): #折叠次数5,随机数种子...