机器学习-样本集(包括训练集及测试集)的选取
转自: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 作为训练集。两个集合的选取以
最小化交集为原则。
机器学习-样本集(包括训练集及测试集)的选取相关推荐
- 【机器学习算法面试题】六.训练集、验证集、测试集的理解。
欢迎订阅本专栏:<机器学习算法面试题> 订阅地址:https://blog.csdn.net/m0_38068876/category_11810806.html [机器学习算法面试题]一 ...
- 机器学习中的训练集,验证集及测试集的关系
机器学习中的训练集,验证集及测试集的关系 作者同类文章X 最近在看机器学习的东西发现验证集的(Validation set) 有时候被提起到,以 ...
- python划分训练集和测试集_杨涛的Python机器学习3:单特征与多特征、训练集与测试集,杨桃...
本人CSDN博客专栏:https://blog.csdn.net/yty_7 Github地址:https://github.com/yot777/ 单特征与多特征 在上一节标签和特征的示例中,我们使 ...
- 机器学习数据集(训练集、测试集)划分方法
数据集划分方法 留出(Hold-out)法 交叉验证(cross validation)法 自助法(bootstrap) 一个模型的好坏终归还是需要一个客观的评价标准,但是现有标准都比较难以适用于 ...
- 【机器学习】训练集、验证集与测试集
关于数据集的划分是基本概念,但是有时候看其他人代码时,经常被弄得云里雾里. 特作此记录. 目录 训练集(train set) 验证集(val set) 验证集的正确打开方式 测试集(test set) ...
- 杨桃的Python机器学习3——单特征与多特征、训练集与测试集
本人CSDN博客专栏:https://blog.csdn.net/yty_7 Github地址:https://github.com/yot777/ 单特征与多特征 在上一节标签和特征的示例中,我们使 ...
- 机器学习 :训练集、验证集、测试集分配比例
根据<统计学习方法>中的观点: "如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集(training set).验证集(validat ...
- 1. 训练集、开发集、测试集(Train/Dev/Test sets)
1.在以往的机器学习中 如上图所示,以往机器学习中,对训练集.开发集.测试集的划分比例为60/20/20,如此划分通常可以获得较好的效果. 训练集(training set):训练算法. 开发集(de ...
- 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)
2019-12-20 20:01:00 数据在人工智能技术里是非常重要的!本篇文章将详细给大家介绍3种数据集:训练集.验证集.测试集. 同时还会介绍如何更合理的讲数据划分为3种数据集.最后给大家介绍一 ...
最新文章
- QThread: Destroyed while thread is still running
- ext store 数据修改_Go 数据存储篇(一):基于内存存储实现数据增删改查功能...
- 联想拯救者y空间兑换代码_十代酷睿全面升级 拯救者Y7000P 2020产品解读
- 车辆行人识别训练与部署,EasyDL-Jetson Nano 端边云协作专场公开课
- Django 文件上传与下载的相关问题
- java 静态代码块
- 删除字符,用外部函数
- 蓝桥杯 ALGO-62 算法训练 平方计算
- 第三方接口开发(短信验证码)
- STM32-STVP烧录
- 数独基本规则_数独基本规则(数独游戏规则和技巧)
- 学习笔记(02):英特尔® OpenVINO™工具套件初级课程-如何加速视频处理进程?
- sql是什么mysql是什么意思_sql是什么意思
- 计算机网络超文本是什么意思,什么是超文本链接,和超文本有什么区别?
- Python骚操作 | 还原已撤回的微信消息
- linux的veth导致网络不通,使用veth-pair和bridge搭建的本地网络环境网络不通
- 读书笔记 - 《枪炮、病菌与钢铁》
- Nginx学习笔记02——安装部署Nginx
- 服务器端测试经验分享
- 用 Python 快速获取基金持仓增减情况 | 更新版
热门文章
- 抽象类继承 java_java继承抽象类
- 数据库的几个基本概念
- 电脑音频服务未运行怎么解决_【电脑技能】女生专属,学会这几招也可以修好你的电脑...
- 基于MonteCarlo法的经典射击问题中的杀伤概率估计问题
- php解决01背包问题,PHP动态规划解决0-1背包问题实例分析_PHP教程
- web平台安装程序_来了来了!开源车间调度平台正式上线!
- 2020 年百度之星#183;程序设计大赛 - 初赛三
- C语言记录元音字母的位置,求元音字母
- oracle同事查两个表,Oracle查询访问同一表的两个以上索引(三)
- java的set和get方法实例化_java反射机制 调用get set 方法 | 学步园