了解 LIBSVM 中 ovrpredict 的输出

Understanding the output of ovrpredict in LIBSVM

我正在实施多class class化,Libsvm 采用一对多策略。为此,我使用了 ovrtrainovrpredict MATLAB 函数:

model = ovrtrain(GroupTrain, TrainingSet,'t -0' );
[predicted_labels ac decv] = ovrpredict(testY, TestSet, model);

ovrpredict的输出结果如下

Accuracy = 90% (18/20) (classification)
Accuracy = 90% (18/20) (classification)
Accuracy = 90% (18/20) (classification)
Accuracy = 95% (19/20) (classification)
Accuracy = 90% (18/20) (classification)
Accuracy = 90% (18/20) (classification)
Accuracy = 90% (18/20) (classification)
Accuracy = 90% (18/20) (classification)
Accuracy = 90% (18/20) (classification)
Accuracy = 90% (18/20) (classification)

我有 10 个 classes,我是 libsvm 的新手,所以我猜这些精度对应于每个 class 的 class化精度。但是,我不明白此输出与 ovrpredict 返回的准确度 ac 的值有什么区别,即 60%。

ac =

    0.6000

谢谢

这两个值彼此完全不同。准确性是 svmpredict() 函数的输出,它告诉您测试数据集如何适合特定的 class 而 ac 为您提供输入测试 class-标签的准确性( testY 在你的情况下)w.r.t 预测了 class-标签。

让我们看一下 overpredict 函数,看看这些精度值是如何生成的。

function [pred, ac, decv] = ovrpredict(y, x, model)

从定义中可以看出,我们有3个输入参数。

  1. y = Class 标签
  2. x = 测试 sata 集
  3. model = 包含 10 个模型的结构,用于 10 个不同的 classes。

    labelSet = model.labelSet;

labelSet 提取 labelSet(唯一的 class-标签)。在您的情况下,您将拥有 10 个唯一标签,具体取决于您在定义 10 个单独的 class 测试数据时的设置方式。

labelSetSize = length(labelSet)

在这里你得到 classes 的数量(在你的情况下是 10)。

 models = model.models;

'models' 变量将包含所有训练模型(在您的情况下为 10 个)。

decv= zeros(size(y, 1), labelSetSize)

这里创建了 decv 矩阵来保存每个测试数据值的决策概率。

for i=1:labelSetSize
  [l,a,d] = svmpredict(double(y == labelSet(i)), x, models{i});
  decv(:, i) = d * (2 * models{i}.Label(1) - 1);
end

在这里,我们为每个生成的模型传递来自 svmpredict 函数的测试数据。在您的情况下,此循环将迭代 10 次并为每个特定 class 生成 classification Accuracy of test。例如,Accuracy = 90% (18/20) (classification) 表示测试数据集的 20 行中有 18 行与特定 class.

请注意,在多 class SVM 中,您无法根据准确度值做出决定。您将需要 Predac 值来分别进行单独或总体估算。

double(y == labelSet(i) 通过检查 y 中的哪些标签属于特定的 class (迭代器 i 指向的位置),将多 class 标签更改为单个 class 标签.对于不匹配或匹配的情况,它将分别输出 0 或 1。因此,输出标签向量将包含 0 或 1,因此对应于单个 class SVM。

decv(:, i) = d * (2 * models{i}.Label(1) - 1) 标记决策值 -ve(不健康)或 +ve(健康),具体取决于各自训练模型中的单个 -class 标签值。 models{i}.Label(1) 仅包含 2 种类型的值,即0(对于不匹配的案例)或 1(对于匹配的案例)。因此 (2 * models{i}.Label(1) - 1) 将始终评估为 1 或 -1,因此,将决策值标记为健康或不健康。

[tmp,pred] = max(decv, [], 2);
pred = labelSet(pred);

max returns 两个列向量,第一个 (tmp) 包含每行中的最大决策值和结束 (pred) 相应行(或 class)index.Hence,我们是只对 class 索引感兴趣,我们丢弃 tmp 变量。

ac = sum(y==pred) / size(x, 1);

最后,我们将通过检查有多少预测标签与输入测试标签匹配并将总和除以测试classes 的数量来计算ac

在您的情况下,ac=0.6 表示 10 个测试标签中有 6 个与预测标签匹配,或者 4 个标签已被预测。

我希望,它能回答您的问题。