【问题标题】:Why is the predicted_label +1 even though it should be -1? Using LIBSVM in MATLAB为什么 predict_label +1 即使它应该是-1?在 MATLAB 中使用 LIBSVM
【发布时间】:2014-02-18 09:23:53
【问题描述】:

我提取了训练和测试数据的主要成分。
'trainingdata.train' 具有来自 +1(面 1)和 -1(所有其他面)标签的特征值。 'testdata.train' 具有来自第 2 面的特征值并且没有标签,因为我希望 SVM 预测其标签。 LIBSVM 给出的“predicted_label”是 +1,即使它应该是 -1。

[training_label_matrix, training_instance_matrix] = libsvmread('trainingdata.train');
[testing_label_matrix, testing_instance_matrix] = libsvmread('testdata.train');
model = svmtrain(training_label_matrix, training_instance_matrix);
[predicted_label] = svmpredict(testing_label_matrix, testing_instance_matrix, model);

请指出我做错了什么。

【问题讨论】:

  • 确保您的训练数据中的标签正确无误,即人脸标记为 +1,其他标记为 -1
  • @Lennon:我仔细检查了它及其正确性。
  • 如果你使用 svmpredict(training_label_matrix, training_instance_matrix, model);训练结束后?对吗?
  • @Lennon:那不会达到目的,因为我需要预测测试数据的标签。
  • 我知道,但至少你会检查一下标签是否有问题

标签: matlab label svm pca libsvm


【解决方案1】:

使用[predict_label, accuracy, prob_values] = svmpredict(testLabel, testData, model, '-b 1');观察准确度。

testLabel 是包含测试数据“正确”标签的向量。给出这个参数是为了计算accuracy。在实际测试数据标签未知的情况下,只需使用任意随机值即可得到predict_label,无需计算accuracy

此外,虽然不是必需的,但您最好在svmtrain 中指定选项,查看their page 了解更多详细信息。

【讨论】:

  • 那么在测试数据中我应该给标签还是不?
  • testLabel 是包含测试数据“正确”标签的向量。给出这个参数是为了计算精度。在实际测试数据标签未知的情况下,只需使用任意随机值即可得到predict_label,无需计算准确率。
  • Lennon 当我将“testLabel”作为“正确标签”时,我获得了准确性,但我没有发现问题。您说“在测试数据标签未知的真实情况下,只需使用任何随机值来获取 predict_label 而不计算准确性” - 这是我无法做到的。我如何获得 predict_label?
  • 您已经获得了 predict_label。 [predict_label, 准确性, prob_values] = svmpredict(testLabel, testData, model, '-b 1');将为您提供预测的标签和准确度。
  • 使用您当前的测试数据,您知道它们的标签,这就是您可以将它们作为输入添加到 testLabel 的原因。如果给你一个全新的测试数据而没有告诉你他们的标签,你可以随机设置 testLabel 作为输入,你仍然会得到 predict_label。您只是无法计算准确性,因为您甚至不知道这些新测试数据的“正确”标签
【解决方案2】:

@Lennon : 那么代码应该这样写吗?

[training_label_matrix, training_instance_matrix] = libsvmread('trainingdata.train');
[testing_label_matrix, testing_instance_matrix] = libsvmread('testdata.train');
model = svmtrain(training_label_matrix, training_instance_matrix);
[predict_label, accuracy, prob_values] = svmpredict(ones(size(testData,1),1), testing_instance_matrix, model, '-b 1');

【讨论】:

  • 对我来说看起来不错。如果要检查准确性,请改用真正的 testLabel。如果你能得到高准确率,说明你的学习模型运行良好
  • 我之前检查过准确度,它给了我 100% 的准确率,这让我觉得模型/我正在使用的功能确实有问题。所以我看了好几次,似乎没有什么不妥。我仍然想知道那里到底出了什么问题!
  • 如果你得到了 100% 的准确率,为什么你会觉得某事是错误的? +1 或 -1 标签都是您自己在预测过程中给出的。
  • Lennon 非常感谢你,我现在得到了正确的预测标签。我调整了如何输入测试数据,并在它从 .csv 转换为 .train 时给出了一个随机标签 (4)。我想这样可以吗?
  • 很好!恭喜!是的,你所做的对我来说看起来不错。
猜你喜欢
  • 2021-06-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 1970-01-01
  • 2016-03-14
  • 2014-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多