マルチクラス分類器の品質を判断する方法


30

与えられた

  • インスタンスを持つデータセットはと一緒にすべてのインスタンスクラス 1つのクラスに正確に属しバツ私Nバツ私y私
  • マルチクラス分類器

トレーニングとテストの後、基本的に、テストセット内のすべてのインスタンスについて、真のクラスと予測クラスを含むテーブルを作成しました。したがって、すべてのインスタンスについて、一致()またはミス()があります。y私a私バツ私y私=a私y私≠a私

試合の質をどのように評価できますか?問題は、いくつかのクラスが多くのメンバーを持つことができる、つまり多くのインスタンスがそれに属するということです。すべてのデータポイントの50%が1つのクラスに属し、最終的な分類子が全体で50%正しい場合、明らかに何も得られません。入力が何であれ、その最大クラスを出力する単純な分類器を作成することもできました。

各クラスの既知のテストセットの一致とヒットの結果に基づいて分類子の品質を推定する標準的な方法はありますか?特定のクラスごとに一致率を区別することも重要かもしれません。

私が考えることができる最も単純なアプローチは、最大クラスの正しい一致を除外することです。ほかに何か?


質問を正しく理解しているかどうかわかりません。混同マトリックスと派生メジャーを知っていますか?これはあなたの質問に対する答えですか?それとも、もっと複雑なものを参照していますか?
— ステフェン

これが私の混乱の原因だと思います:最初の段落で、..ここでyiは実際のクラスであり、...:インスタンスは複数のクラスに属することができる/複数のクラスを持つことができるということですか?または、すべての属している/クラスが1つだけですか?明確にしていただけますか?x iバツ私バツ私
— ステフェン

@steffen:混同マトリックスを見てきました。私の特定のケースでは、4つのクラスがあります。したがって、どの派生メジャーを使用できるかわからないので、意味があります。各は1つのクラスにのみ属します。ただし、全体で2つ以上の可能なクラスがあります。 I ∈ [ 1 、⋯ 、N ]バツ私i∈[1,⋯,N]
— ジェレヌク

@steffenこれらの派生メジャーは主にバイナリ分類に適用されますが、この質問は明示的に3つ以上のクラスを扱っています。そのためには、「真のポジティブ」などの用語を理解し直す必要があります。
— マイケルマク

@MichaelMcGowan OPに説明を求め、その後、編集前に明らかではなかったマルチクラスの問題を明示的に反映するために編集を実行しました(IMHO)。
— ステフェン

回答:


16

バイナリ分類と同様に、経験的エラー率を使用して分類器の品質を推定できます。ましょう分類器、およびこととそれぞれ自分のデータベースとそのクラスの例であること。 あなたが言ったように、クラスがアンバランスな場合、ベースラインは50%が、より大きなクラスの割合。各クラスに重みを追加して、エラーのバランスを取ることができます。してみましょうクラスの重量と。その結果、重み設定と定義加重経験的エラーx i y i e r r (g )= 1gバツ私y私W、Y、Y1

err(g)=1n∑私≤n1g(バツ私)≠y私
WyyERRW(G)=11Wy〜1n∑私≤n1y私=y
errW(g)=1n∑私≤nWy私1g(バツ私)≠y私

Steffenが言ったように、混同行列は分類器の品質を推定する良い方法です。バイナリの場合、感度や特異性など、このマトリックスから何らかの指標を導き出し、特定のクラスを検出する分類器の機能を推定できます。分類器のエラーの原因は特定の方法である可能性があります。たとえば、分類子は1を予測するときは自信が強すぎますが、0を予測するときは決して間違って言うことはできません。多くの分類子はこのレートを制御するためにパラメーター化できます(誤検知対誤検知)。 1つだけではなく、分類子のファミリー全体。これからROC曲線をプロットし、ROC曲線の下の領域を測定することで、これらの分類器の品質を確認できます。

ROC曲線は、マルチクラスの問題に合わせて拡張できます。このスレッドの答えを読むことをお勧めします。


1
経験的誤差と同じスケールになるために、加重経験的誤差をクラスの数で割る必要はありませんか?それ以外の場合は...はるかに大きいだろう
— PhilippPro

17

多方向テキスト分類システムを評価するために、マイクロ平均およびマクロ平均F1(Fメジャー)を使用します。Fメジャーは、本質的に精度とそれを思い出すことの重み付けされた組み合わせです。バイナリ分類の場合、ミクロとマクロのアプローチは同じですが、マルチウェイの場合は、それらが役立つと思います。Micro F1は、すべてのドキュメントに等しい重みを与え、マクロF1はすべてのクラスに等しい重みを与える、精度とリコールの重み付き組み合わせと考えることができます。それぞれについて、Fメジャーの式は同じですが、精度を計算して呼び出し方が異なります。

F=(β2+1)PRβ2P+R、

通常、は1に設定されます。その後、β

Pm私cro=∑私=1|C|TP私∑私=1|C|TP私+FP私、Rm私cro=∑私=1|C|TP私∑私=1|C|TP私+FN私

Pmacro=1|C|∑私=1|C|TP私TP私+FP私、Rmacro=1|C|∑私=1|C|TP私TP私+FN私

ここで、は真陽性、は偽陽性、は偽陰性、はクラスです。TPFPFNC


1
# Function in R, using precision, recall and F statistics

check.model.accuracy <- function(predicted.class, actual.class){

  result.tbl <- as.data.frame(table(predicted.class,actual.class ) ) 

  result.tbl$Var1 <- as.character(result.tbl$predicted.class)
  result.tbl$Var2 <- as.character(result.tbl$actual.class)

  colnames(result.tbl)[1:2] <- c("Pred","Act")

  cntr <- 0  
  for (pred.class in unique(result.tbl$Pred) ){
    cntr <- cntr+ 1
    tp <- sum(result.tbl[result.tbl$Pred==pred.class & result.tbl$Act==pred.class, "Freq"])
    tp.fp <- sum(result.tbl[result.tbl$Pred == pred.class , "Freq" ])
    tp.fn <- sum(result.tbl[result.tbl$Act == pred.class , "Freq" ])
    presi <- tp/tp.fp 
    rec <- tp/tp.fn
    F.score <- 2*presi*rec/(presi+rec)
    if (cntr == 1 ) F.score.row <- cbind(pred.class, presi,rec,F.score)
    if (cntr > 1 ) F.score.row <- rbind(F.score.row,cbind(pred.class,presi,rec,F.score))
  }

  F.score.row <- as.data.frame(F.score.row) 
  return(F.score.row)
}

check.model.accuracy(predicted.df,actual.df) 
# For multiclass, average across all classes 

5
これを説明するためにテキストを追加できますか?
— GUNG -復活モニカ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.