主要内容

crossval

使用交叉验证估计损失

描述

例子

犯错= crossval (标准Xy“Predfun”,predfun返回函数的10倍交叉验证误差估计predfun基于指定的标准,要么mse的(均方误差)或“宏”(错误)。一排排的X而且y的列与观测值相对应X与预测变量相对应。

有关更多信息,请参见predfun的一般交叉验证步骤

例子

犯错= crossval (标准X1、……XN,y“Predfun”,predfun返回的10倍交叉验证错误估计predfun通过使用预测变量X1通过XN以及响应变量y

例子

= crossval (有趣的X为函数执行10次交叉验证有趣的,应用于中的数据X.一排排的X的列与观测值相对应X对应变量。

有关更多信息,请参见通用交叉验证步骤的乐趣

例子

= crossval (有趣的X1、……XN)为函数执行10次交叉验证有趣的,应用于中的数据X1,…,XN.每一个数据集,X1通过XN,必须有相同数量的观测值,因此行数也必须相同。

例子

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

例子

全部折叠

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

加载carsmall数据集。将加速度、马力、重量和每加仑英里数(MPG)放入矩阵中数据.删除包含值。

负载carsmalldata =[加速度、马力、重量MPG];Data (any(isnan(Data),2),:) = [];

的最后一列数据,对应于英里/加仑为响应变量y.的其他列数据作为预测数据X.添加一列为X当你的回归函数使用回归,如本例所示。

注意:回归当您只是需要一个回归模型的系数估计或残差时,是有用的。如果您需要进一步研究拟合的回归模型,请使用fitlm.举个例子fitlm而且crossval,请参阅使用交叉验证计算平均绝对误差

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

创建自定义函数regf(如本例末尾所示)。该函数拟合一个回归模型到训练数据,然后在测试集上计算预测值。

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

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

rng (“默认”%用于再现性cvMSE = crossval(mse的, X, y,“Predfun”@regf)
cvMSE = 17.5399

这段代码创建了函数regf

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

通过使用10倍交叉验证,计算在数字和分类预测器数据上训练的逻辑回归模型的错误分类误差。

加载病人数据集。指定数值变量舒张压而且收缩压还有分类变量性别作为预测器,并指定吸烟者作为响应变量。

负载病人X1 =舒张期;X2 =分类(性别);X3 =收缩期;y =吸烟者;

创建自定义函数classf(如本例末尾所示)。该函数将逻辑回归模型拟合到训练数据中,然后对测试数据进行分类。

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

用预测器数据计算模型的10倍交叉验证错分类误差X1X2,X3响应变量y.指定“分层”,y确保训练组和测试组的吸烟者比例大致相同。

rng (“默认”%用于再现性Err = crossval(“宏”, X1, X2, X3, y,“Predfun”@classf,“分层”, y)
Err = 0.1100

这段代码创建了函数classf

函数pred = classf(X1train,X2train,X3train,ytrain,X1test,X2test,X3test,X3test)...“VariableNames”, {舒张压的“性别”“收缩”“抽烟”});Xtest = table(X1test,X2test,X3test,...“VariableNames”, {舒张压的“性别”“收缩”});modelspec =“吸烟者~舒张期+性别+收缩期”;mdl = fitglm(Xtrain,modelspec,“分布”“二”);yfit = predict(mdl,Xtest);Pred = (yfit > 0.5);结束

对于给定数量的聚类,计算观测值与它们最近的聚类中心之间的平方距离的交叉验证和。比较一个到十个集群的结果。

加载fisheriris数据集。X是矩阵,其中包含150种不同花的尺寸。

负载fisheririsX = meas;

创建自定义函数clustf(如本例末尾所示)。这个函数执行以下步骤:

  1. 规范培训数据。

  2. 将训练数据分成k集群。

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

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

  5. 计算距离的平方和。

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

创建一个循环,指定集群的数量k对于每个迭代。对于每个固定数量的集群,传递相应的clustf函数crossval.因为crossval默认情况下执行10倍交叉验证,软件计算10个平方距离的和,一个用于训练和测试数据的每个分区。取这些值的和;结果是给定簇数的交叉验证距离平方和。

rng (“默认”%用于再现性Cvdist = 0 (5,1);fun = @(Xtrain,Xtest)clustf(Xtrain,Xtest,k);距离= crossval(fun,X);Cvdist (k) = sum(距离);结束

为每个簇数绘制交叉验证的距离平方和。

情节(cvdist)包含(“簇数”) ylabel (CV距离平方和

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

一般来说,在决定使用多少簇时,应考虑与交叉验证的平方距离和的显著减少相对应的最大簇数。对于本例,使用两个或三个集群似乎是合适的,但使用三个以上集群则不合适。

这段代码创建了函数clustf

函数距离= clustf(Xtrain,Xtest,k) [Ztrain,Zmean,Zstd] = zscore(Xtrain);[~,C] = kmeans(Ztrain,k);%创建k个集群Ztest = (Xtest-Zmean)./Zstd;d = pdist2(C,Ztest,“欧几里得”“最小”1);距离= sum(d.^2);结束

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

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

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

创建自定义函数regf(如本例末尾所示)。该函数拟合一个回归模型到训练数据,然后在测试集上计算预测的汽车重量。该函数将预测的汽车重量值与真实值进行比较,然后计算平均绝对误差(MAE)和调整到测试集汽车重量范围的MAE。

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

默认情况下,crossval执行10次交叉验证。对于每10个训练集和测试集中的数据分区X1X2,y,计算MAE和调整后的MAE值regf函数。找到平均MAE和平均调整MAE。

rng (“默认”%用于再现性values = 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

函数errors = regf(X1train,X2train,ytrain,X1test,X2test,ytest) tbltrain = table(X1train,X2train,ytrain,...“VariableNames”, {“加速”“位移”“重量”});tbltest = table(X1test,X2test,ytest,...“VariableNames”, {“加速”“位移”“重量”});MDL = fitlm(tbltrain,“重量~加速度+位移”);Yfit = predict(mdl,tbltest);MAE =均值(abs(yfit-tbltest.Weight));adjMAE = MAE/range(tbltest.Weight);errors = [MAE adjMAE];结束

通过主成分分析(PCA)和5倍交叉验证计算分类树的误分类误差。

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

负载fisheriris

创建自定义函数classf(如本例末尾所示)。该函数对训练数据拟合分类树,然后对测试数据进行分类。在函数中使用PCA来减少用于创建树模型的预测器的数量。

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

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

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

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

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

这段代码创建了函数classf

函数yfit = classf(Xtrain,ytrain,Xtest)标准化训练预测数据。然后,找到为标准化训练预测因子的主成分%的数据。[Ztrain,Zmean,Zstd] = zscore(Xtrain);[coeff,scoreTrain,~,~,explained,mu] = pca(Ztrain);找出最小数量的主成分%,至少95%的可变性。N = find(cumsum(explained)>=95,1);找到标准化的n个主成分分数%训练预测器数据。训练一个分类树模型%仅使用这些分数。scoreTrain95 = scoreTrain(:,1:n);mdl = fitctree(scoreTrain95,ytrain);找出转换后的n个主成分得分%测试数据。分类测试数据。Ztest = (Xtest-Zmean)./Zstd;scoreTest95 = (Ztest-mu)*coeff(:,1:n);yfit = predict(mdl,scoreTest95);结束

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

注意:使用分类当训练速度是一个问题时。否则,使用fitcdiscr建立判别分析模型。下面的示例显示了与此示例相同的工作流,但使用了fitcdiscr,请参阅使用交叉验证预测创建混淆矩阵

加载fisheriris数据集。X包含150种不同花卉的花卉测量值,以及y列出每种花的种类。创建一个变量订单指定花种类的顺序。

负载fisheririsX = meas;Y =物种;顺序=唯一(y)
订单=3 x1细胞{'setosa'} {'versicolor'} {'virginica'}

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

  • 接收训练数据(Xtrain而且ytrain)和测试数据(Xtest而且欧美).

  • 使用训练数据创建判别分析模型,对新数据进行分类(Xtest).方法创建此模型并对新数据进行分类分类函数。

  • 比较真实的测试数据类(欧美)到预测的测试数据值,并使用confusionmat函数。使用指定类顺序“秩序”,秩序

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

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

rng (“默认”%用于再现性CVP = cvpartition(y,“Kfold”10);

为预测器数据的每个分区计算10个测试集混淆矩阵X响应变量y.每行confMat对应于一个测试集的混淆矩阵结果。汇总结果并创建最终的混淆矩阵cvMat

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

将混淆矩阵绘制为混淆矩阵图confusionchart

confusionchart (cvMat顺序)

图包含一个confusimatrixchart类型的对象。

输入参数

全部折叠

误差估计的类型,指定为任意一种mse的“宏”

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

数据集,指定为列向量、矩阵或数组。一排排的X的列与观测值相对应X一般对应于变量。如果你传递多个数据集X1,…,XNcrossval,则所有数据集的行数必须相同。

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

响应数据,指定为列向量或字符数组。一排排的y与观察结果相对应,和y必须具有与预测器数据相同的行数XX1,…,XN

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

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

根据传递给预测器的数据类型,该表描述了所需的函数语法crossval

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

函数yfit = myfunction(Xtrain,ytrain,Xtest) %计算预测响应…结束

  • Xtrain-中观察结果的子集X用作训练预测数据。函数使用Xtrain而且ytrain建立分类或回归模型

  • ytrain中的响应的子集y用作训练响应数据。一排排的ytrain对应于相同的观察到的行Xtrain.函数使用Xtrain而且ytrain建立分类或回归模型

  • Xtest-中观察结果的子集X用作测试预测数据。函数使用Xtest模型在上面训练Xtrain而且ytrain计算预测值yfit

  • yfit中观测值的预测值集Xtest.的yfit值组成的列向量具有相同的行数Xtest

@myfunction X1,…,XN

function yfit = myfunction(X1train,…,XNtrain,ytrain,X1test,…,XNtest) %计算预测响应…结束

  • X1train,…,XNtrain-预测器数据的子集X1,…,XN,分别作为训练预测数据。一排排的X1train,…,XNtrain与相同的观察结果相对应。函数使用X1train,…,XNtrain而且ytrain建立分类或回归模型

  • ytrain中的响应的子集y用作训练响应数据。一排排的ytrain对应于相同的观察到的行X1train,…,XNtrain.函数使用X1train,…,XNtrain而且ytrain建立分类或回归模型

  • X1test,…,XNtest-中观测值的子集X1,…,XN,分别作为测试预测数据。一排排的X1test,…,XNtest与相同的观察结果相对应。函数使用X1test,…,XNtest模型在上面训练X1train,…,XNtrain而且ytrain计算预测值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

function value = 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

名称-值参数

指定可选参数对为Name1 = Value1,…,以=家,在那里的名字参数名称和价值对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。

在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字在报价。

例子:crossval (mcr的量,物种,Predfun, @classf, KFold, 5,“分层”,物种)的分层5倍交叉验证错分类率classf使用预测器数据的函数响应变量物种

用于拒绝验证的观察分数或数量,以逗号分隔的对表示,由“坚持”和范围(0,1)中的标量值或正整数标量。

  • 如果坚持价值p那么是(0,1)范围内的标量吗crossval随机选择并大约保留p * 100%的观测值作为测试数据。

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

无论哪种情况,crossval然后训练指定的模型有趣的predfun使用剩下的数据。最后,该函数使用测试数据和训练好的模型进行计算犯错

您只能使用以下四个名称-值对参数中的一个:坚持KFoldLeaveout,分区

例子:“坚持”,0.3

例子:“坚持”,50岁

数据类型:|

用于k-fold交叉验证的折叠数,指定为逗号分隔的对,由“KFold”一个大于1的正整数标量。

如果你指定KFold, k,然后crossval将数据随机划分为k集。对于每个集合,函数将该集合保留为测试数据,并训练其中一个指定的模型有趣的predfun使用对方k- 1套。crossval然后使用测试数据和训练好的模型进行计算犯错

您只能使用以下四个名称-值对参数中的一个:坚持KFoldLeaveout,分区

例子:“KFold”,5

数据类型:|

省略一个交叉验证,指定为逗号分隔的对,由“Leaveout”而且1

如果你指定“Leaveout”,1,那么对于每个观察,crossval保留观察数据作为测试数据,并训练指定的模型有趣的predfun利用其他观察结果。然后,该函数使用测试观察和训练过的模型进行计算犯错

您只能使用以下四个名称-值对参数中的一个:坚持KFoldLeaveout,分区

例子:“Leaveout”,1

数据类型:|

用于验证的蒙特卡洛重复数,指定为逗号分隔的对,由“MCReps”一个正整数标量。的第一个输入crossvalmse的“宏”(见标准),然后crossval返回所有蒙特卡洛重复的平均MSE或误分类率。否则,crossval连接来自第一个维度上所有蒙特卡罗重复的值。

如果同时指定分区而且MCReps,则第一次蒙特卡罗重复使用分区信息cvpartition对象,软件调用重新分区对象函数为每个剩余的重复生成新的分区。

例子:“MCReps”,5

数据类型:|

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

当你使用crossval,则不能同时指定分区而且分层.类时,应直接指定分层分区cvpartition分区对象。

您只能使用以下四个名称-值对参数中的一个:坚持KFoldLeaveout,分区

变量,指定用于分层的组,指定为逗号分隔的对,由“分层”和一个与数据行数相同的列向量XX1,…,XN

当你指定分层,训练集和测试集的类比例与分层向量。软件处理S,空字符向量,空字符串,< >失踪值,<定义>分层作为丢失的数据值,并忽略相应的数据行。

当您使用分类算法的交叉验证时,一个好的实践是使用分层。否则,一些测试集可能不包括所有类的观察值。

当你使用crossval,则不能同时指定分区而且分层.类时,应直接指定分层分区cvpartition分区对象。

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

并行运行计算和设置随机流的选项,指定为结构。创建选项结构statset.该表列出了选项字段及其值。

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

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

若要可重复计算,请设置到允许子流的类型:“mlfg6331_64”“mrg32k3a”

将此值指定为aRandStream对象或由一个这样的对象组成的单元格数组。 如果您没有指定,然后crossval使用默认流。

请注意

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

例子:“选项”,statset (UseParallel,真的)

数据类型:结构体

输出参数

全部折叠

均方误差或误分类率,作为数字标量返回。错误的类型取决于标准价值。

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

返回的输出有趣的是多维的crossval的一行中重新塑造输出并将其放入.有关示例,请参见使用交叉验证创建混淆矩阵

提示

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

算法

全部折叠

的通用交叉验证步骤predfun

当你使用predfun,crossval函数通常执行10次交叉验证,如下所示:

  1. 将观察结果拆分到预测数据中X以及响应变量y分成10组,每组有大约相同数量的观测值。

  2. 使用最后九组观察数据来训练中指定的模型predfun.使用第一组观察数据作为测试数据,将测试预测数据传递给训练后的模型,并计算中指定的预测值predfun.计算指定的误差标准

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

  4. 以类似的方式进行,直到每组观察数据都被用作一次测试数据。

  5. 返回作为标量的平均误差估计犯错

的通用交叉验证步骤有趣的

当你使用有趣的,crossval函数通常执行10次交叉验证,如下所示:

  1. 将数据拆分为X分成10组,每组有大约相同数量的观测值。

  2. 使用最后九组数据来训练中指定的模型有趣的.使用第一组数据作为测试集,将测试集传递给训练后的模型,并计算中指定的一些值(例如损失)有趣的

  3. 使用第一组和最后八组数据来训练中指定的模型有趣的.使用第二组数据作为测试集,将测试集传递给训练后的模型,并计算中指定的一些值有趣的

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

  5. 返回10个计算值作为向量

选择功能

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

  • 当你使用拟合函数时fitcsvmfitctree,fitrtree,可以使用名称-值对参数指定交叉验证选项。或者,您可以先使用这些拟合函数创建模型,然后使用crossval对象的功能。使用kfoldLoss而且kfoldPredict对象函数来计算分区对象的损失和预测值。有关更多信息,请参见ClassificationPartitionedModel而且RegressionPartitionedModel

  • 在使用套索或弹性网正则化时,还可以指定交叉验证选项套索而且lassoglm

扩展功能

版本历史

在R2008a中引入