机器学习——使用sklearn的F1_Score,进行多分类的单项F1评分

最近学习NLP,老师给了一个任务,slot tagging,然后使用F1评分,并且需要得到每一个tagging的评分用于展示。

一共有6种分类:

from sklearn.metrics import f1_score
def my_f1_score(y_pred, target, label2idx):
    
    pred = np.array(y_pred)
    truth = np.array(target)
    
    f1_total = f1_score(pred , truth , average='micro')
    
    T_f1 = f1_score(pred[truth==label2idx['T']], truth[truth==label2idx['T']], average='micro')
    O_f1 = f1_score(pred[truth==label2idx['O']], truth[truth==label2idx['O']], average='micro')
    C_f1 = f1_score(pred[truth==label2idx['C']], truth[truth==label2idx['C']], average='micro')
    
    
    return f1_total, T_f1, C_f1, O_f1

上述方法,会根据设置的tagging进行计算F1,分别计算出每个tagging的数据。

import numpy as np

label2idx = {'O': 0, 'T': 1, 'C': 2, 'D': 3}

truth = np.array([2, 2, 1, 3, 2])
pred =  np.array([1, 2, 1, 3, 5])


print(truth==label2idx['C'])
print(truth[truth==label2idx['C']])
print(pred[truth==label2idx['C']])

对应的输出:

[ True  True False False  True]
[2 2 2]
[1 2 5]

如上所示,假如我们需要仅计算tagging为C的分数,就需要找出真实值为C的,组成一个新的数组。
然后在pred中,找到本该为C的位置的值,组成新的数组。
然后把两个新数组交给sklearn进行计算。

PS: f1_score方法中的average,可以设置为[None, ‘micro’, ‘macro’, 'samples, ‘weighted’, ‘binary’], 默认是binary。

在此记录一下,方便后续学习。


版权声明:本文为qq_31851531原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。