【问题标题】:Predict labels for new dataset (Test data) using cross validated Knn classifier model in matlab在 matlab 中使用交叉验证的 Knn 分类器模型预测新数据集(测试数据)的标签
【发布时间】:2016-09-02 02:39:24
【问题描述】:

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

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 中的可用示例,但找不到任何合适的函数或示例。

我知道如果我的分类器没有经过交叉验证,我可以使用“预测”功能来预测我的测试数据的类标签。代码如下:

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 分类器模型来预测新数据的标签?任何帮助表示赞赏和急需。 :( :(

【问题讨论】:

    标签: matlab machine-learning classification cross-validation knn


    【解决方案1】:

    假设您在学习模型的同时进行 10 折交叉验证。然后,您可以使用 kfoldLoss 函数来获取每个折叠的 CV 损失,然后通过以下方式选择能够提供最少 CV 损失的训练模型:

    modelLosses = kfoldLoss(Mdl,'mode','individual');
    

    如果您在学习时进行了 10 倍交叉验证,上述代码将为您提供长度为 10(10 个 CV 错误值)的向量。假设 CV 误差最小的训练模型是第“k”个,那么您将使用:

    testSetPredictions = predict(Mdl.Trained{k}, testSetFeatures);
    

    【讨论】:

      【解决方案2】:

      您似乎在这里混淆了一些事情。交叉验证是一种模型选择和评估的工具。它本身不是训练程序。因此,您不能“使用”交叉验证的对象。您使用 经过训练的 对象进行预测。交叉验证是一种估计给定模型的泛化能力的形式,它与实际训练无关,它是一个评估特定属性的小型统计实验。

      【讨论】:

      • 感谢您的友好回复。看起来我真的搞砸了交叉验证和培训的想法。根据您上面给出的解释,我还有几个问题。 “交叉验证是模型选择的工具”这是否意味着它选择了最佳模型(我们的分类器模型的最佳参数)?如果是这样,那么我可以在我的训练模型中替换交叉验证模型的不同参数(例如先验、成本等)以获得更好的结果..??还是 fitcknn 自己选择最好的模型?
      • 在训练分类器后,我的分类率非常低 (82%),并且不知道如何提高分类率。真的很抱歉我的幼稚问题。
      猜你喜欢
      • 1970-01-01
      • 2020-06-21
      • 2015-08-31
      • 2020-11-07
      • 2014-06-04
      • 1970-01-01
      • 2019-12-10
      • 2013-03-04
      • 2017-03-30
      相关资源
      最近更新 更多