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
モデルの平均適合率と再現率の値を取得します。