宏观和微型F1

时间:2016-06-23 05:28:53

标签: python-2.7 machine-learning scikit-learn

我有一个二进制分类问题,因为数据是不平衡的,我正在尝试计算宏/微F1 ..我认为这可以使用Sickitlearn完成,但在检查文档here后,似乎分类是二元的,计算只适用于正类。因此,我试图计算它是我的自我。 首先,我使用以下函数计算TP,TN,FP,FN:

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)

因此,为了计算Micro / Macro 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 

可以找到here用于计算F1Macro& Micro

的参考

那么,有没有办法在给定上述函数(计算)的情况下分别为每个类计算这些度量(TP / TN / FP / FN&精度和召回)? 任何帮助表示感谢。

1 个答案:

答案 0 :(得分:2)

你确实可以使用scikit-learn的例程。如果要对二进制问题使用指定的平均值,请设置pos_label=None。但是,这些措施并不是特别有用。对于二元或多类问题的微平均F1与普通的旧准确度相同。宏观平均召回,也称为平衡准确度,对于二元问题而言比宏观平均F1更受欢迎且更有用。