k折交叉验证 python,K折交叉验证matlab代码

一.示例

数据=rand 9,3 ); 创建%维为93的随机矩阵示例

indices=crossvalind’KFold ‘,9,3 ); 将%数据样本随机分为三部分

for i=1:3 %循环3次,分别取出第I部分作为测试样本,其余两部分作为训练样本

tst=indices==I );

train=~test;

traindata=datatrain, );

testdata=datatest, );

结束

程序解读:制作1,9x 3的矩阵

2、将矩阵的9行数据分为3个类

3、取出每类数据进行验证

例如,可知最后执行的是类别3,分类中的1、5、9行为是类别3的数据

原始数据中,1、5、9行的数据为test_trian 检查数据),剩下的数据为测试数据。 与test对应的测试集数据的逻辑值为1,与train对应的训练集数据的逻辑值为1。

二. k-复交验证k-fold crossValidation ) :

[M,n]=sizedata ); //数据集是M*N的矩阵,每行表示一个示例

indices=crossvalindKFold ),data ) 1:m,n ),10 ); //随机分包

fork=1:10//相互核对k=10,将10个数据包按顺序作为测试装置

tst=indices==k ); //获取与数据集中的test集元素相对应的单元号

train=~test; //train集元素的编号是非test元素的编号

train_data=datatrain, ); //从数据集中分隔train示例数据

train_target=target:train ); //获得样本集的测试目标,在本例中为实际分类情况

test_data=datatest, ); //test样本集

test_target=target:test );

三.利用10折交叉核对计算错误分类率

3.1代码部分

load fisheriris

indices=crossvalind’KFold ‘,species,10 );

CP=classperfspecies;

for i=1:10

tst=indices==I ); train=~test; %分别以第1、2、10份为测试组,其余为训练组

class=classifymeastest, ),meas train, ),species train, ) )

classPERFCP,class,test );

结束

cp.ErrorRate %查询错误分类率

fisheriris是爱丽丝的数据集。 有两部分:测量和特殊

3.2相关函数的解释

3.2.1 indices=crossvalind ‘ KF old ‘,n,k ) )。

1 )参数) Kfold )为了k字型交叉检测,将数据集n随机分为平均的或者近似评价的) k部,在Indices中表示为各样本所属部分的索引) 1到k )

2 )为了随机划分,反复调用会有不同的划分方式。

3 )在k形折叠交叉验证中,中小学部分用于培训,剩余部分用于测试。 该过程被重复k次。

3.2.2CP=classPerftruelabels ) )。

1 ) classperf是一种用于评估分类器性能的函数。

2 )在truelabels中,针对与每个样本对应的真类,制作空的分类器性能对象CP并进行初始化。

3.2.3class=classifysample,training,group ) )。

1 ) classify是判别分析函数。

2 )如果提前建立了类别,则使用判别分析; 如果尚未预先创建类别,请使用聚类分析。 通常,如果已经有关于某个总体的“即若干类别”的观测资料,则判别分析问题是可以构造一个或多个判别函数,从该函数中确定属于新位置的总体样本,并决定应该属于哪个总体。

3 )判别分析利用现有的分类信息得到判别函数判别函数关系式,一般是分类的几个指标的线性关系式),利用该函数确定未知样本属于哪个类。 所以,这是学习和预测的过程。 作为常见的判别分析法,有距离判别法、费休判别法、贝叶斯判别法等。

4 ) matlab中的句法: class=classifysample,training,group ),默认的线性判别分析,对sample的每个样本进行判别,分类为trainning指定的类也可以通过参数type指定判别分析法。

3.2.4类

perfcp, classout, testidx)

1)根据分类结果,更新分类器性能对象CP。

2)在十折交叉验证法中,就是重复10次,可累积得到总的错误分类率。

四、10折交叉验证例子

第1步,将数据等分到10个桶中。

我们会将50名篮球运动员和50名非篮球运动员分到每个桶中。每个桶当中放入了100人的信息。

第2步,下列步骤重复10次。

1)每一次迭代中留存其中一个桶。第一次迭代中留存桶1,第二次留存桶2,其余依此类推。

2)用其他9个桶的信息训练分类器第一次迭代中利用从桶2到桶10的信息训练分类器)。

3)利用留存的数据来测试分类器并保存测试结果。在上例中,这些结果可能如下:

35个篮球运动员被正确分类;

29个非篮球运动员被正确分类。

第3步,对上述结果汇总。

通常情况下我们会将结果放到与下表类似的表格中:

分成篮球运动员

分成非篮球运动员

实际为篮球运动员

372

128

实际为非篮球运动员

220

28-

在所有500名篮球运动员中,有372人被正确分类。可能需要做的一件事是将右下角的数字也加上去,也就是说1000人当中有652372+280)人被正确分类。因此得到的精确率为65.2%。与2折或3折交叉验证相比,基于10折交叉验证得到的结果可能更接近于分类器的真实性能。之所以这样,是因为每次采用90%而不是2折交叉验证中仅仅50%的数据来训练分类器。

五、Pyton程序

def KFoldCVD, A, k):

“””

k-fold 交叉验证

参数说明:

D:给定数据集

A:学习函数

k:折数

“””

np.random.shuffleD)

dataset = np.splitD, k)

acc_rate = 0

for i in rangek):

train_set = dataset.copy)

test_set = train_set.popi)

train_set = np.vstacktrain_set)

A.traintrain_set[:,:-1], train_set[:,-1]) # 每次的训练集

labels = A.fittest_set[:,:-1]) # 每次的测试集

acc_rate += np.meanlabels==test_set[:,-1]) # 计算平均误差

return acc_rate/k

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注