[英]Understanding the output of ovrpredict in LIBSVM
我正在實現一個多類分類,其中Libsvm采用“一對一”與“全部”策略。 為此,我使用了ovrtrain
和ovrpredict
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個班級,我是libsvm的新手,所以我想這些准確度對應於每個班級的分類准確性。 但是,我不明白此輸出與ovrpredict
返回的精確度ac
的值(60%)之間有什么區別。
ac =
0.6000
謝謝
這兩個值彼此完全不同。 准確性是svmpredict()
函數的輸出,它告訴您測試數據集如何適合該特定類別,而ac
則為您提供了預測類別標簽的輸入測試類別標簽(在您的情況下為testY)的准確性。
讓我們看一下內部overpredict
函數,看看如何生成這些精度值。
function [pred, ac, decv] = ovrpredict(y, x, model)
從定義上我們可以看到,我們有3個輸入參數。
模型=包含10個不同類別的10個模型的結構。
labelSet = model.labelSet;
labelSet提取labelSet(唯一的類標簽)。 在您的情況下,您將具有10個唯一的標簽,具體取決於在定義10個單獨的測試數據類別時如何設置。
labelSetSize = length(labelSet)
在這里,您可以得到班級數量(在您的情況下為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次並為每個特定類生成分類測試的准確性。 例如, 准確度= 90%(18/20)(分類)表示測試數據集的20行中有18行與該特定類別匹配。
請注意,在多類SVM中,您無法基於Accuracy值做出決定。 您將需要Pred
和ac
值分別進行單獨或整體估算。
double(y == labelSet(i)
通過檢查y中的哪些標簽屬於特定類(迭代器i指向的位置),將多類標簽更改為單類標簽,對於不匹配或匹配的情況,它將輸出0或1因此,輸出標簽向量將包含0或1,因此對應於單類SVM。
decv(:, i) = d * (2 * models{i}.Label(1) - 1)
標記決策值-ve(不健康)或+ ve(健康),取決於各自受過訓練的單類別標簽值模型。 models{i}.Label(1)
僅包含兩種類型的值,即0(對於不匹配的情況)或1(對於匹配的情況)。 因此(2 * models{i}.Label(1) - 1)
將始終求值為1或-1,因此將決策值標記為健康或不健康。
[tmp,pred] = max(decv, [], 2);
pred = labelSet(pred);
max返回兩個列向量,第一個(tmp)包含每一行的最大決策值,並在結尾(pred)對應的行(或類)索引。因此,我們只對類索引感興趣,我們丟棄了tmp變量。
ac = sum(y==pred) / size(x, 1);
最后,我們將通過檢查與輸入測試標簽匹配的預測標簽數量並將總和除以測試類別數來計算ac
。
在您的情況下, ac=0.6
表示10個測試標簽中有6個與預測標簽匹配,否則就預測了4個標簽。
希望它能回答您的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.