主要内容

cvpartition

分区数据以进行交叉验证

描述

cvpartition定义数据集上的随机分区。使用此分区定义训练和测试集,以便使用交叉验证验证统计模型。使用培训提取训练指标和测试提取交叉验证的检验指标。使用重新分区定义一个与给定分区类型相同的新的随机分区cvpartition对象。

创建

描述

c= cvpartition (n“KFold”,k返回一个cvpartition对象c这定义了一个随机的非分层分区k倍交叉验证对n观察。这个分区随机地将观察结果分成k不相交的子样本或褶,其中每一个都有大约相同数量的观察结果。

例子

c= cvpartition (n“坚持”,p为拒绝验证创建一个随机的非分层分区n观察。这种划分将观察结果划分为一个训练集和一个测试集。

例子

c= cvpartition (集团“KFold”,k为分层创建一个随机分区k倍交叉验证。每个子样本,或折叠,有大约相同的观察数量和包含大约相同的类比例集团

当你指定集团作为第一个输入参数,cvpartition中丢失值对应的观察行集团

例子

c= cvpartition (集团“KFold”,k“分层”,stratifyOption返回一个cvpartition对象c这定义了一个随机分区k倍交叉验证。如果您指定“分层”,假的,然后cvpartition中忽略类信息集团并创建一个非分层的随机分区。否则,缺省为分层。

c= cvpartition (集团“坚持”,p利用分类信息,将观察数据随机划分为训练集和测试集集团.训练集和测试集的类比例大致与集团

例子

c= cvpartition (集团“坚持”,p“分层”,stratifyOption返回一个对象c它定义了训练集和测试集的随机划分。如果您指定“分层”,假的,然后cvpartition创建一个非分层的随机分区。否则,缺省为分层。

例子

c= cvpartition (n, ' Leaveout ')为漏一交叉验证创建一个随机分区n观察。省略一项是一种特殊情况“KFold”其中折叠的数量等于观测的数量。

c = cvpartition (n, ' Resubstitution ')创建一个对象c不对数据进行分区。训练集和测试集都包含所有的原始数据n观察。

输入参数

全部展开

样本数据中的观测数,指定为正整数标量。

例子:One hundred.

数据类型:|

分区中的折叠数,指定为正整数标量。k必须小于观测总数。

例子:5

数据类型:|

用于坚持不住验证的测试集中观测值的分数或数量,指定为(0,1)范围内的标量或范围[1]内的整数标量,n),n为观测总数。

  • 如果p标量是否在值域(0,1)内cvpartition随机选择约p *n对测试集的观察。

  • 如果p是一个范围为[1,n),然后cvpartition随机选择p对测试集的观察。

例子:0.2

例子:50

数据类型:|

用于分层的分组变量,指定为数字或逻辑向量、类别、字符或字符串数组,或字符向量的单元数组,指示每个观察的类别。cvpartition根据中的观察创建一个分区集团

数据类型:||逻辑|分类|字符|字符串|细胞

分层指标,规定为真正的

  • 如果第一个输入参数cvpartition集团,然后cvpartition默认实现分层(“分层”,真的).对于非分层随机分区,请指定“分层”,假的

  • 如果第一个输入参数cvpartitionn,然后cvpartition总是创建一个非分层随机分区(“分层”,假的).在这种情况下,不能指定“分层”,真的

数据类型:逻辑

属性

全部展开

此属性是只读的。

观测值数目,包括缺失的观测值集团值,指定为正整数标量。

数据类型:

此属性是只读的。

分区中测试集的总数,指定为分区类型时的折叠数“kfold”“leaveout”,1当分区类型为“坚持”“resubstitution”

数据类型:

此属性是只读的。

每个测试集的大小,当分区类型为时指定为正整数向量“kfold”“leaveout”,分区类型为时为正整数标量“坚持”“resubstitution”

数据类型:

此属性是只读的。

每个训练集的大小,当划分类型为时,指定为正整数向量“kfold”“leaveout”,分区类型为时为正整数标量“坚持”“resubstitution”

数据类型:

此属性是只读的。

验证分区的类型,指定为“kfold”“坚持”“leaveout”,或“resubstitution”

对象的功能

重新分区 重新分区数据以进行交叉验证
测试 交叉验证试验指标
培训 交叉验证的培训指标

例子

全部折叠

使用交叉验证误分类误差来估计模型在新数据上的表现。

加载电离层数据集。创建一个包含预测器数据的表X以及响应变量Y

负载电离层台= array2table (X);资源描述。Y= Y;

使用随机的非分层分区hpartition将数据分成训练数据(tblTrain)及预留数据集(tblNew).保留大约30%的数据。

rng (“默认”%的再现性n =长度(tbl.Y);hpartition = cvpartition (n,“坚持”, 0.3);% Nonstratified分区idxTrain =培训(hpartition);tblTrain =(资源(idxTrain:);idxNew =测试(hpartition);tblNew =(资源(idxNew:);

使用训练数据训练金宝app支持向量机分类模型tblTrain.计算训练数据的误分类误差和分类精度。

Mdl = fitcsvm (tblTrain,“Y”);trainError = resubLoss (Mdl)
trainError = 0.0569
trainAccuracy = 1-trainError
trainAccuracy = 0.9431

通常,训练数据上的误分类错误并不能很好地估计模型在新数据上的表现,因为它可能会低估新数据上的误分类率。一个更好的估计是交叉验证误差。

创建一个分区模型cvMdl.计算10倍交叉验证误分类误差和分类精度。默认情况下,crossval确保每个折叠的班级比例与响应变量中的班级比例大致相同tblTrain。Y

cvMdl = crossval (Mdl);%进行分层10倍交叉验证cvtrainError = kfoldLoss (cvMdl)
cvtrainError = 0.1220
cvtrainAccuracy = 1-cvtrainError
cvtrainAccuracy = 0.8780

注意交叉验证错误cvtrainError是否大于再替换错误trainError

将新数据分类tblNew使用训练过的支持向量机模型。将新数据上的分类精度与估计的精度进行比较trainAccuracycvtrainAccuracy

newError =损失(Mdl tblNew,“Y”);newAccuracy = 1-newError
newAccuracy = 0.8700

交叉验证误差比重新替换误差能更好地估计模型在新数据上的性能。

使用相同的分层分区进行5倍交叉验证,计算两个模型的误分类率。

加载fisheriris数据集。矩阵包含150种不同的花的尺寸。的变量物种列出每种花的种类。

负载fisheriris

为分层的5倍交叉验证创建一个随机分区。训练集和测试集的花卉种类比例大致相同物种

rng (“默认”%的再现性c = cvpartition(物种,“KFold”5);

利用该方法建立分区判别分析模型和分区分类树模型c

discrCVModel = fitcdiscr(量、种类、“CVPartition”c);treeCVModel = fitctree(量、种类、“CVPartition”c);

计算两种划分模型的误分类率。

discrRate = kfoldLoss (discrCVModel)
discrRate = 0.0200
treeRate = kfoldLoss (treeCVModel)
treeRate = 0.0333

该判别分析模型具有较小的交叉验证误分类率。

观察测试集(折)类的比例在一个5折非分层分区fisheriris数据。各层的比例各不相同。

加载fisheriris数据集。的物种变量包含每个花(观察)的种名(类)。转换物种到一个分类变量。

负载fisheriris物种=分类(物种);

找出每堂课的观察次数。请注意,这三个类的比例是相等的。

C =种类(物种)%的类名
C =3 x1细胞{'setosa'} {'versicolor'} {'virginica'}
numClasses =大小(C, 1);n = countcats(物种)%每节课的观察次数
n =3×150 50 50

创建一个随机的非分层的5层分区。

rng (“默认”%的再现性简历= cvpartition(物种,“KFold”5,“分层”假)
cv = K-fold交叉验证分区nummobations: 150 NumTestSets: 5 TrainSize: 120 120 120 120 TestSize: 30 30 30 30 30 30

证明这三个类在五个测试集或折叠中不以相同比例出现。使用for循环来更新nTestData矩阵,以便每一项nTestData (i, j)对应于测试集中的观测数和类C (j).从数据中创建一个柱状图nTestData

numFolds = cv.NumTestSets;nTestData = 0 (numFolds numClasses);i = 1:numFolds testClasses = species(cv.test(i));nCounts = countcats (testClasses);%每个类的测试集观察数nTestData(我:)= nCounts ';结束酒吧(nTestData)包含(“测试集(褶皱)”) ylabel (“数量的观察”)标题(“Nonstratified分区”传奇(C)

图中包含一个轴对象。标题为Nonstratified Partition的axis对象包含3个bar类型的对象。这些物品代表着维珍卡。

注意,在一些测试集中,类的比例是不同的。例如,第一个测试集包含8朵蔷薇花、13朵花斑和9朵virginica花,而不是每个物种10朵。因为简历是随机的非分层分区fisheriris数据中,每个测试集(折)中的类比例不保证等于其中的类比例物种.也就是说,类在每个测试集中的出现并不总是相同的,就像它们在物种

为高数组创建一个非分层抵抗分区和一个分层抵抗分区。对于两组坚持者,比较每一类的观察次数。

当您在高数组上执行计算时,MATLAB®使用一个并行池(如果您有parallel Computing Toolbox™,则默认)或本地MATLAB会话。要在使用并行计算工具箱时使用本地MATLAB会话运行示例,请使用mapreduce函数。

mapreduce (0)

创建两个类的数字向量,其中类1和类2发生在比率中1:10

1组=[(20日);2 * 1 (200 1))
组=220×11 1 1 1 1 1 1 1 1⋮

创建一个高数组集团

tgroup =高(集团)
Tgroup = 220x1高双列向量1 1 1 1 1 1

坚持是唯一的cvpartition用于高数组的选项。金宝app创建一个随机的非分层抵抗分区。

CV0 = cvpartition (tgroup,“坚持”1/4,“分层”假)
nummobservations: [1x1 tall] NumTestSets: 1 TrainSize: [1x1 tall] TestSize: [1x1 tall]

返回结果CV0.test通过使用收集函数。

testIdx0 =收集(CV0.test);
using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.51 sec

找出每个类在测试中出现的次数。

accumarray(集团(testIdx0), 1)% holdout集合中每个类的观察数
ans =2×15 51

cvpartition在结果中产生随机性,所以你在每个类中的观察数可能与显示的不同。

因为CV0是非分层划分,阶级1观察和类2在坚持集中的观察结果不能保证以相同的比率出现tgroup.然而,由于内在的随机性cvpartition,有时可以获得一个holdout集合,其中类以与中的相同比例出现tgroup,即使你指定“分层”,假的.因为训练集是坚持集的补集,不包括任何或者缺失的观察值,你也可以得到类似的结果。

返回结果CV0.training到内存中。

trainIdx0 =收集(CV0.training);
using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.24 sec

找出每个类在训练集中出现的次数。

accumarray(集团(trainIdx0), 1)%训练集中每个类的观察数
ans =2×1149年15

非分层训练集中的类不能保证以相同的比例出现tgroup

创建一个随机分层抵抗分区。

CV1 = cvpartition (tgroup,“坚持”1/4)
nummobservations: [1x1 tall] NumTestSets: 1 TrainSize: [1x1 tall] TestSize: [1x1 tall]

返回结果CV1.test到内存中。

testIdx1 =收集(CV1.test);
using the Local MATLAB Session: - Pass 1 of 1: Completed in 0.12 sec

找出每个类在测试中出现的次数。

accumarray(集团(testIdx1), 1)% holdout集合中每个类的观察数
ans =2×15 51

在分层坚持层划分的情况下,坚持层集中的类比和坚持层集中的类比tgroup都是一样的(1:10)

创建一个随机的数据分区,用于遗漏一的交叉验证。计算和比较训练集的方法。具有显著不同平均值的重复表明存在有影响的观察结果。

创建数据集X它包含一个比其他值大很多的值。

X = [1 2 3 4 5 6 7 8 9 20];

创建一个cvpartition对象有10次观察和10次重复的训练和测试数据。对于每一个重复,cvpartition从训练集中选取一个观测值,并保留给测试集。

c = cvpartition (10,“Leaveout”
c = left -one-out cross validation partition nummobservations: 10 NumTestSets: 10 TrainSize: 9 9 9 9 9 9 9 9 9 9 9 TestSize: 1 1 1 1 1

将省去一个分区应用到X,并对每一次重复的训练观察值取平均值crossval

值= crossval (@ (Xtrain Xtest)意味着(Xtrain), X,“分区”c)
值=10×16.5556 6.4444 7.0000 6.3333 6.6667 7.1111 6.8889 6.7778 6.2222 5.0000

使用方框图(或方框图)查看训练集的分布。情节显示了一个异常值。

boxchart(值)

图中包含一个轴对象。axis对象包含盒形图类型的对象。

找出与离群值对应的重复值。对于这个重复,在测试集中找到观察值。

[~, repetitionIdx] = min(值)
repetitionIdx = 10
observationIdx =测试(c, repetitionIdx);influentialObservation = X (observationIdx)
influentialObservation = 20

包含观察的训练集的均值与没有观察的训练集的均值有很大的不同。均值的显著变化表明20.X是一个有影响力的观察。

提示

  • 如果您指定集团作为的第一个输入参数cvpartition,则该函数丢弃与中缺失值对应的观察行集团

  • 如果您指定集团作为的第一个输入参数cvpartition,则默认实现分层。您可以指定“分层”,假的创建一个非分层的随机分区。

  • 您可以指定“分层”,真的仅当第一个输入参数cvpartition集团

扩展功能

介绍了R2008a