栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

第五章 准确率、精确率与混淆矩阵

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第五章 准确率、精确率与混淆矩阵

目录

5.1 准确率(Accuracy)与精确率(Precision)概念

5.2 Python代码实现准确率的计算

5.3 混淆矩阵

5.3.1 混淆矩阵举例

5.3.2 Python代码实现混淆矩阵的计算


5.1 准确率(Accuracy)与精确率(Precision)概念

        有关介绍的网站:https://en.wikipedia.org/wiki/Accuracy_and_precision(注:下面的一些图片转载自该网站,并非原创)。

        准确率和精确率是观测误差的两个衡量标准。 准确率是一组给定的预测值与其真实值的接近或远离程度,而精确率是预测值彼此之间的接近或分散程度。准确率的计算公式如图1所示。

 ​

图1 准确率计算公式

  图2 准确率和精确率

 图3 根据 ISO 5725-1,准确度包括准确率(测量结果与真实值的接近程度)和精确率(测量的可重复性或再现性)

图4 由于精确率低导致准确率低 

 ​

图5 即使精确率高准确率也低

5.2 Python代码实现准确率的计算
def calculate_the_accuracy(actual_data,predicted_data):
    """
    该函数用于计算模型预测的准确率
    Parameters
    ----------
    actual_data: 一纬列表
        真实数据.
    predicted_data: 一维列表
        预测数据.

    Returns
    -------
    TYPE
        准确率.

    """
    # 定义一个变量用于后续统计真实数据等于预测数据的个数
    correct_num = 0
    # 循环遍历每一个真实数据与预测数据
    for i in range(len(actual_data)):
        # 判断真实数据与预测数据是否相等
        if actual_data[i] == predicted_data[i]:
            # 如果相等,计数器则加一
            correct_num += 1
    # 返回模型预测的准确率
    return correct_num/float(len(actual_data))*100
    
# 主函数
if '__main__' == __name__:
    # 定义一组真实数据
    actual_data =    [0,1,1,0,1,0,1,1,0,1]
    # 定义一组预测数据
    predicted_data = [1,0,1,0,1,0,1,0,0,1]
    # 调用calculate_the_accuracy函数计算模型预测的准确率
    accuracy = calculate_the_accuracy(actual_data, predicted_data)

5.3 混淆矩阵

        有关介绍的网站:https://en.wikipedia.org/wiki/Confusion_matrix(注:下面的一些图片转载自该网站,并非原创)。

        在机器学习领域,特别是统计分类问题中,混淆矩阵,也称为误差矩阵,[9]是一种特定的表格布局,可以可视化算法的性能,通常用于监督学习算法(在无监督学习中通常称为匹配矩阵)。矩阵的每一行代表实际值,而每一列代表预测值,反之亦然。[10]这个名称的来源是因为它可以很容易地看出系统是否混淆了两个类。

5.3.1 混淆矩阵举例

        给定一个包含 12 个个体的样本,其中 8 个被诊断患有癌症,4 个未患癌症,其中癌症个体属于 1 类(阳性),非癌症个体属于 0 类(阴性),我们可以显示数据如下:  

​ 

      图6 举例1

        假设我们有一个分类器以某种方式区分患有癌症和未患癌症的个体,我们可以将这 12 个个体通过分类器运行。然后分类器做出 9 次准确的预测并遗漏了 3 次:2 个患有癌症的人被错误地预测为没有癌症(样本 1 和 2),以及 1 个没有癌症的人被错误地预测为患有癌症(样本 9)。

图7 举例2

        请注意,如果我们将实际分类集与预测分类集进行比较,则有 4 种不同的结果。

        一、如果实际分类为正,而预测分类为正(1,1),这称为真正结果(Ture Positive,TP),因为正样本被分类器正确识别。

        二、如果实际分类为正,而预测分类为负(1,0),这称为假负结果(False Negative,FN),因为正样本被分类器错误地识别为负。

        三,如果实际分类为负,而预测分类为正(0,1),这称为假正结果(False Positive,FP),因为负样本被分类器错误地识别为正。

        四,如果实际分类为负,而预测分类为负(0,0),这称为真负结果(Ture Negative,TN),因为负样本被分类器正确识别。

        然后,我们可以在实际分类和预测分类之间进行比较,并将此信息添加到表格中,使正确的结果显示为绿色,以便更容易识别。

图8 举例3

        任何二元混淆矩阵的模板都使用上面讨论的四种结果(真阳性、假阴性、假阳性和真阴性)以及阳性和阴性分类。这四个结果可以用 2×2混淆矩阵表示,如下所示:

图9 混淆矩阵

        选择上述三个数据表的颜色约定以匹配此混淆矩阵,以便轻松区分数据。

        现在,我们可以简单地汇总每种类型的结果,代入模板,并创建一个混淆矩阵,该矩阵将简明扼要地总结测试分类器的结果:

图10 举例10

        在这个混淆矩阵中,8个有癌症的样本中,系统判断2个没有癌症,4个没有癌症的样本,它预测1个确实有癌症。所有正确的预测都位于表格的对角线(以绿色突出显示),因此很容易直观地检查表格中的预测错误,因为对角线之外的值将区分它们。通过将混淆矩阵的2行相加,还可以推导出原始数据集中正(P)和负(N)样本的总数,即TP+FN=P和 FP+TN=N.

        在预测分析中混淆矩阵是一个包含两行两列的表格,用于显示真阳性假阴性假阳性真阴性的数量。这不是简单地观察正确分类的比例(准确率)。如果数据集不平衡,准确率会产生误导性结果;也就是说,当不同类别的观察数量差异很大时。

        例如,如果数据中有 95 个癌症样本和只有 5 个非癌症样本,则特定分类器可能会将所有观察结果分类为患有癌症。总体准确度为 95%,但更详细地说,分类器对癌症类别的识别率(灵敏度)为 100%,但对非癌症类别的识别率为 0%。在这种情况下, F1 分数甚至更不可靠。

        根据 Davide Chicco 和 Giuseppe Jurman 的说法,评估混淆矩阵的信息量最大的指标是Matthews 相关系数 (MCC)。

        其他指标可以包含在混淆矩阵中,每个指标都有其意义和用途。 ​

图11 混淆矩阵具体指标

图12 混淆矩阵具体指标英文

5.3.2 Python代码实现混淆矩阵的计算
def confusion_matrix(actual_data,predicted_data):
    """
    该函数用于计算混淆矩阵
    Parameters
    ----------
    actual_data: 一纬列表
        真实数据.
    predicted_data: 一纬列表
        预测数据.

    Returns
    -------
    unique_class : 一纬列表
        记录类别标签.
    matrix : 二维列表
        混淆矩阵.

    """
    # 定义一个变量来存储类别标签(通过集合剔除重复值)
    unique_class = set(actual_data)
    matrix = [list() for x in range(len(unique_class))]
    for i in range(len(unique_class)):
        matrix[i] = [0 for x in range(len(unique_class))]
    # 创建一个空字典用于后续给标签记录上索引
    indexing_our_class = dict()
    # 遍历类别标签,将类别作为key,索引作为value
    for i,class_value in enumerate(unique_class):
        indexing_our_class[class_value] = i
    # 根据类别去找到对应的索引作为行列号,然后遍历,在相应的位置上累加
    for i in range(len(actual_data)):
        col = indexing_our_class[actual_data[i]]
        row = indexing_our_class[predicted_data[i]]
        matrix[row][col] += 1
    return unique_class,matrix

def perfect_confusion_matrix(unique_class,matrix):
    """
    该函数用于优化混淆矩阵(主要是打印,添加相应的表头)
    Parameters
    ----------
    unique_class : 一维列表
        记录类别标签.
    matrix : 二维列表
        混淆矩阵.

    Returns
    -------
    None.

    """
    print("(Actual)"+" ".join(str(x) for x in unique_class))
    print("(Predicted)------------------------------------")
    for i,x in enumerate(unique_class):
        print("{} |     {}".format(x,"  ".join(str(x) for x in matrix[i])))
        
    

# 主函数
if '__main__' == __name__:
    # 定义一组真实数据
    actual_data =    ["狗","猫","狗","狗","猫","猫","狗","狗","猫","猫"]
    # 定义一组预测数据
    predicted_data = ["猫","猫","狗","狗","猫","猫","狗","狗","猫","猫"]
    # 调用confusion_matrix函数计算混淆矩阵
    unique_class,matrix = confusion_matrix(actual_data, predicted_data)
    perfect_confusion_matrix(unique_class,matrix) 

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号