マルチクラスマルチラベル分類、つまり、2つ以上のラベルがあり、各インスタンスが複数のラベルを持つことができる分類の精度を計算し、測定値をリコールする方法を疑問に思っていますか?
マルチクラスマルチラベル分類、つまり、2つ以上のラベルがあり、各インスタンスが複数のラベルを持つことができる分類の精度を計算し、測定値をリコールする方法を疑問に思っていますか?
回答:
分類器のパフォーマンスを測定するためのもう1つの一般的なツールはROC / AUCです。これもマルチクラス/マルチラベル拡張機能を備えています。[Hand 2001]を参照してください
[Hand 2001]:ROC曲線下の領域の複数のクラス分類問題への単純な一般化
ここではいくつかの混乱行列とマルチクラス精度/リコール測定についてコーセラフォーラムのスレッドの議論です。
基本的な考え方は、すべてのクラスのすべての精度とリコールを計算し、それらを平均して単一の実数測定値を取得することです。
混同マトリックスを使用すると、クラスの精度とリコールを簡単に計算できます。
以下は、そのスレッドからコピーされた混同マトリックスに関する基本的な説明です。
混同マトリックスは、3つ以上のクラスがある場合に、真の陽性、真の陰性、偽陽性、および偽陰性を分類する方法です。精度とリコールを計算するために使用されるため、マルチクラス問題のf1-scoreに使用されます。
実際の値は列で表されます。予測値は行で表されます。
例:
実際に8である10のトレーニング例は、5として誤って分類(予測)されています5
実際に4である13のトレーニング例は、9として誤って分類されています
混同マトリックス
cm = 0 1 2 3 4 5 6 7 8 9 10 1 298 2 1 0 1 1 3 1 1 0 2 0 293 7 4 1 0 5 2 0 0 3 1 3 263 0 8 0 0 3 0 2 4 1 5 0 261 4 0 3 2 0 1 5 0 0 10 0 254 3 0 10 2 1 6 0 4 1 1 4 300 0 1 0 0 7 1 3 2 0 0 0 264 0 7 1 8 3 5 3 1 7 1 0 289 1 0 9 0 1 3 13 1 0 11 1 289 0 10 0 6 0 1 6 1 2 1 4 304
クラスxの場合:
真の正:対角位置、cm(x、x)。
偽陽性:列xの合計(主対角線なし)、sum(cm(:, x))-cm(x、x)。
偽陰性:行xの合計(主対角線なし)、sum(cm(x、:)、2)-cm(x、x)。
コースの公式に従って、精度、再現率、F1スコアを計算できます。
すべてのクラスの平均化(重み付けの有無にかかわらず)により、モデル全体の値が得られます。
マルチラベル分類には、2つの方法があります。まず、次のことを考慮してください。
メトリックは、データポイントごとに計算されます。予測されたラベルごとに、そのスコアのみが計算され、これらのスコアがすべてのデータポイントにわたって集計されます。
他のメトリックもあります。
ここでは、ラベルごとに処理が行われます。ラベルごとにメトリック(精度、リコールなど)が計算され、これらのラベルごとのメトリックが集計されます。したがって、この場合、バイナリ分類(各ラベルにはバイナリ割り当てがある)の場合と同様に、データセット全体で各ラベルの精度/リコールを計算し、集計します。
簡単な方法は、一般的なフォームを提示することです。
これは、標準のマルチクラスに相当するものの単なる拡張です。
あなたはMULT-ラベルメトリックのコードに見ていて興味があるかもしれないここに、どのパッケージの一部mldrでR。また、JavaマルチラベルライブラリMULANを調べることもできます。
これは、さまざまなメトリックを理解するのに最適な論文です。 マルチラベル学習アルゴリズムのレビュー
マルチラベル部分については知りませんが、マルチクラス分類では、これらのリンクが役立ちます
このリンクは、各カテゴリの精度とリコールを計算するために使用できる混同マトリックスの作成方法を説明しています
また、このリンクでは、分類器全体を評価するためのマイクロf1およびマクロf1メジャーの計算方法について説明しています。
それがあなたの役に立つことを願っています。
このリンクは私を助けてくれました。https://www.youtube.com/watch?v=HBi - P5j0Kec私はそれがあなたにも役立つことを願っています
以下のように分布を言う
A B C D
A 100 80 10 10
B 0 9 0 1
C 0 1 8 1
D 0 1 0 9
Aの精度は
P(A)= 100/100 + 0 + 0 +0 = 100
P(B)= 9/9 + 80 + 1 + 1 = 9/91 psst ...基本的にクラスの真のポジティブを取得し、行全体の列データで除算します
のリコールは
R(A)= 100 / 100+ 80 + 10 + 10 = 0.5
R(B)= 9 / 9+ 0 + 0 + 1 = 0.9
psst ...は本質的にクラスの真のポジティブを取り、列全体の行データで除算します
すべての値を取得したら、マクロ平均を取る
avg(P)= P(A)+ P(B)+ P(C)+ P(D)/ 4
avg(R)= R(A)+ R(B)+ R(C)+ R(D)/ 4
F1 = 2 * avg(P)* avg(R)/ avg(P)+ avg(R)
ハーバードのcs205.orgからこれらのスライドをチェックしてください。エラー測定のセクションに進むと、マルチクラス設定(たとえば、1対すべてまたは1対1)および混同マトリックスでの精度とリコールの説明があります。混同行列はここで本当に欲しいものです。
参考までに、Pythonソフトウェアパッケージscikits.learnには、マルチクラスデータでトレーニングされた分類器から混同行列などを自動的に計算する組み込みメソッドがあります。おそらく、あなたのために精密リコールプロットを直接計算することもできます。一見の価値があります。
Ozgur et al(2005)からは、通常の式に従ってPrecisionとRecallを計算する必要があることがわかりますが、データセット内の合計Nインスタンスを平均する代わりに、N = [に割り当てられている問題のクラス]。
ここに言及されている参照があります:http : //citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.104.8244&rep=rep1&type=pdf
セットを使用して、一般的な場合とまったく同じ方法で:
http://en.wikipedia.org/wiki/F1_score
http://en.wikipedia.org/wiki/Precision_and_recall
以下は、まさにそれを行う単純なPython関数です。
def precision(y_true, y_pred):
i = set(y_true).intersection(y_pred)
len1 = len(y_pred)
if len1 == 0:
return 0
else:
return len(i) / len1
def recall(y_true, y_pred):
i = set(y_true).intersection(y_pred)
return len(i) / len(y_true)
def f1(y_true, y_pred):
p = precision(y_true, y_pred)
r = recall(y_true, y_pred)
if p + r == 0:
return 0
else:
return 2 * (p * r) / (p + r)
if __name__ == '__main__':
print(f1(['A', 'B', 'C'], ['A', 'B']))