主要内容

crossval

估计损失使用交叉验证

描述

例子

犯错= crossval (标准,X,y“Predfun”,predfun)返回一个10倍交叉验证函数的误差估计predfun根据指定的标准,要么mse的(均方误差)或“宏”(错误)。的行Xy对应于观测的列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)值矩阵数据。包含删除任何行值。

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

指定的最后一列数据,对应于英里/加仑响应变量y。指定的其他列数据预测数据X。添加一个列的X当你回归函数使用回归在这个例子中。

注意:回归是有用的,当你只需要系数估计或回归模型的残差。如果你需要进一步调查合身的回归模型,创建一个对象通过使用线性回归模型fitlm。使用的一个例子fitlmcrossval,请参阅使用交叉验证计算平均绝对误差

(y =数据:4);X =[(长度(y), 1)的数据(: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倍交叉验证错误分类与预测数据误差的模型X1,X2,X3和响应变量y。指定“分层”,y以确保训练集和测试集的吸烟者比例大致相同。

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

这段代码创建函数classf

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

对于一个给定数量的集群,计算旨在观察之间的距离平方的总和及其最近的聚类中心。比较结果为一个通过十集群。

加载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有趣= @ (Xtrain Xtest) clustf (Xtrain Xtest k);距离= crossval(有趣,X);cvdist (k) =总和(距离);结束

画出旨在距离平方之和为每个集群的数量。

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

图包含一个坐标轴对象。坐标轴对象包含一个类型的对象。

一般而言,在确定使用多少集群,考虑集群的最大数量,对应于一个旨在大幅降低距离平方的总和。对于这个示例,使用两个或三个集群似乎是合适的,但是使用不超过三个集群。

这段代码创建函数clustf

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

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

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

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

创建自定义函数regf(如图所示的这个例子)。这个函数符合回归模型训练数据,然后计算测试集预测汽车重量。功能比较了预测汽车重量值真实值,然后计算平均绝对误差(MAE)和梅调整范围的测试集汽车重量。

注意:如果你使用现场脚本文件对于本例,regf功能已经包含在文件的末尾。否则,您需要创建这个函数的m文件或将它添加在MATLAB®文件路径。

默认情况下,crossval执行10倍交叉验证。每10个训练集和测试集的分区的数据X1,X2,y,计算出美和调整美值使用regf函数。发现平均美和平均调整美。

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, X2test,欧美)tbltrain =表(X1train、X2train ytrain,“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}{“癣”}{' virginica '}

创建一个函数处理命名函数一个函数,完成以下步骤:

  • 在训练数据(Xtrainytrain)和测试数据(Xtest欧美)。

  • 使用训练数据来创建一个分类新数据的判别分析模型(Xtest)。创建这个模型和分类新数据使用分类函数。

  • 比较真实的测试数据类(欧美)预测测试数据值,并创建一个混淆矩阵的结果通过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

confusionchart (cvMat顺序)

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

输入参数

全部折叠

类型的错误估计,指定为mse的“宏”

价值 描述
mse的 均方误差(MSE)——适合回归算法
“宏” 误分类率,或观察分类错误的比例——只适合分类算法

数据集,指定为一个列向量,矩阵,或数组。的行X对应于观测的列X一般对应变量。如果你通过多个数据集X1,…, XNcrossval,那么所有的数据集都必须有相同的行数。

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

响应数据,指定为一个列向量或字符数组。的行y对应于观测y必须有相同的行数预测数据XX1,…, XN

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

预测函数,指定为一个函数处理。您必须创建一个匿名函数,这个函数定义一个函数结束时00或.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

旨在函数,指定为一个函数处理。您必须创建一个匿名函数,这个函数定义一个函数结束时00或.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然后火车通过指定的模型有趣的predfun使用其余的数据。最后,函数使用测试数据与训练模型来计算犯错

您可以使用这四个名称-值对的只有一个参数:坚持,KFold,Leaveout,分区

例子:“坚持”,0.3

例子:“坚持”,50岁

数据类型:|

许多折叠k-fold交叉验证,指定为逗号分隔组成的“KFold”和一个正整数系数大于1。

如果您指定KFold, k,然后crossval随机数据分区k集。对于每一个集合,函数保留设置为测试数据,和火车通过指定的模型有趣的predfun使用另一个k- 1集。crossval然后使用测试数据与训练模型来计算犯错

您可以使用这四个名称-值对的只有一个参数:坚持,KFold,Leaveout,分区

例子:“KFold”, 5

数据类型:|

分析交叉验证,指定为逗号分隔组成的“Leaveout”1

如果您指定“Leaveout”, 1,然后为每一个观察,crossval储备的观察测试数据,和火车通过指定的模型有趣的predfun使用另一个观察。然后使用功能测试观察随着训练模型来计算犯错

您可以使用这四个名称-值对的只有一个参数:坚持,KFold,Leaveout,分区

例子:“Leaveout”, 1

数据类型:|

蒙特卡罗重复验证,指定为逗号分隔组成的“MCReps”和一个正整数标量。如果第一个输入的crossvalmse的“宏”(见标准),然后crossval返回意味着MSE或误分类率在所有蒙特卡罗重复。否则,crossval连接的值从蒙特卡罗重复第一个维度。

如果你指定分区MCReps,然后第一个蒙特卡罗重复使用的分区信息cvpartition对象,软件调用重新分区目标函数来生成新的分区的剩余的重复。

例子:“MCReps”, 5

数据类型:|

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

当你使用crossval,你不能同时指定分区分层。相反,当你创建直接指定一个分层分区cvpartition分区对象。

您可以使用这四个名称-值对的只有一个参数:坚持,KFold,Leaveout,分区

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

当你指定分层,有训练集和测试集的比例大致相同的类分层向量。该软件将年代,空特征向量,空字符串,<失踪>值,<定义>分层丢失的数据值,忽略了相应的行数据。

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

当你使用crossval,你不能同时指定分区分层。相反,当你创建直接指定一个分层分区cvpartition分区对象。

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

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

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

将这个值设置为真正的并行计算可再生的方式运行。

计算重复性良好一个类型,允许substreams:“mlfg6331_64”“mrg32k3a”

这个值指定为一个RandStream对象或一个单元阵列组成的一个这样的对象。 如果你不指定,然后crossval使用默认的流。

请注意

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

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

数据类型:结构体

输出参数

全部折叠

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

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

如果返回的输出有趣的是多维的,那么crossval重塑的输出适合成一行。例如,看到的使用交叉验证创建混淆矩阵

提示

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

算法

全部折叠

广义交叉验证步骤predfun

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

  1. 分裂的观察预测数据X和响应变量y分成十组,每一个都有大约相同数量的观察。

  2. 使用过去的9组的观察来训练模型中指定predfun。用第一组的观察作为测试数据,通过测试预测数据训练模型,并计算预测中指定的值predfun。计算指定的错误标准

  3. 用第一组和观察的最后8组训练模型中指定predfun。使用第二组的观察作为测试数据,通过测试数据训练模型,计算预测中指定的值predfun。计算指定的错误标准

  4. 以类似的方式进行,直到每一组观测数据作为测试数据准确。

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

广义交叉验证步骤有趣的

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

  1. 分裂中的数据X分成十组,每一个都有大约相同数量的观察。

  2. 使用的最后九组数据训练模型中指定有趣的。使用第一组数据作为测试集,通过测试设置为训练模型,计算一个值(例如,损失)中指定有趣的

  3. 用第一组和过去八组数据训练模型中指定有趣的。使用第二组数据作为测试集,通过测试设置为训练模型,计算中指定的一些价值有趣的

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

  5. 返回10计算值的向量

选择功能

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

  • 当你使用等功能fitcsvm,fitctree,fitrtree,您可以通过使用名称-值对参数指定交叉验证选项。或者,你可以用这些适应函数首先创建模型,然后创建一个分区的对象使用crossval对象的功能。使用kfoldLosskfoldPredict对象功能分区计算损失和预期值对象。有关更多信息,请参见ClassificationPartitionedModelRegressionPartitionedModel

  • 您还可以指定交叉验证选择当您执行套索或弹性网使用正则化套索lassoglm

扩展功能

介绍了R2008a