crossval
使用交叉验证估计损失
语法
描述
为函数执行10次交叉验证值
= crossval (有趣的
,X
)有趣的
,应用于中的数据X
.一排排的X
的列与观测值相对应X
对应变量。
有关更多信息,请参见通用交叉验证步骤的乐趣.
例子
使用交叉验证计算均方误差
通过使用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倍交叉验证错分类误差X1
,X2
,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
(如本例末尾所示)。这个函数执行以下步骤:
规范培训数据。
将训练数据分成
k
集群。使用训练数据的平均值和标准偏差转换测试数据。
计算从每个测试数据点到最近的聚类中心或质心的距离。
计算距离的平方和。
注意:如果在本例中使用活动脚本文件,则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距离平方和)
一般来说,在决定使用多少簇时,应考虑与交叉验证的平方距离和的显著减少相对应的最大簇数。对于本例,使用两个或三个集群似乎是合适的,但使用三个以上集群则不合适。
这段代码创建了函数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个训练集和测试集中的数据分区X1
,X2
,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顺序)
输入参数
标准
- - - - - -误差估计类型
mse的
|“宏”
误差估计的类型,指定为任意一种mse的
或“宏”
.
价值 | 描述 |
---|---|
mse的 |
均方误差(MSE) -仅适用于回归算法 |
“宏” |
误分类率,或误分类观测的比例-仅适用于分类算法 |
X
- - - - - -数据集
列向量|矩阵|数组
数据集,指定为列向量、矩阵或数组。一排排的X
的列与观测值相对应X
一般对应于变量。如果你传递多个数据集X1,…,XN
来crossval
,则所有数据集的行数必须相同。
数据类型:单
|双
|逻辑
|字符
|字符串
|细胞
|分类
y
- - - - - -响应数据
列向量|字符数组
响应数据,指定为列向量或字符数组。一排排的y
与观察结果相对应,和y
必须具有与预测器数据相同的行数X
或X1,…,XN
.
数据类型:单
|双
|逻辑
|字符
|字符串
|细胞
|分类
predfun
- - - - - -预测功能
函数处理
预测函数,指定为函数句柄。您必须将此函数创建为匿名函数、定义在包含其余代码的.m或.mlx文件末尾的函数,或MATLAB中的文件®路径。
根据传递给预测器的数据类型,该表描述了所需的函数语法crossval
.
价值 | 预测数据 | 函数的语法 |
---|---|---|
@myfunction |
X |
函数yfit = myfunction(Xtrain,ytrain,Xtest) %计算预测响应…结束
|
@myfunction |
X1,…,XN |
function yfit = myfunction(X1train,…,XNtrain,ytrain,X1test,…,XNtest) %计算预测响应…结束
|
例子:@ (Xtrain ytrain Xtest) (Xtest *回归(ytrain Xtrain));
数据类型:function_handle
有趣的
- - - - - -交叉验证的函数
函数处理
函数进行交叉验证,指定为函数句柄。必须将此函数创建为匿名函数、定义在包含其余代码的.m或.mlx文件末尾的函数或MATLAB路径上的文件。
根据传递给的数据类型,该表描述了所需的函数语法crossval
.
价值 | 数据 | 函数的语法 |
---|---|---|
@myfunction |
X |
函数值= myfunction(Xtrain,Xtest) %结束
|
@myfunction |
X1,…,XN |
function value = myfunction(X1train,…,XNtrain,X1test,…,XNtest) %结束
|
数据类型:function_handle
名称-值参数
指定可选参数对为Name1 = Value1,…,以=家
,在那里的名字
参数名称和价值
对应的值。名称-值参数必须出现在其他参数之后,但对的顺序无关紧要。
在R2021a之前,使用逗号分隔每个名称和值,并将其括起来的名字
在报价。
例子:crossval (mcr的量,物种,Predfun, @classf, KFold, 5,“分层”,物种)
的分层5倍交叉验证错分类率classf
使用预测器数据的函数量
响应变量物种
.
坚持
- - - - - -用于坚持验证的观察分数或数量
[]
(默认)|范围(0,1)中的标量值|正整数标量
分区
- - - - - -交叉验证分区
[]
(默认)|cvpartition
分区对象
交叉验证分区,指定为逗号分隔的对,由“分区”
和一个cvpartition
创建的分区对象cvpartition
.分区对象指定交叉验证的类型以及训练集和测试集的索引。
当你使用crossval
,则不能同时指定分区
而且分层
.类时,应直接指定分层分区cvpartition
分区对象。
选项
- - - - - -并行运行和设置随机流的选项
结构
并行运行计算和设置随机流的选项,指定为结构。创建选项
结构statset
.该表列出了选项字段及其值。
字段名 | 价值 | 默认的 |
---|---|---|
UseParallel |
将此值设置为真正的 并行运算并行地进行计算 |
假 |
UseSubstreams |
将此值设置为 若要可重复计算,请设置 |
假 |
流 |
将此值指定为aRandStream 对象或由一个这样的对象组成的单元格数组。 |
如果您没有指定流 ,然后crossval 使用默认流。 |
请注意
您需要并行计算工具箱™来并行地运行计算。
例子:“选项”,statset (UseParallel,真的)
数据类型:结构体
输出参数
犯错
-均方误差或误分类率
数字标量
均方误差或误分类率,作为数字标量返回。错误的类型取决于标准
价值。
值
-损失值
列向量|矩阵
损失值,以列向量或矩阵形式返回。每行值
对应于的输出有趣的
训练和测试数据的一个分区。
返回的输出有趣的
是多维的crossval
的一行中重新塑造输出并将其放入值
.有关示例,请参见使用交叉验证创建混淆矩阵.
提示
一个好的做法是使用分层(见
分层
)当你使用分类算法的交叉验证时。否则,一些测试集可能不包括所有类的观察值。
算法
的通用交叉验证步骤predfun
当你使用predfun
,crossval
函数通常执行10次交叉验证,如下所示:
选择功能
许多分类和回归函数允许您直接执行交叉验证。
当你使用拟合函数时
fitcsvm
,fitctree
,fitrtree
,可以使用名称-值对参数指定交叉验证选项。或者,您可以先使用这些拟合函数创建模型,然后使用crossval
对象的功能。使用kfoldLoss
而且kfoldPredict
对象函数来计算分区对象的损失和预测值。有关更多信息,请参见ClassificationPartitionedModel
而且RegressionPartitionedModel
.
扩展功能
自动平行支撑万博1manbetx
通过使用并行计算工具箱™自动并行运行计算来加速代码。
要并行运行,请指定“选项”
参数中的名称-值,并将“UseParallel”
字段的选项结构为真正的
使用statset
.
例如:“选项”,statset (UseParallel,真的)
有关并行计算的更多信息,请参见运行MATLAB函数与自动并行支持万博1manbetx(并行计算工具箱).
版本历史
在R2008a中引入
MATLAB命令
你点击了一个对应于这个MATLAB命令的链接:
在MATLAB命令窗口中输入该命令来运行该命令。Web浏览器不支持MATLAB命令。万博1manbetx
您也可以从以下列表中选择一个网站:
如何获得最佳的网站性能
选择中国站点(中文或英文)以获得最佳站点性能。其他MathWorks国家站点没有针对您所在位置的访问进行优化。