图像领域评价效果的常用5大指标

1.漏警率(Miss Rate):

解释:漏警率是指实际为某类别的样本中被错误识别为其他类别的比例。换句话说,就是模型未能正确识别出属于该类别的样本的比例。(该识未识)
示例:如果有100个真正的坦克,但模型个识别出80个,还有20个被误认为不是坦克,那么漏警率就是20%。
其中,FN是“假阴性”(未能正确识别的正类),TP是“真阳性”(正确识别的正类)。

2.虚警率(False Alarm Rate):

解释:虚警率是指模型将其他类别误识别为某一特定类别的比例。也就是说,模型错误地将不属于某类别的样本判定为该类别的比例。(虚惊一场)
示例:如果模型识别到100个坦克,其中有20个是误判的其他种类(比如装甲车、方舱车等),那么这20%的比例就是虚警率。
其中,FP是“假阳性”(误判为正类),TN是“真阴性”(正确识别的负类)。

3.准确率/正确率(Accuracy):

解释:准确率是指模型在所有预测中做出正确判断的比例。它是衡量模型整体性能的重要指标。(对了几次)
示例:如果在200次预测中,模型正确识别了180次,那么准确率就是90%。
在这里插入图片描述

4.精确率/查准率(Precision):

解释:精确率是指模型预测为某一类别的样本中,真正属于该类别的比例。(他是他,准不准)
示例:如果模型预测了100个坦克,其中80个是正确的(实际是坦克),20个是错误的(其实是其他种类),那么精确率就是80%。
在这里插入图片描述

5.召回率(Recall):

解释:召回率是指实际为某一类别的样本中,模型能正确识别出来的比例。它用来衡量模型的“敏感性”或“覆盖率”。
示例:如果实际有100个坦克,而模型个识别出80个,剩下的20个被错过了,那么召回率就是80%。
在这里插入图片描述

总结:

1.精确率高,意味着模型的预测结果很“准”,误报少,但可能有漏报。
2.召回率高,意味着模型很“全”,识别的覆盖范围广,但可能误报多。
3.漏警率反映模型漏掉了多少目标,虚警率则表示模型错判了多少非目标为目标。
4.准确率是衡量模型总体表现的指标。
5.每个指标都有其适用的场景和意义,通常需要综合考虑这些指标来评估模型的性能。

多分类问题举例说明

混淆矩阵
具体计算过程

上述图片代码

"""
作者: stark
日期: 20241101"""
import matplotlib.pyplot as plt
import numpy as np

# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用SimHei字体显示中文
plt.rcParams['axes.unicode_minus'] = False  # 解决坐标轴负号显示问题

# 混淆矩阵数据
confusion_matrix = np.array([[30, 5, 2, 3],  # 实际为A的识别结果
                             [2, 25, 3, 0],  # 实际为B的识别结果
                             [1, 0, 28, 1],  # 实际为C的识别结果
                             [0, 1, 1, 27]])  # 实际为D的识别结果

# 目标类型
categories = ['目标A', '目标B', '目标C', '目标D']

# 创建混淆矩阵窗口
confusion_fig, ax = plt.subplots(figsize=(10, 8))
cax = ax.matshow(confusion_matrix, cmap='Blues')
plt.colorbar(cax)

# 设置标签
ax.set_xticks(np.arange(len(categories)))
ax.set_yticks(np.arange(len(categories)))
ax.set_xticklabels(categories)
ax.set_yticklabels(categories)

# 在每个单元格中显示数值
for (i, j), val in np.ndenumerate(confusion_matrix):
    ax.text(j, i, f'{val}', ha='center', va='center', color='black')

# 标题和标签
ax.set_title('混淆矩阵', fontsize=16)
ax.set_xlabel('识别类别', fontsize=14)
ax.set_ylabel('实际类别', fontsize=14)

# 创建新的窗口显示结果
result_fig, result_ax = plt.subplots(figsize=(12, 8))
result_text = ''

# 计算各类别的真实值总和
A_total = confusion_matrix[0, :].sum()
B_total = confusion_matrix[1, :].sum()
C_total = confusion_matrix[2, :].sum()
D_total = confusion_matrix[3, :].sum()

# 定义各个类别的真阳性
TP_A = confusion_matrix[0, 0]  # 目标A的真阳性
TP_B = confusion_matrix[1, 1]  # 目标B的真阳性
TP_C = confusion_matrix[2, 2]  # 目标C的真阳性
TP_D = confusion_matrix[3, 3]  # 目标D的真阳性

# 计算总的TP
TP = TP_A + TP_B + TP_C + TP_D  # 主对角线之和

# 计算总样本数
total_samples = confusion_matrix.sum()

# 为每个类别生成详细计算过程
for i in range(len(categories)):
    actual_positive = confusion_matrix[i, i]  # 真阳性
    total_predictions = confusion_matrix[:, i].sum()  # 识别为该类别的总数
    total_actual = confusion_matrix[i, :].sum()  # 实际为该类别的总数

    # 计算假阳性和假阴性
    FP = total_predictions - actual_positive  # 假阳性
    FN = total_actual - actual_positive  # 假阴性

    # 计算漏警率和显示详细计算过程
    if i == 0:  # 目标A
        miss_count = A_total - TP_A  # 分子为 A 的总数减去 TP_A
        miss_rate = miss_count / A_total if A_total != 0 else 0
        result_text += (
            f'\n{categories[i]}:\n  漏警率 (Miss Rate) = ({confusion_matrix[0, 1]} + {confusion_matrix[0, 2]} + {confusion_matrix[0, 3]}) / '
            f'({confusion_matrix[0, 0]} + {confusion_matrix[0, 1]} + {confusion_matrix[0, 2]} + {confusion_matrix[0, 3]}) = {miss_rate:.2f}\n'
        )

        false_alarm_count = FP
        false_alarm_rate = false_alarm_count / (B_total + C_total + D_total) if (B_total + C_total + D_total) != 0 else 0
        result_text += (
            f'  虚警率 (False Alarm Rate) = ({confusion_matrix[1, 0]} + {confusion_matrix[2, 0]} + {confusion_matrix[3, 0]}) / '
            f'({confusion_matrix[1, 0]} + {confusion_matrix[1, 1]} + {confusion_matrix[1, 2]} + {confusion_matrix[1, 3]} '
            f'+ {confusion_matrix[2, 0]} + {confusion_matrix[2, 1]} + {confusion_matrix[2, 2]} + {confusion_matrix[2, 3]} '
            f'+ {confusion_matrix[3, 0]} + {confusion_matrix[3, 1]} + {confusion_matrix[3, 2]} + {confusion_matrix[3, 3]}) = {false_alarm_rate:.2f}\n'
        )

    elif i == 1:  # 目标B
        miss_count = B_total - TP_B
        miss_rate = miss_count / B_total if B_total != 0 else 0
        result_text += (
            f'\n{categories[i]}:\n  漏警率 (Miss Rate) = ({confusion_matrix[1, 0]} + {confusion_matrix[1, 2]} + {confusion_matrix[1, 3]}) / '
            f'({confusion_matrix[1, 0]} + {confusion_matrix[1, 1]} + {confusion_matrix[1, 2]} + {confusion_matrix[1, 3]}) = {miss_rate:.2f}\n'
        )

        false_alarm_count = FP
        false_alarm_rate = false_alarm_count / (A_total + C_total + D_total) if (A_total + C_total + D_total) != 0 else 0
        result_text += (
            f'  虚警率 (False Alarm Rate) = ({confusion_matrix[0, 1]} + {confusion_matrix[2, 1]} + {confusion_matrix[3, 1]}) / '
            f'({confusion_matrix[0, 0]} + {confusion_matrix[0, 1]} + {confusion_matrix[0, 2]} + {confusion_matrix[0, 3]} '
            f'+ {confusion_matrix[2, 0]} + {confusion_matrix[2, 1]} + {confusion_matrix[2, 2]} + {confusion_matrix[2, 3]} '
            f'+ {confusion_matrix[3, 0]} + {confusion_matrix[3, 1]} + {confusion_matrix[3, 2]} + {confusion_matrix[3, 3]}) = {false_alarm_rate:.2f}\n'
        )

    elif i == 2:  # 目标C
        miss_count = C_total - TP_C
        miss_rate = miss_count / C_total if C_total != 0 else 0
        result_text += (
            f'\n{categories[i]}:\n  漏警率 (Miss Rate) = ({confusion_matrix[2, 0]} + {confusion_matrix[2, 1]} + {confusion_matrix[2, 3]}) / '
            f'({confusion_matrix[2, 0]} + {confusion_matrix[2, 1]} + {confusion_matrix[2, 2]} + {confusion_matrix[2, 3]}) = {miss_rate:.2f}\n'
        )

        false_alarm_count = FP
        false_alarm_rate = false_alarm_count / (A_total + B_total + D_total) if (A_total + B_total + D_total) != 0 else 0
        result_text += (
            f'  虚警率 (False Alarm Rate) = ({confusion_matrix[0, 2]} + {confusion_matrix[1, 2]} + {confusion_matrix[3, 2]}) / '
            f'({confusion_matrix[0, 0]} + {confusion_matrix[0, 1]} + {confusion_matrix[0, 2]} + {confusion_matrix[0, 3]} '
            f'+ {confusion_matrix[1, 0]} + {confusion_matrix[1, 1]} + {confusion_matrix[1, 2]} + {confusion_matrix[1, 3]} '
            f'+ {confusion_matrix[3, 0]} + {confusion_matrix[3, 1]} + {confusion_matrix[3, 2]} + {confusion_matrix[3, 3]}) = {false_alarm_rate:.2f}\n'
        )

    else:  # 目标D
        miss_count = D_total - TP_D
        miss_rate = miss_count / D_total if D_total != 0 else 0
        result_text += (
            f'\n{categories[i]}:\n  漏警率 (Miss Rate) = ({confusion_matrix[3, 0]} + {confusion_matrix[3, 1]} + {confusion_matrix[3, 2]}) / '
            f'({confusion_matrix[3, 0]} + {confusion_matrix[3, 1]} + {confusion_matrix[3, 2]} + {confusion_matrix[3, 3]}) = {miss_rate:.2f}\n'
        )

        false_alarm_count = FP
        false_alarm_rate = false_alarm_count / (A_total + B_total + C_total) if (A_total + B_total + C_total) != 0 else 0
        result_text += (
            f'  虚警率 (False Alarm Rate) = ({confusion_matrix[0, 3]} + {confusion_matrix[1, 3]} + {confusion_matrix[2, 3]}) / '
            f'({confusion_matrix[0, 0]} + {confusion_matrix[0, 1]} + {confusion_matrix[0, 2]} + {confusion_matrix[0, 3]} '
            f'+ {confusion_matrix[1, 0]} + {confusion_matrix[1, 1]} + {confusion_matrix[1, 2]} + {confusion_matrix[1, 3]} '
            f'+ {confusion_matrix[2, 0]} + {confusion_matrix[2, 1]} + {confusion_matrix[2, 2]} + {confusion_matrix[2, 3]}) = {false_alarm_rate:.2f}\n'
        )

    # 计算准确率、精确率和召回率并显示计算过程
    accuracy = TP / total_samples  # 准确率
    result_text += (
        f'  准确率 (Accuracy) = ({TP_A} + {TP_B} + {TP_C} + {TP_D}) / {total_samples} = {accuracy:.2f}\n'
    )

    precision = actual_positive / total_predictions if total_predictions != 0 else 0  # 精确率
    result_text += (
        f'  精确率 (Precision) = {actual_positive} / ({confusion_matrix[0, i]} + {confusion_matrix[1, i]} + {confusion_matrix[2, i]} + {confusion_matrix[3, i]}) = {precision:.2f}\n'
    )

    recall = actual_positive / (actual_positive + FN) if (actual_positive + FN) != 0 else 0  # 召回率
    result_text += (
        f'  召回率 (Recall) = {actual_positive} / ({actual_positive} + {FN}) = {recall:.2f}\n'
    )

# 在新窗口中显示文本
result_ax.text(0.1, 0.5, result_text, fontsize=12, va='center', ha='left', bbox=dict(facecolor='white', alpha=0.5))
result_ax.axis('off')  # 关闭坐标轴

result_fig.suptitle('分类结果指标', fontsize=16)

# 显示窗口
plt.show()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值