• 理解metrics.classification_report


    混淆矩阵是一个矩阵,类别个数可以有多个,a[i][j]表示将类别i的样本误判为类别j的个数。

    classification_report用来分析不同类别的准确率,召回率,F1值等,从而便于按照类别查看准确率、召回率。

    总体的正确率跟classification_report中的正确率是不一样。

    
    import numpy as np
    import sklearn.metrics as metrics
    
    
    def report(mine, real):
        if len(mine) != len(real):
            print("mine和real长度不一样")
            exit(0)
        all_classes = set(list(mine) + list(real))
        precision = dict()
        recall = dict()
        f1 = dict()
        support = dict()
        for c in all_classes:
            if np.count_nonzero(mine == c):
                precision[c] = np.count_nonzero(np.logical_and(mine == real, real == c)) / np.count_nonzero(mine == c)
            else:
                precision[c] = 0
            if np.count_nonzero(real == c):
                recall[c] = np.count_nonzero(np.logical_and(mine == real, real == c)) / np.count_nonzero(real == c)
            else:
                recall[c] = 0
            if precision[c] and recall[c]:
                f1[c] = 2 / (1 / precision[c] + 1 / recall[c])
            else:
                f1[c] = 0
            support[c] = np.count_nonzero(real_ans == c)
        s = ''
        s += "%10s%10s%10s%10s%10s
    " % ("class", "precision", "recall", "f1", "support")
        fmtstr2 = "%10s%10.2f%10.2f%10.2f%10d
    "
        for c in all_classes:
            s += (fmtstr2 % (c, precision[c], recall[c], f1[c], support[c]))
        s += fmtstr2 % ("avg",
                        np.sum([precision[c] * support[c] for c in all_classes]) / len(mine),
                        np.sum([recall[c] * support[c] for c in all_classes]) / len(mine),
                        np.sum([f1[c] * support[c] for c in all_classes]) / len(mine),
                        len(mine)
                        )
        return s
    
    
    my_ans = np.random.randint(0, 2, 10)
    real_ans = np.random.randint(0, 2, 10)
    print(my_ans)
    print(real_ans)
    print("分类报告是按照类别分开的")
    print('=' * 10)
    print(metrics.classification_report(real_ans, my_ans))
    print('=' * 10)
    print(report(my_ans, real_ans))
    print("准确率跟上面的正确率不一样")
    print(metrics.accuracy_score(real_ans, my_ans))
    print(np.count_nonzero(my_ans == real_ans) / len(my_ans))
    
    
  • 相关阅读:
    Hsl PLC
    .NET平台常用框架整理
    SSH全注解实例详解
    word2vec (CBOW、分层softmax、负采样)
    pandas dataframe 一行变多行 (query pv统计term pv)
    python 按二维数组的某行或列排序 (numpy lexsort)
    基于决策树的分类算法
    【linux】 mail/mutt 发送邮件
    【python】含中文字符串截断
    【python】 判断纯ascii串
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/8506389.html
Copyright © 2020-2023  润新知