转自:http://www.xuebuyuan.com/1409669.html

https://blog.csdn.net/bbbeoy/article/details/72967794

针对经验风险最小化算法的过拟合的问题,给出交叉验证的方法,这个方法在做分类问题时很常用:

一:简单的交叉验证的步骤如下:

1、 从全部的训练数据 S中随机选择 中随机选择 s的样例作为训练集 train,剩余的 作为测试集 作为测试集 test。

2、 通过对测试集训练 ,得到假设函数或者模型 。
3、 在测试集对每一个样本根据假设函数或者模型,得到训练集的类标,求出分类正确率。

4,选择具有最大分类率的模型或者假设。

这种方法称为 hold -out cross validation 或者称为简单交叉验证。由于测试集和训练集是分开的,就避免了过拟合的现象

二:k折交叉验证 k-fold cross validation

1、 将全部训练集 S分成 k个不相交的子集,假设 S中的训练样例个数为 m,那么每一个子 集有 m/k 个训练样例,,相应的子集称作 {s1,s2,…,sk}。
2、每次从分好的子集中里面,拿出一个作为测试集,其它k-1个作为训练集

3、根据训练训练出模型或者假设函数。
4、 把这个模型放到测试集上,得到分类率。

5、计算k次求得的分类率的平均值,作为该模型或者假设函数的真实分类率。

这个方法充分利用了所有样本。但计算比较繁琐,需要训练k次,测试k次。

三:留一法  leave-one-out cross validation

留一法就是每次只留下一个样本做测试集,其它样本做训练集,如果有k个样本,则需要训练k次,测试k次。

留一发计算最繁琐,但样本利用率最高。适合于小样本的情况。

crossvalind交叉验证

Generate cross-validation indices  生成交叉验证索引

Syntax语法

Indices = crossvalind('Kfold', N, K) K折交叉
[Train, Test] = crossvalind('HoldOut', N, P)
[Train, Test] = crossvalind('LeaveMOut', N, M)留M法交叉验证,默认M为1,留一法交叉验证
[Train, Test] = crossvalind('Resubstitution', N, [P,Q])
[...] = crossvalind(Method, Group, ...)
[...] = crossvalind(Method, Group, ..., 'Classes', C)
[...] = crossvalind(Method, Group, ..., 'Min', MinValue)

部分转载自https://blog.csdn.net/NNNNNNNNNNNNY/article/details/45789323

交叉验证是一种随机循环验证方法,它可以将数据样本随机分割成几个子集。交叉验证主要用于评估统计分析或机器学习算法的泛化能力等。
对于第一种在评估机器学习算法的泛化能力时,我们可以选择随机分割后的一部分数据作为训练样本,另一部分作为测试样本。具体实现流程如下:

Data = rand(9,3);%创建维度为9×3的随机矩阵样本
indices = crossvalind('Kfold', 9, 3);%将数据样本随机分割为3部分
for i = 1:3 %循环3次,分别取出第i部分作为测试样本,其余两部分作为训练样本test = (indices == i);train = ~test;trainData = Data(train, :);testData = Data(test, :);
end

相应输出结果:
生成的随机矩阵Data:

indices数据,即分成的三类,数字相同表示对应的行数为同一类:

当i=3时的test数据:

对应的train数据(即对test取反):

testData(即test数据中‘1’所对应的行的数据)

trainData:

k-折交叉验证(k-fold crossValidation):
在机器学习中,将数据集A分为训练集(training set)B和测试集(test set)C,在样本量不充足的情况下,为了充分利用数据集对算法效果进行测试,将数据集A随机分为k个包,每次将其中一个包作为测试集,剩下k-1个包作为训练集进行训练。
在matlab中,可以利用:
indices=crossvalind('Kfold',x,k);
来实现随机分包的操作,其中x为一个N维列向量(N为数据集A的元素个数,与x具体内容无关,只需要能够表示数据集的规模),k为要分成的包的总个数,输出的结果indices是一个N维列向量,每个元素对应的值为该单元所属的包的编号(即该列向量中元素是1~k的整随机数),利用这个向量即可通过循环控制来对数据集进行划分。

例:

  [M,N]=size(data);//数据集为一个M*N的矩阵,其中每一行代表一个样本indices=crossvalind('Kfold',data(1:M,N),10);//进行随机分包for k=1:10//交叉验证k=10,10个包轮流作为测试集test = (indices == k); //获得test集元素在数据集中对应的单元编号train = ~test;//train集元素的编号为非test元素的编号train_data=data(train,:);//从数据集中划分出train样本的数据train_target=target(:,train);//获得样本集的测试目标,在本例中是train样本的实际分类情况test_data=data(test,:);//test样本集test_target=target(:,test);//test的实际分类情况...........
      end

crossvalind函数

①indices =crossvalind('Kfold', N, K): 
该命令返回一个对于N个观察样本的K个fold(意为折,有“层”之类的含义,感觉还是英文意思更形象)的标记(indices)。该标记中含有相同(或者近似相同)比例的1—K的值,将样本分为K个相斥的子集。在K-fold交叉检验中,K-1个fold用来训练,剩下的一个用来测试。此过程循环K次,每次选取不同的fold作为测试集。K的缺省值为5。 使用程序:

[m n]=size(data); %data为样本集合。每一行为一个观察样本
indices = crossvalind('Kfold',m,10); %产生10个fold,即indices里有等比例的1-10
for i=1:10
test=(indices==i); %逻辑判断,每次循环选取一个fold作为测试集 train=~test; %取test的补集作为训练集,即剩下的9个fold
data_train=data(trian,:); %以上得到的数都为逻辑值,用与样本集的选取 label_train=label(train,:); %label为样本类别标签,同样选取相应的训练集 data_test=data(test,:); %同理选取测试集的样本和标签 label_test=label(test,:); end 

②[Train, Test] = crossvalind('HoldOut',N, P): 
该命令返回一个逻辑值的标记向量,从N个观察样本中随机选取(或近似于)P*N个样本作为测试集。故P应为0-1,缺省值为0.5。 使用程序:

groups=ismenber(label,1); %label为样本类别标签,生成一个逻辑矩阵groups,1用来逻辑判断筛选
[train, test] = crossvalind('holdOut',groups); %将groups分类,默认比例1:1,即P=0.5 

③[Train, Test] = crossvalind('LeaveMOut',N, M): 
该命令返回一个逻辑值的标记向量,从N个观察样本中随机选取M个样本作为测试集。M的缺省值为1。值得注意的是,LeaveMOut在循环中使用不能保证产生的是互补集合,即每次循环的随机选取是独立的。如果要用互补的话还是使用Kfold命令。 使用程序:

[m,n]=size(data);
[train,test]=crossvalind('LeaveMOut',m,10)
svmStruct = svmtrain(data(train,:),groups(train));  classes = svmclassify(svmStruct,data(test,:));  cp=classperf(groups); cr=cp.CorrectRate 

④[Train, Test] = crossvalind('Resubstitution',N, [P,Q]):

本函数为②的一个特殊情况。当我不想把 P*N 剩下的部分全部作为训练集的时
候使用该函数,用 Q 指定一个比例, 选取 Q*N 作为训练集。两个集合的选取以
最小化交集为原则。

机器学习-样本集(包括训练集及测试集)的选取相关推荐

  1. 【机器学习算法面试题】六.训练集、验证集、测试集的理解。

    欢迎订阅本专栏:<机器学习算法面试题> 订阅地址:https://blog.csdn.net/m0_38068876/category_11810806.html [机器学习算法面试题]一 ...

  2. 机器学习中的训练集,验证集及测试集的关系

     机器学习中的训练集,验证集及测试集的关系                          作者同类文章X 最近在看机器学习的东西发现验证集的(Validation set) 有时候被提起到,以 ...

  3. python划分训练集和测试集_杨涛的Python机器学习3:单特征与多特征、训练集与测试集,杨桃...

    本人CSDN博客专栏:https://blog.csdn.net/yty_7 Github地址:https://github.com/yot777/ 单特征与多特征 在上一节标签和特征的示例中,我们使 ...

  4. 机器学习数据集(训练集、测试集)划分方法

    数据集划分方法 留出(Hold-out)法 交叉验证(cross validation)法 自助法(bootstrap)   一个模型的好坏终归还是需要一个客观的评价标准,但是现有标准都比较难以适用于 ...

  5. 【机器学习】训练集、验证集与测试集

    关于数据集的划分是基本概念,但是有时候看其他人代码时,经常被弄得云里雾里. 特作此记录. 目录 训练集(train set) 验证集(val set) 验证集的正确打开方式 测试集(test set) ...

  6. 杨桃的Python机器学习3——单特征与多特征、训练集与测试集

    本人CSDN博客专栏:https://blog.csdn.net/yty_7 Github地址:https://github.com/yot777/ 单特征与多特征 在上一节标签和特征的示例中,我们使 ...

  7. 机器学习 :训练集、验证集、测试集分配比例

    根据<统计学习方法>中的观点: "如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集(training set).验证集(validat ...

  8. 1. 训练集、开发集、测试集(Train/Dev/Test sets)

    1.在以往的机器学习中 如上图所示,以往机器学习中,对训练集.开发集.测试集的划分比例为60/20/20,如此划分通常可以获得较好的效果. 训练集(training set):训练算法. 开发集(de ...

  9. 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)

    2019-12-20 20:01:00 数据在人工智能技术里是非常重要的!本篇文章将详细给大家介绍3种数据集:训练集.验证集.测试集. 同时还会介绍如何更合理的讲数据划分为3种数据集.最后给大家介绍一 ...

最新文章

  1. QThread: Destroyed while thread is still running
  2. ext store 数据修改_Go 数据存储篇(一):基于内存存储实现数据增删改查功能...
  3. 联想拯救者y空间兑换代码_十代酷睿全面升级 拯救者Y7000P 2020产品解读
  4. 车辆行人识别训练与部署,EasyDL-Jetson Nano 端边云协作专场公开课
  5. Django 文件上传与下载的相关问题
  6. java 静态代码块
  7. 删除字符,用外部函数
  8. 蓝桥杯 ALGO-62 算法训练 平方计算
  9. 第三方接口开发(短信验证码)
  10. STM32-STVP烧录
  11. 数独基本规则_数独基本规则(数独游戏规则和技巧)
  12. 学习笔记(02):英特尔® OpenVINO™工具套件初级课程-如何加速视频处理进程?
  13. sql是什么mysql是什么意思_sql是什么意思
  14. 计算机网络超文本是什么意思,什么是超文本链接,和超文本有什么区别?
  15. Python骚操作 | 还原已撤回的微信消息
  16. linux的veth导致网络不通,使用veth-pair和bridge搭建的本地网络环境网络不通
  17. 读书笔记 - 《枪炮、病菌与钢铁》
  18. Nginx学习笔记02——安装部署Nginx
  19. 服务器端测试经验分享
  20. 用 Python 快速获取基金持仓增减情况 | 更新版

热门文章

  1. 抽象类继承 java_java继承抽象类
  2. 数据库的几个基本概念
  3. 电脑音频服务未运行怎么解决_【电脑技能】女生专属,学会这几招也可以修好你的电脑...
  4. 基于MonteCarlo法的经典射击问题中的杀伤概率估计问题
  5. php解决01背包问题,PHP动态规划解决0-1背包问题实例分析_PHP教程
  6. web平台安装程序_来了来了!开源车间调度平台正式上线!
  7. 2020 年百度之星#183;程序设计大赛 - 初赛三
  8. C语言记录元音字母的位置,求元音字母
  9. oracle同事查两个表,Oracle查询访问同一表的两个以上索引(三)
  10. java的set和get方法实例化_java反射机制 调用get set 方法 | 学步园