2016-06-23 4 views
1

私はバイナリ分類の問題があり、データが不均衡なのでマクロ/マイクロF1を計算しようとしています。これはSickitlearnを使って行うことができますが、ドキュメントを確認した後にはhereと思われます。分類はバイナリですが、計算は陽性クラスのみになります。そのために私はそれを自分自身で計算しようとしています。 はスタートとして、私は次の関数を使用してTP、TN、FP、FNの計算:マクロとマイクロF1

def calculate(y_actual, y_pred): 
    TP = 0 
    FP = 0 
    TN = 0 
    FN = 0 

    for i in range(len(y_pred)): 
     if y_actual[i]==y_pred[i]==1: # true positive 
      TP += 1 
    for i in range(len(y_pred)): 
     if y_actual[i]==1 and y_pred[i]==0: 
      FN += 1 
    for i in range(len(y_pred)): 
     if y_actual[i]==y_pred[i]==0: # true negative 
      TN += 1 
    for i in range(len(y_pred)): 
     if y_actual[i]==0 and y_pred[i]==1: 
      FP += 1 

    return(TP, FP, TN, FN) 

だからミクロ/マクロF1を計算するために、私は(別途各クラスの精度と再現率を計算する必要があります!これは私が(私はそれを正しく理解している場合)方法がわからない)し、一例として、F1のマクロは、以下のように計算することができます。

F1 for class one: 2(precision*recall)/(precision+recall) 
F1 for class two: 2(precision*recall)/(precision+recall) 
F1 Macro = (F1 for class one + F1 for class two)/2 

参照がF1Macro &マイクロを計算するためhereを見つけることができます

したがって、上記の関数(計算)に別々に与えられた各クラスについて、これらの尺度(TP/TN/FP/FN &精度、&リコール)を計算する方法はありますか? 助けていただければ幸いです。

答えて

2

あなたは本当にscikit-learnのルーチンを使うことができます。バイナリ問題に対して指定された平均値を使用する場合は、pos_label=Noneを設定します。しかしながら、これらの尺度は特に有用ではない。バイナリまたはマルチクラス問題のマイクロ平均F1は、単純な古い精度と同じです。 平衡精度とも呼ばれるマクロ平均リコールは、バイナリ問題のマクロ平均F1よりも一般的で便利です。

関連する問題