2017-04-06 3 views
0

私はLibsvmで1対すべての戦略を採用したマルチクラス分類を実装しています。この目的のために、私はovrtrainovrpredict MATLAB関数を使用:LIBSVMのovrpredictの出力を理解する

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

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) 

を次のようにovrpredictの出力は、私が10回のクラスを持っている、私はので、私はそれらのことを推測LIBSVMする新たなんです精度は各クラスの分類精度に対応する。しかし、私はこの出力と正確度acの値がovrpredictによって返された値との違いは分かりません。これは60%です。両方の値が互いに全く異なる

ac = 

    0.6000 

おかげ

答えて

1

。 Accuracyはsvmpredict()関数の出力で、acは入力テストクラスラベル(あなたの場合はtestY)w.r.t予測クラスラベルの精度を与えますが、テストデータセットが特定のクラスにどのように適合しているかを示します。

overpredictの内部を見て、これらの精度値がどのように生成されているかを確認してください。

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

定義から、3つの入力パラメータがあります。

  1. Y =クラスラベル
  2. X =試験SATAは
  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では、精度値に基づいて決定することはできません。個別または全体的な見積もりを行うには、それぞれPredacの値が必要です。

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)には2種類の値しか含まれていません。 0(不一致の場合)または1(一致した場合)。したがって、(2 * models{i}.Label(1) - 1)は常に1または-1と評価され、したがって、決定値を健全または不健全にする。

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

は、maxはindex.Henceは、我々は、我々は廃棄クラスインデックスにのみ関心がある(predは)それぞれの行(またはクラス)の各列と最終的に最大の判定値を含む2つの列ベクトル、第1(TMP)を返しますtmp変数。

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

最後に、我々は多くの予測ラベルを入力テストラベルと一致するかチェックし、テストクラスの数との合計を割ることによってacを計算します。あなたのケースでは

ac=0.6は10枚のテストラベルのうち6は、ラベルを予測一致または4つのラベルはそう予測されていることを意味します。

ご質問にお答えします。

+0

ご清聴ありがとうございました。とても感謝しています。 –