zoukankan      html  css  js  c++  java
  • 关于NLP多分类任务评价指标的总结

    0、概述

    点击这里查看sklearn官方文档

    sklearn.metrics模块实现了几个损失、得分和效用函数来衡量分类性能;

    关于数据集:

    为了训练分类模型,一般需要准备三个数据集:训练集train.txt、验证集dev.txt、测试集test.txt。

    • 训练集:用来训练模型参数的数据集,模型直接根据训练集来调整自身参数以获得更好的分类效果。
    • 验证集:又称开发集,用于在训练过程中检验模型的状态,收敛情况。验证集通常用于调整超参数,根据几组模型验证集上的表现决定哪组超参数拥有最好的性能。
    • 测试集:用来计算模型的各项评估指标,验证模型泛化能力。

    Tips:测试集的数据一般不在训练集中,从而用来验证模型的效果。

    1、四个基本概念

    TP、True Positive   真阳性:预测为正,实际为正

    FP、False Positive  假阳性:预测为正,实际为负

    FN、False Negative 假阴性:预测为负、实际为正

    TN、True Negative 真阴性:预测为负、实际为负

    2、二分类指标

    分类模型的评价指标通常有 Accuracy、Precision、Recall 和 F1,以上指标越高,则说明模型比较理想。

    • 准确率 Accuracy = 正确分类的样本数 / 总样本数。
    • 精确率 Precision = 预测为正类并且正确的样本数 / 预测为正类的样本数。
    • 召回率 Recall = 预测为正类并且正确的样本数 / 标注为正类的样本数。
    • 综合评价指标 F1:2(Precision + Recall) / (Precision*Recall),Precision 和 Recall 加权调和平均

    Tips:在样本不均衡的情况下,准确率 Accuracy 这个评价指标有很大的缺陷。比如说1万封邮件里有10封垃圾邮件(千分之一的概率是垃圾邮件),如果模型将所有邮件判为非垃圾邮件,那acc有99%以上,但实际上该模型是没意义的。这种情况下就需要使用Precision、Recall、F1作为评价指标。

    3、多分类指标

    在多分类情况下,则用宏平均(Macro-averaging)和微平均(Micro-averaging)的方法,宏平均是指先计算每一类的各项评估指标,然后再对指标求算术平均值;微平均是指先对混淆矩阵的元素进行平均,得到TP,FP,TN,FN的平均值,然后再计算各项评估指标。

    ....

    F1-score:

    是统计学中用来衡量二分类模型精确度的一种指标,用于测量不均衡数据的精度。它同时兼顾了分类模型的精确率和召回率。F1-score可以看作是模型精确率和召回率的一种加权平均,它的最大值是1,最小值是0。

    在多分类问题中,如果要计算模型的F1-score,则有两种计算方式,分别为micro-F1和macro-F1,这两种计算方式在二分类中与F1-score的计算方式一样,所以在二分类问题中,计算micro-F1=macro-F1=F1-score,micro-F1和macro-F1都是多分类F1-score的两种计算方式;

    micro-F1:

    • 计算方法:先计算所有类别的总的Precision和Recall,然后计算出来的F1值即为micro-F1;
    • 取值范围:(0, 1);
    • 适用环境:在计算公式中考虑到了每个类别的数量,多分类不平衡,若数据极度不平衡会影响结果;

    marco-F1:

    • 计算方法:将所有类别的Precision和Recall求平均,然后计算F1值作为macro-F1;
    • 取值范围:(0, 1);
    • 适用环境:多分类问题,没有考虑到数据的数量,所以会平等的看待每一类,不受数据不平衡影响,容易受到识别性高(高recall、高precision)的类别影响;
    #指标测试
    from sklearn import metrics
    from sklearn.metrics import accuracy_score, precision_score, recall_score
    from sklearn.metrics import f1_score
    def Evaluate1(y_test,y_predic):
        print('accuracy:', metrics.accuracy_score(y_test, y_predict)) #预测准确率输出
        print('macro_precision:',metrics.precision_score(y_test,y_predict,average='macro')) #预测宏平均精确率输出
        print('micro_precision:', metrics.precision_score(y_test, y_predict, average='micro')) #预测微平均精确率输出
        # print('weighted_precision:', metrics.precision_score(y_test, y_predict, average='weighted')) #预测加权平均精确率输出
        print('macro_recall:',metrics.recall_score(y_test,y_predict,average='macro'))#预测宏平均召回率输出
        print('micro_recall:',metrics.recall_score(y_test,y_predict,average='micro'))#预测微平均召回率输出
        # print('weighted_recall:',metrics.recall_score(y_test,y_predict,average='weighted'))#预测加权平均召回率输出
        print('macro_f1:',metrics.f1_score(y_test,y_predict,labels=[0,1,2,3,4,5,6],average='macro'))#预测宏平均f1-score输出
        print('micro_f1:',metrics.f1_score(y_test,y_predict,labels=[0,1,2,3,4,5,6,7],average='micro'))#预测微平均f1-score输出
        # print('weighted_f1:',metrics.f1_score(y_test,y_predict,labels=[0,1,2,3,4,5,6],average='weighted'))#预测加权平均f1-score输出
        #target_names = ['class 1', 'class 2', 'class 3','class 4','class 5','class 6','class 7']
        # print('混淆矩阵输出:
    ',metrics.confusion_matrix(y_test,y_predict,labels=[0,1,2,3,4,5,6]))#混淆矩阵输出 #比如[1,3]为2,即1类预测为3类的个数为2
        # print('分类报告:
    ', metrics.classification_report(y_test, y_predict,labels=[0,1,2,3,4,5,6]))#分类报告输出 ,target_names=target_names
    def Evaluate2(y_true,y_pred):
        print("accuracy:", accuracy_score(y_true, y_pred))  # Return the number of correctly classified samples
        print("macro_precision", precision_score(y_true, y_pred, average='macro'))
        print("micro_precision", precision_score(y_true, y_pred, average='micro'))
        # Calculate recall score
        print("macro_recall", recall_score(y_true, y_pred, average='macro'))
        print("micro_recall", recall_score(y_true, y_pred, average='micro'))
        # Calculate f1 score
        print("macro_f", f1_score(y_true, y_pred, average='macro'))
        print("micro_f", f1_score(y_true, y_pred, average='micro'))
    
    y_test    = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4,5,5,6,6,6,0,0,0,0]
    y_predict = [1, 1, 1, 3, 3, 2, 2, 3, 3, 3, 4, 3, 4, 3,5,1,3,6,6,1,1,0,6]
    Evaluate1(y_test,y_predict)
    Evaluate2(y_test,y_predict)
    
    ##其中列表左边的一列为分类的标签名,右边support列为每个标签的出现次数.avg / total行为各列的均值(support列为总和).
    ##precision recall f1-score三列分别为各个类别的精确度/召回率及 F1值
    '''
    accuracy: 0.5217391304347826
    macro_precision: 0.7023809523809524
    micro_precision: 0.5217391304347826
    macro_recall: 0.5261904761904762
    micro_recall: 0.5217391304347826
    macro_f1: 0.5441558441558441
    micro_f1: 0.5217391304347826
    
    accuracy: 0.5217391304347826
    macro_precision 0.7023809523809524
    micro_precision 0.5217391304347826
    macro_recall 0.5261904761904762
    micro_recall 0.5217391304347826
    macro_f 0.5441558441558441
    micro_f 0.5217391304347826
    '''


    参考:

    https://blog.csdn.net/lyb3b3b/article/details/84819931

    https://blog.csdn.net/qq_43190189/article/details/105778058

    https://aistudio.baidu.com/aistudio/projectdetail/926957

  • 相关阅读:
    1767:字符合并
    成绩单
    floj 2264
    floj 2265 【lxs Contest #141】航海舰队
    CF932D Tree
    1745:分组
    1744:跳台阶
    Xamarin.Forms之跨平台性能
    Xamarin.Forms之部署和测试(性能)
    Xamarin.Forms数据绑定
  • 原文地址:https://www.cnblogs.com/xuechengmeigui/p/13657545.html
Copyright © 2011-2022 走看看