主要内容

cvpartition

为交叉验证划分数据

描述

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

创建

描述

c= cvpartition (n“KFold”,k返回一个cvpartition对象c定义了一个随机的非分层分区k-fold交叉验证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

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

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

rng (“默认”%用于再现性n = length(tbl.Y);Hpartition = cvpartition(n,“坚持”, 0.3);%非分层分区idxTrain =训练(hpartition);tblTrain = tbl(idxTrain,:);idxNew = test(hpartition);tblNew = tbl(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使用训练好的支持向量机模型。将新数据的分类精度与精度估计值进行比较trainAccuracy而且cvtrainAccuracy

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

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

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

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

负载fisheriris

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

rng (“默认”%用于再现性C = cvpartition(species,“KFold”5);

创建分区判别分析模型和分区分类树模型c

discrCVModel = fitcdiscr(meas,species,“CVPartition”c);treeCVModel = fitctree(meas,species,“CVPartition”c);

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

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

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

观察测试集(折叠)类的比例在一个5倍的非分层分区fisheriris数据。类的比例在不同的褶皱中不同。

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

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

求每个类的观察数。注意,这三个类以相同的比例出现。

类别(物种)%类名
C =3 x1细胞{'setosa'} {'versicolor'} {'virginica'}
numClasses = size(C,1);N = countcats(物种)%每个类中的观察数
n =3×150 50 50

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

rng (“默认”%用于再现性CV = cvpartition(species,“KFold”5,“分层”假)
cv = K-fold交叉验证分区NumObservations: 150 NumTestSets: 5 TrainSize: 120 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 =物种(cv.test(i));nCounts =计数猫(testClasses);%每个类中的测试集观察数nTestData(i,:) = nCounts';结束酒吧(nTestData)包含(“测试集(折叠)”) ylabel (“观察次数”)标题(“Nonstratified分区”传奇(C)

图中包含一个轴对象。标题为nonlayered Partition的axis对象包含3个类型为bar的对象。这些物品代表了setosa, versicolica, virgica。

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

为高阵列创建非分层坚持分区和分层坚持分区。对于两个坚持集,比较每个类中的观察数。

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

mapreduce (0)

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

Group = [ones(20,1);2*ones(200,1)]
组=220×11 1 1 1 1 1 1 1 1 1 1

创建一个高数组集团

Tgroup =高(组)
Tgroup = 220x1高双列向量1 1 1 1 1 1 1 1::

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

CV0 = cvpartition(tgroup,“坚持”1/4,“分层”假)
CV0 =坚持交叉验证分区NumObservations: [1x1 tall] NumTestSets: 1 TrainSize: [1x1 tall] TestSize: [1x1 tall]

返回的结果CV0.test的方法来恢复内存收集函数。

testdx0 = gather(c0 .test);
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在0.26秒内完成评估,在0.36秒内完成

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

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

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

因为CV0是一个非分层的分区,类1观察和课堂2在拒止力集中的观测不能保证以与在中相同的比例出现tgroup.然而,由于内在的随机性cvpartition,您有时可以获得一个保留集,其中类以与中的相同的比例出现tgroup,即使你详细说明“分层”,假的.因为训练集是抵抗集的补集,不包括任何或者缺少观测值,你可以在训练集上得到类似的结果。

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

trainIdx0 = gather(c0 .training);
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在0.094秒内完成评估,在0.13秒内完成

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

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

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

创建一个随机分层坚持分区。

CV1 = cvpartition(tgroup,“坚持”1/4)
CV1 =保留交叉验证分区NumObservations: [1x1 tall] NumTestSets: 1 TrainSize: [1x1 tall] TestSize: [1x1 tall]

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

testx1 = gather(CV1.test);
使用本地MATLAB会话评估tall表达式:-通过1 / 1:在0.055秒内完成评估,在0.077秒内完成

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

accumarray(集团(testIdx1), 1)坚持集中每个类的观察数%
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 = Leave-one-out交叉验证分区NumObservations: 10 NumTestSets: 10 TrainSize: 9 9 9 9 9 9 9 9 9 9 9 9 9 9 TestSize: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1

将保留一个分区应用于X,对每次重复的训练观测值取均值crossval

values = crossval(@(Xtrain,Xtest)mean(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对象包含一个boxchart类型的对象。

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

[~,repetitionIdx] = min(values)
repetitionIdx = 10
observationIdx = test(c,repetitionIdx);影响观察= X(observationIdx)
观察= 20

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

提示

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

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

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

扩展功能

版本历史

在R2008a中引入