一.示例
数据=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