主要内容

crossval

使用交叉验证估计损失

描述

例子

犯错= Crossval(标准Xy“Predfun”,预先返回函数的10倍交叉验证误差估计预先基于指定的标准, 任何一个mse的(均方误差)或“宏”(错误分类率)。的行Xy对应于观察和列X对应于预测变量。

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

例子

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

例子

= Crossval(有趣的X对功能执行10倍交叉验证有趣的,应用于数据X.的行X对应于观察和列X对应的变量。

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

例子

= Crossval(有趣的X1、……XN)对功能执行10倍交叉验证有趣的,应用于数据X1,…,XN.每个数据集,X1通过XN,必须具有相同的观察数,因此相同的行数。

例子

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

例子

全部折叠

用十倍交叉验证计算回归模型的均方误差。

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

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

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

笔记:回归当您只需要回归模型的系数估计或残差时,很有用。如果您需要进一步调查拟合的回归模型,请通过使用创建线性回归模型对象fitlm.有关使用的示例fitlmcrossval,请参阅使用交叉验证计算平均绝对误差

(y =数据: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 (“默认”%的再现性呃= crossval (“宏”,x1,x2,x3,y,“Predfun”@classf,'分层', y)
err = 0.1100.

这段代码创建了这个函数Classf.

函数pred = classf(x1train,x2train,x3train,x3test,x2test,x3test)xtrain = table(x1train,x2train,x3train,ytrain,......'variablenames',{舒张压的'性别''收缩'“抽烟”});Xtest =表(X1test X2test X3test,......'variablenames',{舒张压的'性别''收缩'});modelspec =吸烟者~舒张期+性别+收缩期;mdl = fitglm (Xtrain modelspec,'分配'“二”);Xtest yfit =预测(mdl);= (yfit > 0.5);结束

对于给定数量的星团,计算交叉验证的观测值与其最近的星团中心之间的距离的平方和。比较1到10个集群的结果。

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

负载fisheririsX =量;

创建自定义函数Clustf.(在本例的最后)。该函数执行如下步骤:

  1. 规范培训数据。

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

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

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

  5. 计算距离的平方和的总和。

笔记:如果使用此示例的实时脚本文件,则Clustf.函数已经包含在文件的末尾。否则,您需要在。m文件的末尾创建函数,或者将其作为文件添加到MATLAB®路径中。

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

rng (“默认”%的再现性cvdist = 0(5、1);k = 1:10 fun = @(Xtrain,Xtest)clustf(Xtrain,Xtest,k);距离= crossval(有趣,X);cvdist (k) =总和(距离);结束

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

情节(cvdist)包含('簇数量') ylabel ('平方距离的简历'

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

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

这段代码创建了这个函数Clustf.

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

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

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

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

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

笔记:如果使用此示例的实时脚本文件,则REGF.函数已经包含在文件的末尾。否则,您需要在。m文件的末尾创建这个函数,或者将其作为文件添加到MATLAB®路径中。

默认情况下,crossval执行10倍交叉验证。中数据的10个训练和测试集分区X1X2,y,计算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.

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

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

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

负载fisheriris

创建自定义函数Classf.(在本例的最后)。该函数对训练数据拟合分类树,然后对测试数据进行分类。在函数内部使用PCA来减少用于创建树模型的预测器的数量。

笔记:如果使用此示例的实时脚本文件,则Classf.函数已经包含在文件的末尾。否则,您需要在。m文件的末尾创建这个函数,或者将其作为文件添加到MATLAB®路径中。

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

rng (“默认”%的再现性本量利= cvpartition(物种,'kfold'5);

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

cvError = crossval (“宏”量,物种,“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种不同花的花测量,y列出每种花的种类。创建一个变量订单这说明了花的种类的顺序。

负载fisheririsX =量;y =物种;订单=独特(y)
订单=3 x1细胞{'setosa'} {'versicolor'} {'virginica'}

创建命名的函数句柄函数对于完成以下步骤的函数:

  • 获取培训数据(Xtrainytrain)及测试数据(Xtestytest.).

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

  • 比较真实的测试数据类(ytest.)的预测测试数据值,并使用confusionmat函数。使用“订单”,订单

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

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

rng (“默认”%的再现性本量利= cvpartition (y,“Kfold”10);

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

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

将混淆矩阵绘制为混淆矩阵图,使用困惑的园林

confusionchart (cvMat顺序)

Figure包含一个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用作训练预测数据。这个函数使用Xtrainytrain构建分类或回归模型。

  • ytrain中响应的子集y用作培训响应数据。的行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中响应的子集y用作培训响应数据。的行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

名称-值参数

指定可选的逗号分隔的对名称,值参数。姓名参数名和价值为对应值。姓名必须出现在引号内。可以以任意顺序指定多个名称和值对参数Name1, Value1,…,的家

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

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

  • 如果坚持价值p是范围(0,1)的标量,然后crossval随机选择和近似储备p * 100%作为试验数据。

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

在这两种情况下,crossval然后训练其中任何一个指定的模型有趣的预先使用剩下的数据。最后,该函数使用测试数据和训练过的模型进行计算犯错

您只能使用这四个名称值对参数中的一个:坚持kfold.Leaveout,划分

例子:“坚持”,0.3

例子:“坚持”,50岁

数据类型:单身的|

k-fold交叉验证的折叠数,指定为逗号分隔对,包括'kfold'一个大于1的正整数。

如果您指定KFold, k,然后crossval将数据随机划分为k套。对于每个集合,该函数保留设置为测试数据,并列车由任何一个指定的模型有趣的预先使用另一个k- 1集。crossval然后使用测试数据和训练过的模型来计算犯错

您只能使用这四个名称值对参数中的一个:坚持kfold.Leaveout,划分

例子:“KFold”,5

数据类型:单身的|

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

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

您只能使用这四个名称值对参数中的一个:坚持kfold.Leaveout,划分

例子:“Leaveout”,1

数据类型:单身的|

验证的蒙特卡罗重复数量,指定为逗号分隔的对'mcreps'一个正整数标量。如果第一个输入crossvalmse的“宏”(见标准),然后crossval返回所有蒙特卡罗重复的平均MSE或误分类率。否则,crossval将沿第一维的所有蒙特卡罗重复的值连接起来。

如果您指定两者划分MCReps,然后第一个蒙特卡罗重复使用分区信息cvpartition对象,软件调用重新分区对象函数为每个剩余重复生成新分区。

例子:“MCReps”,5

数据类型:单身的|

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

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

您只能使用这四个名称值对参数中的一个:坚持kfold.Leaveout,划分

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

当您指定时分层,训练集和测试集的类比例大致相同分层向量。该软件将S,空字符向量,空字符串,< >失踪值,<定义>价值分层表示缺少数据值,并忽略数据的相应行。

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

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

数据类型:单身的||逻辑|细绳|细胞|分类

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

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

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

若要重复计算,请设置转换为允许子流的类型:'mlfg6331_64''MRG32K3A'

将此值指定为arandstream.对象或包含此类对象的单元格数组。 如果没有指定,然后crossval使用默认流。

请注意

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

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

数据类型:结构体

输出参数

全部折叠

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

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

如果返回的输出有趣的是多维的,那么crossval将输出重新设置为一行.例如,请参见使用交叉验证创建混淆矩阵

提示

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

算法

全部折叠

通用交叉验证步骤预先

当你使用时预先,crossval函数通常执行以下10倍交叉验证:

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

  2. 使用最后九组观察来训练一个模型,如预先.将第一组观测数据作为测试数据,将测试预测数据传递到训练的模型中,计算出的预测值预先.计算指定的错误标准

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

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

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

通用交叉验证步骤有趣的

当你使用时有趣的,crossval函数通常执行以下10倍交叉验证:

  1. 将数据分割为X分成10组,每一组的观测结果大致相同。

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

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

  4. 以类似的方式继续,直到每一组数据被作为测试集使用一次。

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

选择功能

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

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

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

扩展能力

介绍了R2008a