2016-06-23 55 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更受欢迎,更有用。