8

matlab の分類子の精度と再現率の計算に問題があります。私は fisherIris データ (150 個のデータポイント、50 個の setosa、50 個の versicolor、50 個の virginica で構成される) を使用します。kNNアルゴリズムを使用して分類しました。ここに私の混同行列があります:

50     0     0
 0    48     2
 0     4    46

正解率は96%(144/150)ですが、matlabを使って精度と再現率を計算する方法、機能はありますか? その精度= tp /(tp + fp)、および再現率= tp /(tp + fn)の式は知っていますが、コンポーネントを特定するのに迷っています。たとえば、真陽性はマトリックスから 144 であると言えますか? 偽陽性と偽陰性はどうですか?助けてください!!!本当に感謝します!ありがとうございました!

4

4 に答える 4

8

pederpansen の回答に追加するために、各クラスの精度、再現率、F1 スコア、およびすべてのクラスの平均 F1 スコアを計算するためのいくつかの匿名の Matlab 関数を次に示します。

precision = @(confusionMat) diag(confusionMat)./sum(confusionMat,2);

recall = @(confusionMat) diag(confusionMat)./sum(confusionMat,1)';

f1Scores = @(confusionMat) 2*(precision(confusionMat).*recall(confusionMat))./(precision(confusionMat)+recall(confusionMat))

meanF1 = @(confusionMat) mean(f1Scores(confusionMat))
于 2016-03-07T11:48:40.450 に答える
3

Dan がコメントで指摘したように、適合率と再現率は通常、二項分類の問題に対してのみ定義されます。

ただし、クラスごとに精度と再現率を個別に計算できます。混同行列に少し注釈を付けましょう。

          |                  true           |
          |      |  seto  |  vers  |  virg  |
          -----------------------------------
          | seto |   50        0        0
predicted | vers |    0       48        2
          | virg |    0        4       46

ここでは、通常の規則が成り立つと仮定しました。つまり、列は真の値に使用され、行は学習アルゴリズムによって予測された値に使用されます。(行列が逆に構築された場合は、単純に混同行列の転置を取ります。)

各クラス (= 行/列インデックス)の真陽性 ( tp(i))iは、その行/列の対角要素によって与えられます。真陰性 ( tn) は、残りの対角要素の合計によって与えられます。i各クラスのネガを単に「クラスではない」と定義していることに注意してくださいi

fp偽陽性 ( ) と偽陰性 ( fn) をそれぞれ、特定の行または列の非対角エントリの合計と同様に定義すると、各クラスの適合率と再現率を計算できます。

precision(seto) = tp(seto) / (tp(seto) + fp(seto)) = 50 / (50 + (0 + 0)) = 1.0
precision(vers) = 48 / (48 + (0 + 2)) = 0.96
precision(virg) = 46 / (46 + (0 + 4)) = 0.92

recall(seto) = tp(seto) / (tp(seto) + fn(seto)) = 50 / (50 + (0 + 0)) = 1.0
recall(vers) = 48 / (48 + (0 + 4)) = 0.9231
recall(virg) = 46 / (46 + (0 + 2)) = 0.9583

ここでは、説明のために行インデックスの代わりにクラス名を使用しました。

複数クラスの分類問題の場合のパフォーマンス測定の詳細については、この質問への回答をご覧ください。特に、各クラスに 1 つの数値ではなく単一の数値を使用する場合は特にそうです。もちろん、これを行う最も簡単な方法は、各クラスの値を平均することです。

アップデート

これを行うための Matlab 関数を実際に探していたことに気付きました。組み込み関数はないと思います。Matlab File Exchange では、二項分類問題の関数しか見つかりませんでした。ただし、タスクは非常に簡単で、次のように独自の関数を簡単に定義できます。

function y = precision(M)
  y = diag(M) ./ sum(M,2);
end

function y = recall(M)
  y = diag(M) ./ sum(M,1)';
end

これにより、各クラスの適合率と再現率の値をそれぞれ含む列ベクトルが返されます。これで、簡単に呼び出すことができます

>> mean(precision(M))

ans =

    0.9600

>> mean(recall(M))

ans =

    0.9605

モデルの平均適合率と再現率の値を取得します。

于 2015-03-12T14:42:43.297 に答える