我有一个二分类问题,由于数据不平衡,我尝试计算Macro/Micro F1。我以为可以使用Sickitlearn来实现,但在查看了这里的文档后,发现当分类是二元时,计算只会针对正类进行。因此,我尝试自己计算。首先,我使用以下函数计算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: # 真阳性 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: # 真阴性 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,我需要分别计算每个类的精确度和召回率(我不知道如何做!),然后,例如,Macro F1可以按如下方式计算(如果我理解正确的话):
类一的F1: 2(精确度*召回率)/(精确度+召回率)类二的F1: 2(精确度*召回率)/(精确度+召回率)Macro F1 = (类一的F1 + 类二的F1)/2
关于计算Macro和Micro F1的参考资料可以在这里找到
那么,基于上述函数(calculate),是否有方法分别计算每个类的这些指标(TP/TN/FP/FN & 精确度 & 召回率)?任何帮助都将不胜感激。
回答:
你确实可以使用scikit-learn的例程。如果你想在二分类问题上使用指定的平均值,可以设置pos_label=None
。然而,这些度量并不是特别有用。对于二分类或多分类问题,Micro平均F1与普通的准确率相同。Macro平均召回率,也称为平衡准确率,在二分类问题中比Macro平均F1更受欢迎且更有用。