首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用matlab中交叉验证的Knn分类器模型预测新数据集(测试数据)的标签

利用matlab中交叉验证的Knn分类器模型预测新数据集(测试数据)的标签
EN

Stack Overflow用户
提问于 2016-05-06 22:23:56
回答 2查看 2.4K关注 0票数 1

我有一个训练数据集(50000×16)和测试数据集(5000×16),这两个数据集中的第16列是决策标签或响应。测试数据集中的决策标签用于检验训练分类器的分类精度。我使用我的训练数据来训练和验证我的交叉验证的knn分类器。我使用以下代码创建了一个交叉验证的knn分类器模型:

代码语言:javascript
复制
X = Dataset2(1:50000,:); % Use some data for fitting
Y = Training_Label(1:50000,:); % Response of training data

%Create a KNN Classifier model
rng(10); % For reproducibility
Mdl = fitcknn(X,Y,'Distance', 'Cosine', 'Exponent', '', 'NumNeighbors', 10,'DistanceWeight', 'Equal', 'StandardizeData', 1);

%Construct a cross-validated classifier from the model.
CVMdl = crossval(Mdl,'KFold', 10);

%Examine the cross-validation loss, which is the average loss of each cross-validation model when predicting on data that is not used for training.
kloss = kfoldLoss(CVMdl, 'LossFun', 'ClassifError')

% Compute validation accuracy
validationAccuracy = 1 - kloss;

现在,我想使用这个交叉验证的knn分类器对我的测试数据进行分类,但是无法真正弄清楚如何做到这一点。我已经在matlab中看过了可用的例子,但是没有找到任何合适的函数或例子来完成这个任务。

我知道,如果我的分类器没有交叉验证,我可以使用“预测”函数来预测测试数据的类标签。守则如下:

代码语言:javascript
复制
X = Dataset2(1:50000,:); % Use some data for fitting
Y = Training_Label(1:50000,:); % Response of training data

%Create a KNN Classifier model
rng(10); % For reproducibility
Mdl = fitcknn(X,Y,'Distance', 'Cosine', 'Exponent', '', 'NumNeighbors', 10,'DistanceWeight', 'Equal', 'StandardizeData', 1);

%Classification using Test Data
Classifier_Output_Labels = predict(Mdl,TestDataset2(1:5000,:));

但对于交叉验证训练的knn分类器,我找不到类似的函数(如“预测”)。我在Matlab文档中找到了"kfoldPredict“函数,但它说该函数用于评估经过训练的模型。http://www.mathworks.com/help/stats/classificationpartitionedmodel.kfoldpredict.html,但是我没有通过这个函数找到新数据的任何输入。

所以,有谁能告诉我如何使用交叉验证的knn分类器模型来预测新数据的标签?任何帮助都是非常感谢和迫切需要的。::(

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-06 22:27:46

你好像把事情搞糊涂了。交叉验证是模型选择和评估的工具。这不是培训程序本身。因此,您不能“使用”交叉验证对象。您可以使用训练的对象进行预测。交叉验证是估计给定模型泛化能力的一种形式,它与实际训练无关,只是一个小的统计实验。

票数 1
EN

Stack Overflow用户

发布于 2016-08-13 02:23:15

假设您正在学习模型时进行10倍的交叉验证。然后,您可以使用kfoldLoss函数获得每一倍的CV损失,然后选择经过训练的模型,以下列方式给出最小的CV损失:

代码语言:javascript
复制
modelLosses = kfoldLoss(Mdl,'mode','individual');

如果你在学习时做了10倍的交叉验证,上述代码将给你一个长度为10的向量(10个CV误差值)。假设经过训练的CV误差最小的模型是‘k’,那么您可以使用:

代码语言:javascript
复制
testSetPredictions = predict(Mdl.Trained{k}, testSetFeatures);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37082266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档