2016-06-23 78 views
1

我有一個二進制分類問題和數據不平衡我試圖計算宏/微F1。我認爲這可以使用Sickitlearn完成,但在檢查文檔here似乎是當分類是二元的,計算將只針對正類。因此,我正在試圖計算它的自我。 作爲開始,我計算TP,TN,FP,FN使用下面的函數:Macro和Micro 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 I需要分別計算用於每一類別的精確度和召回(我不知道怎麼做),然後,作爲一個例子,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 

參考可以發現here計算F1Macro &微

那麼,是否有計算這些度量的方法(TP/TN/FP/FN & precision & recall)? 任何幫助表示讚賞。

回答

2

你確實可以使用scikit-learn的例程。如果要針對二進制問題使用指定的平均值,請設置pos_label=None。但是,這些措施並不特別有用。二元或多類問題的微平均F1與普通的舊精度相同。宏觀平均召回率,也被稱爲平衡準確性,對於二元問題比宏觀平均F1更受歡迎,更有用。