crossval

使用交叉验证估计损失

描述

犯错= crossval(标准Xÿ'Predfun',predfun返回函数的10倍交叉验证错误估计predfun基于指定标准,无论是'MSE'(均方误差)或'MSC'(错误分类率)。的行Xÿ对应于观察,和的列X对应于预测变量。

在这种情况下,crossval执行以下10次交叉验证:

  1. 拆分意见的预测数据X和响应变量ÿ成10组,其中每一个具有近似相同数目的观测值。

  2. 使用最后九组观察来训练一个模型predfun。将第一组观察值作为测试数据,将测试预测器数据传递到训练模型,并按照中指定的方法计算预测值predfun。计算指定的错误标准

  3. 使用第一组和最后八组观察来训练指定的模型predfun。使用观测的第二组作为测试数据,测试数据传递到训练的模型,并且如在指定的计算预测值predfun。计算指定的错误标准

  4. 继续以类似的方式,直到每个组观察值恰好一次用作测试数据。

  5. 以标量的形式返回平均误差估计犯错

犯错= crossval(标准,X1,...,XN,ÿ'Predfun',predfun返回10倍交叉验证错误估计predfun通过使用预测变量X1通过XN和响应变量ÿ

= crossval(有趣的X对函数执行10次交叉验证有趣的中,施加到数据X。的行X对应于观察,和的列X对应的变量。

crossval通常执行如下10倍交叉验证:

  1. 拆分数据X成10组,其中每一个具有近似相同数目的观测值。

  2. 使用最后九组数据来训练模型中规定有趣的。使用第一组数据作为测试集,通过测试集到训练模型,并计算中指定的一些值(例如,loss)有趣的

  3. 使用第一组和最后八组数据训练指定的模型有趣的。使用数据的第二组作为测试组,通过测试集来训练的模型,并且如在指定计算一些值有趣的

  4. 以类似的方式进行,直到每组数据被准确地用作测试集。

  5. 返回计算出的10个值作为矢量

= crossval(有趣的,X1,…, XN)对函数执行10次交叉验证有趣的中,施加到数据X1,...,XN。每个数据集,X1通过XN,必须具有相同数目的观察,因此,在相同的行数。

___= crossval(___名称,值除了前面语法中的输入参数组合和输出参数外,还使用一个或多个名称-值对参数指定交叉验证选项。例如,“KFold”, 5指定要执行的5倍交叉验证。

例子

全部折叠

通过使用计算回归模型的均方误差10倍交叉验证。

加载carsmall数据集。把加速度,马力,重量和英里每加仑(MPG)的值到矩阵数据。删除包含值。

负载carsmall数据=[加速马力重量MPG];数据(任何(isnan(数据),2),:)= [];

指定的最后一列数据,其对应于MPG,作为响应变量ÿ。的其他列数据作为预测数据X。添加者的一列X当你的回归函数使用回归,如本例所示。

注意:回归当你只需要一个回归模型的系数估计值或残留物是非常有用的。如果您需要进一步调查拟合回归模型,通过建立一个线性回归模型对象fitlm。举一个例子,它使用fitlmcrossval计算平均绝对误差使用交叉验证

(y =数据:4);X = [ones(length(y),1) data(:,1:3)];

创建自定义功能regf(在本例的最后显示)。该函数对训练数据拟合一个回归模型,然后对一个测试集计算预测值。

注意:如果使用活的脚本文件,在这个例子中,regf函数已经包含在文件的末尾。否则,您需要在.m文件的末尾创建此函数,或将其作为MATLAB®路径中的文件添加。

计算默认交叉验证的回归模型预测数据10倍均方误差X和响应变量ÿ

rng (“默认”%用于重现cvMSE = crossval('MSE'中,X,Y,'Predfun'@ regf)
cvMSE = 17.5399

这段代码创建了函数regf

函数yfit = regf(Xtrain,ytrain,XTEST)B =回归(ytrain,Xtrain);yfit = XTEST * B;结束

使用10倍交叉验证计算在数值和分类预测数据上训练的logistic回归模型的误分类误差。

加载耐心数据集。指定数值型变量舒张收缩压还有分类变量性别作为预测,并指定抽烟者作为响应变量。

负载耐心X1 =舒张压;X2 =分类(性别);X3 =收缩压;y =吸烟者;

创建自定义功能classf(在本例的最后显示)。该功能符合逻辑回归模型的训练数据,然后进行分类测试数据。

注意:如果使用活的脚本文件,在这个例子中,classf函数已经包含在文件的末尾。否则,您需要在.m文件的末尾创建此函数,或将其作为MATLAB®路径中的文件添加。

利用预测数据计算模型的10倍交叉验证误分类误差X1X2,X3和响应变量ÿ。指定'分层次',Y确保训练和测试集的吸烟者比例大致相同。

rng (“默认”%用于重现呃= crossval (“宏”,X1,X2,X3,Y,'Predfun'@classf,'分层',y)
ERR = 0.1100

这段代码创建了函数classf

函数PRED = classf(X1train,X2train,X3train,ytrain,X1test,x2检验,X3test)Xtrain =表(X1train,X2train,X3train,ytrain,...'VariableNames',{“舒张”'性别'“收缩”“吸烟者”});XTEST =表(X1test,x2检验,X3test,...'VariableNames',{“舒张”'性别'“收缩”});modelspec =“吸烟者〜舒张+性别+收缩压”;MDL = fitglm(Xtrain,modelspec,'分配'“二”);Xtest yfit =预测(mdl);pred = (yfit > 0.5);结束

对于群集的一个给定的数目,计算观测及其最近的聚类中心之间的平方距离的交叉验证总和。对于比较通过十一个集群的结果。

加载fisheriris数据集。X是矩阵,其中包含花三围为150名不同的花。

负载fisheririsX = MEAS;

创建自定义功能clustf(在本例的最后显示)。该函数执行以下步骤:

  1. 标准化的训练数据。

  2. 将训练数据分离为ķ集群。

  3. 使用训练数据的均值和标准差转换测试数据。

  4. 计算从每一个测试数据点到最近的聚类中心,或质心的距离。

  5. 计算距离的平方和。

注意:如果使用活的脚本文件,在这个例子中,clustf函数已经包含在文件的末尾。否则,您需要在.m文件的末尾创建该函数,或将其作为MATLAB®路径中的文件添加。

创建一个对于环,它指定簇的数目ķ为每个迭代。对于每个固定数量的集群,传递相应的clustf功能crossval。因为crossval缺省情况下执行交叉验证的10倍,该软件计算10个求和平方距离,一个用于训练和测试数据的每个分区。把这些值的总和;结果对于簇的给定数量的平方距离的交叉验证总和。

rng (“默认”%用于重现cvdist =零(5,1);对于K = 1:10乐趣= @(Xtrain,XTEST)clustf(Xtrain,XTEST,K);距离= crossval(乐趣,X);cvdist(K)=总和(距离);结束

绘制每个集群数量的经过交叉验证的平方距离的总和。

情节(cvdist)包含(“集群数”)ylabel (“平方距离的总和CV”

通常,在决定使用多少集群时,要考虑与交叉验证的平方距离的显著减少相对应的集群的最大数量。对于本例,使用两个或三个集群似乎合适,但是使用三个以上的集群就不合适了。

这段代码创建了函数clustf

函数距离= clustf(Xtrain,XTEST,K)[Ztrain,Zmean,Zstd] = zscore(Xtrain);[〜,C] = k均值(Ztrain,K);%创建k个集群中兴通讯= (Xtest-Zmean)。/ Zstd;d = pdist2(C,ZTEST,“欧几里得”“最小”,1);距离=总和(d ^ 2);结束

通过使用计算回归模型的平均绝对误差的10倍交叉验证。

加载carsmall数据集。指定加速度移位变量预测和重量变量作为响应。

负载carsmallX1 =加速;X2 =位移;Y =重量;

创建自定义功能regf(在本例的最后显示)。此功能适合回归模型来训练数据,然后计算在测试组预测的车重。该函数所预测的轿厢重量值与真值,然后计算平均绝对误差(MAE)和MAE调节到测试组车权重的范围内。

注意:如果使用活的脚本文件,在这个例子中,regf函数已经包含在文件的末尾。否则,您需要在.m文件的末尾创建此函数,或将其作为MATLAB®路径中的文件添加。

默认,crossval进行10倍交叉验证。对于每一个在数据的10个训练和测试组分区X1X2,ÿ,计算使用的MAE和调整MAE值regf功能。查找平均MAE和平均调整MAE。

rng (“默认”%用于重现值= crossval(@ regf,X1,X2,Y)
值=10×2319.2261 0.1132 342.3722 0.1240 214.3735 0.0902 174.7247 0.1128 189.4835 0.0832 249.4359 0.1003 194.4210 0.0845 348.7437 0.1700 283.1761 0.1187 210.7444 0.1325
意思是(值)
ans =1×2252.6701 0.1129

这段代码创建了函数regf

函数错误= regf(X1train,X2train,ytrain,X1test,x2检验,ytest)tbltrain =表(X1train,X2train,ytrain,...'VariableNames',{“加速”'移位'“重量”});TBLTEST =表(X1test,x2检验,ytest,...'VariableNames',{“加速”'移位'“重量”});mdl = fitlm (tbltrain,‘重量~加速度+位移’);tbltest yfit =预测(mdl);美=意味着(abs (yfit-tbltest.Weight));adjMAE =美/范围(tbltest.Weight);error = [MAE adjMAE];结束

通过使用主成分分析(PCA)和计算出一个分类树的误分5倍交叉验证。

加载fisheriris数据集。该矩阵包含花三围为150名不同的花。该物种变量列表物种的每朵花。

负载fisheriris

创建自定义功能classf(在本例的最后显示)。这个函数让分类树适合于训练数据,然后对测试数据进行分类。在函数内部使用PCA来减少用于创建树模型的预测器的数量。

注意:如果使用活的脚本文件,在这个例子中,classf函数已经包含在文件的末尾。否则,您需要在.m文件的末尾创建此函数,或将其作为MATLAB®路径中的文件添加。

创建一个cvpartition对象分层5倍交叉验证。默认,cvpartition确保训练和测试集有大致花卉品种相同比例。

rng (“默认”%用于重现CVP = cvpartition(物种,'KFold',5);

计算5倍交叉验证误分用于与预测数据的分类树和响应变量物种

cvError = crossval (“宏”,MEAS,品种,'Predfun'@classf,“分区”本量利)
cvError = 0.1067

这段代码创建了函数classf

函数yfit = classf (Xtrain ytrain Xtest)标准化训练预测数据。然后,找到%为标准化训练预测因子的主成分%数据。[Ztrain, Zmean Zstd] = zscore (Xtrain);[多项式系数,scoreTrain, ~, ~,解释说,μ)= pca (Ztrain);%找到最低数量的主要组件的帐户%,其变异率至少为95%。N =查找(cumsum(解释)> = 95,1);%查看该标准化n个主成分得分%训练预测数据。训练分类树模型只使用这些%的分数。scoreTrain95 = scoreTrain(:,1:N);MDL = fitctree(scoreTrain95,ytrain);%查找变换所述n主成分得分%测试数据。对测试数据进行分类。中兴通讯= (Xtest-Zmean)。/ Zstd;scoreTest95 = (Ztest-mu) *多项式系数(:,1:n);scoreTest95 yfit =预测(mdl);结束

创建从判别分析模型的10倍交叉验证结果的混淆矩阵。

注意:使用分类当训练速度是一个问题。否则,使用fitcdiscr创建一个判别分析模型。对于示出了相同的工作流如本例的例子,但使用fitcdiscr创建混淆矩阵使用交叉验证预测

加载fisheriris数据集。X包含花三围为150个不同的花,ÿ列出每种花的种类。创建一个变量订单这就规定了花种的顺序。

负载fisheririsX = MEAS;Y =物种;为了=唯一的(y)的
订单=3 x1细胞“setosa”“versicolor”“virginica””

创建一个名为的函数句柄FUNC对于一个完成以下步骤的函数:

  • 参加训练数据(Xtrainytrain)和测试数据(Xtestytest)。

  • 使用训练数据创建一个分类新数据的判别分析模型(Xtest)。属性创建此模型并对新数据进行分类分类功能。

  • 比较真实的测试数据类(ytest),以预测的测试数据值,并通过使用创建的结果的混淆矩阵confusionmat功能。通过使用指定类订单“订单”,订单

func = @ (Xtrain、ytrain Xtest、欧美)confusionmat(欧美,...分类(XTEST,Xtrain,ytrain),“秩序”、订单);

创建一个cvpartition对象为分层的10倍交叉验证。默认,cvpartition确保训练和测试集有大致花卉品种相同比例。

rng (“默认”%用于重现本量利= cvpartition (y,“Kfold”,10);

计算10个测试组混淆矩阵的预测数据的每个分区X和响应变量ÿ。每行confMat对应于一个测试集的混淆矩阵结果。聚合结果并创建最终的混淆矩阵与CvMat

confMat = crossval (func, X, y,“分区”、本量利);cvMat =重塑(总和(confMat), 3、3)
cvMat =3×350 0 0 0 48 2 0 1 49

通过使用绘制混淆矩阵作为一个混淆矩阵图表confusionchart

confusionchart(与CvMat,顺序)

输入参数

全部折叠

误差估计的类型,指定为'MSE'“宏”

价值 描述
'MSE' 均方误差(MSE) -只适用于回归算法
“宏” 误分类率或误分类观测的比例-只适用于分类算法

数据集,指定为列向量、矩阵或数组。的行X对应于观察,和的列X通常对应于变量。如果你传递多个数据集X1,...,XNcrossval,那么所有的数据集必须具有相同的行数。

数据类型:||合乎逻辑|烧焦||细胞|明确的

响应数据,指定为列向量或字符数组。的行ÿ对应于观察,并ÿ必须与预测器数据具有相同的行数XX1,...,XN

数据类型:||合乎逻辑|烧焦||细胞|明确的

预测函数,指定为函数句柄。必须将此函数创建为匿名函数、定义在包含其余代码的.m或.mlx文件末尾的函数或MATLAB上的文件®路径。

此表描述了所需的功能语法,给予传递给预测数据的类型crossval

价值 预测数据 函数的语法
@myfunction X

功能yfit = myfunction的(Xtrain,ytrain,XTEST)%计算预测响应...端

  • Xtrain中观察的子集X作为训练预测数据。该函数使用Xtrainytrain构建分类或回归模型。

  • ytrain- 响应的子集ÿ作为训练响应数据。的行ytrain的行中对应相同的观察值Xtrain。该函数使用Xtrainytrain构建分类或回归模型。

  • Xtest中观察的子集X用作测试的预测数据。该函数使用Xtest和模型上的培训Xtrainytrain来计算预测值yfit

  • yfit- 设置预测值在观察Xtest。该yfit值形成的列向量的行数与Xtest

@myfunction X1,...,XN

功能yfit = myfunction的(X1train,...,XNtrain,ytrain,X1test,...,XNtest)%计算预测响应...端

  • X1train,…, XNtrain-预报器数据的子集X1,...,XN分别被用作训练数据的预测。的行X1train,…, XNtrain符合相同的观察结果。该函数使用X1train,…, XNtrainytrain构建分类或回归模型。

  • ytrain- 响应的子集ÿ作为训练响应数据。的行ytrain的行中对应相同的观察值X1train,…, XNtrain。该函数使用X1train,…, XNtrainytrain构建分类或回归模型。

  • X1test,…, XNtest- 观测的亚群X1,...,XN分别被用作测试的预测数据。的行X1test,…, XNtest符合相同的观察结果。该函数使用X1test,…, XNtest和模型上的培训X1train,…, XNtrainytrain来计算预测值yfit

  • yfit- 设置预测值在观察X1test,…, XNtest。该yfit值形成的列向量的行数与X1test,…, XNtest

例:@(Xtrain,ytrain,XTEST)(XTEST *回归(ytrain,Xtrain));

数据类型:function_handle

函数进行交叉验证,指定为函数句柄。必须将此函数创建为匿名函数、定义在包含其余代码的.m或.mlx文件末尾的函数或MATLAB路径上的文件。

此表描述了所需的功能语法,给予传递给数据类型crossval

价值 数据 函数的语法
@myfunction X

函数值= myfunction(Xtrain,Xtest) %计算值…结束

  • Xtrain中观察的子集X用作训练数据。该函数使用Xtrain构建一个模型。

  • Xtest中观察的子集X用作测试数据。该函数使用Xtest和模型上的培训Xtrain计算价值

  • 价值- 产品数量或可变的。在多数情况下,价值是表示损耗估计的数值标量。价值也可以是一个数组,前提是训练和测试数据的每个分区的数组大小相同。如果你想返回一个变量输出可以根据数据分区,设置改变大小价值是细胞的标量{输出}代替。

@myfunction X1,...,XN

函数值= myfunction(X1train,…,XNtrain,X1test,…,XNtest) %结束

  • X1train,…, XNtrain- 在数据子集X1,...,XN分别被用作训练数据。的行X1train,…, XNtrain符合相同的观察结果。该函数使用X1train,…, XNtrain构建一个模型。

  • X1test,…, XNtest- 在数据子集X1,...,XN分别被用作测试数据。的行X1test,…, XNtest符合相同的观察结果。该函数使用X1test,…, XNtest和模型上的培训X1train,…, XNtrain计算价值

  • 价值- 产品数量或可变的。在多数情况下,价值是表示损耗估计的数值标量。价值也可以是一个数组,前提是训练和测试数据的每个分区的数组大小相同。如果你想返回一个变量输出可以根据数据分区,设置改变大小价值是细胞的标量{输出}代替。

数据类型:function_handle

名称-值对的观点

的可选逗号分隔对名称,值参数。名称参数名和价值为对应值。名称必须出现在引号内。可以按任意顺序指定多个名称和值对参数名1,值1,...,NameN,值N

例:crossval (mcr的量,物种,Predfun, @classf, KFold, 5,“分层”,物种)指定为。计算分层的5倍交叉验证错分类率classf带有预测数据的函数和响应变量物种

用于坚持验证的观察值的分数或数目,指定为逗号分隔的对'坚持'和范围内的(0,1)或正整数标量的标量值。

  • 如果坚持价值p那么在(0,1)范围内的标量是什么crossval随机地选择和储备大致P * 100%的意见作为测试数据。

  • 如果坚持价值p是正整数标量,然后crossval随机选择和储备p观测作为测试数据。

在这两种情况下,crossval然后训练任意指定的模型有趣的predfun使用剩下的数据。最后,函数使用测试数据和训练过的模型来计算两者犯错

您只能使用这四个名称 - 值对参数之一:坚持KFold忽略,划分

例:'不吸墨性',0.3

例:'不吸墨性',50

数据类型:|

折叠为k折交叉验证的数,指定为逗号分隔的一对组成的'KFold'一个大于1的正整数标量。

如果您指定KFold, k, 然后crossval随机将数据划分为ķ集。对于每一组,功能储备组作为测试数据,以及火车通过任一指定的模型有趣的predfun使用其他ķ- 1集。crossval然后使用测试数据和训练过的模型来计算犯错

您只能使用这四个名称 - 值对参数之一:坚持KFold忽略,划分

例:“KFold”, 5

数据类型:|

留一法交叉验证,指定为逗号分隔的一对组成的“Leaveout”1

如果您指定'Leaveout',1,然后为每个观测,crossval保留观察作为测试数据,并训练由任一指定的模型有趣的predfun使用其他观察。然后该函数使用测试观察训练的模型一起计算无论是犯错

您只能使用这四个名称 - 值对参数之一:坚持KFold忽略,划分

例:'Leaveout',1

数据类型:|

蒙特卡洛重复进行验证的数,指定为逗号分隔的一对组成的'MCReps'和一个正整数标量。如果第一个输入crossval'MSE'“宏”(看到标准), 然后crossval返回所有蒙特卡罗重复的平均MSE或误分类率。否则,crossval串接所有蒙特卡洛重复的值沿第一维。

如果同时指定划分MCReps,则第一蒙特卡洛重复使用在分区信息cvpartition对象,而软件调用重新分区目标函数,以产生对每个剩余的重复的新的分区。

例:“MCReps”, 5

数据类型:|

交叉验证分区,指定为逗号分隔的对,由“分区”和一个cvpartition创建的分区对象cvpartition。partition对象指定交叉验证的类型以及训练和测试集的索引。

当您使用crossval,不能同时指定两者划分分层。相反,当您创建直接指定分层分区cvpartition分区对象。

您只能使用这四个名称 - 值对参数之一:坚持KFold忽略,划分

变量指定组用于分层,指定为逗号分隔的一对组成的'分层'以及与数据具有相同行数的列向量XX1,...,XN

当您指定分层,无论是训练和测试集有大致相同的比例类中的分层向量。该软件将S,空特征向量,空字符串,<缺失>值,<定义>价值观分层,并忽略数据的相应行。

在使用分类算法进行交叉验证时,一个好的做法是使用分层。否则,一些测试集可能不包括对所有类的观察。

当您使用crossval,不能同时指定两者划分分层。相反,当您创建直接指定分层分区cvpartition分区对象。

数据类型:||合乎逻辑||细胞|明确的

对于运行在并行计算和设置随机流选项,指定为逗号分隔的一对组成的“选项”和结构。创建选项结构statset。下表列出了选项字段和它们的值。

字段名称 价值 默认的
UseParallel 将该值设置为真正的并行地运行计算。
UseSubstreams

将该值设置为真正的以可重复的方式并行地运行计算。

为了计算重复性,集到允许子流的类型:'mlfg6331_64''mrg32k3a'

指定这个值为aRandStream对象或由一个这样的对象的单元阵列。 如果没有指定, 然后crossval使用默认流。

注意

您需要并行计算工具箱™来并行运行计算。

例:'选项',statset( 'UseParallel',真)

数据类型:结构体

输出参数

全部折叠

均方误差或错误率,返回一个数字标。错误的类型依赖于标准值。

损失值,返回作为列向量或矩阵。每行对应于输出有趣的用于训练和测试数据的一个分区。

如果输出返回有趣的是多维的,那么crossval重塑输出,并将其融入一行。例如,请参阅使用交叉验证创建混淆矩阵

提示

  • 一个好的做法是使用分层(见分层)当您使用交叉验证与分类算法。否则,一些测试集可能不包括对所有类的观察。

选择功能

许多分类和回归函数允许您直接执行交叉验证。

  • 当您使用适合的功能,如fitcsvmfitctree,fitrtree,您可以使用名称 - 值对参数指定交叉验证选项。或者,你可以先创建这些拟合函数模型,然后通过创建一个分区对象crossval目标函数。使用kfoldLosskfoldPredict对象函数来计算用于所述分区的对象的损耗值和预测值。欲了解更多信息,请参阅ClassificationPartitionedModelRegressionPartitionedModel

  • 您也可以指定交叉验证选项时,您执行套索或弹性网正则化使用套索lassoglm

扩展功能

介绍了在R2008a