图像领域评价效果的常用5大指标
1.漏警率(Miss Rate):
解释:漏警率是指实际为某类别的样本中被错误识别为其他类别的比例。换句话说,就是模型未能正确识别出属于该类别的样本的比例。(该识未识)
示例:如果有100个真正的坦克,但模型个识别出80个,还有20个被误认为不是坦克,那么漏警率就是20%。
2.虚警率(False Alarm Rate):
解释:虚警率是指模型将其他类别误识别为某一特定类别的比例。也就是说,模型错误地将不属于某类别的样本判定为该类别的比例。(虚惊一场)
示例:如果模型识别到100个坦克,其中有20个是误判的其他种类(比如装甲车、方舱车等),那么这20%的比例就是虚警率。
3.准确率/正确率(Accuracy):
解释:准确率是指模型在所有预测中做出正确判断的比例。它是衡量模型整体性能的重要指标。(对了几次)
示例:如果在200次预测中,模型正确识别了180次,那么准确率就是90%。
4.精确率/查准率(Precision):
解释:精确率是指模型预测为某一类别的样本中,真正属于该类别的比例。(他是他,准不准)
示例:如果模型预测了100个坦克,其中80个是正确的(实际是坦克),20个是错误的(其实是其他种类),那么精确率就是80%。
5.召回率(Recall):
解释:召回率是指实际为某一类别的样本中,模型能正确识别出来的比例。它用来衡量模型的“敏感性”或“覆盖率”。
示例:如果实际有100个坦克,而模型个识别出80个,剩下的20个被错过了,那么召回率就是80%。
总结:
1.精确率高,意味着模型的预测结果很“准”,误报少,但可能有漏报。
2.召回率高,意味着模型很“全”,识别的覆盖范围广,但可能误报多。
3.漏警率反映模型漏掉了多少目标,虚警率则表示模型错判了多少非目标为目标。
4.准确率是衡量模型总体表现的指标。
5.每个指标都有其适用的场景和意义,通常需要综合考虑这些指标来评估模型的性能。
多分类问题举例说明
上述图片代码
"""
作者: stark
日期: 2024年11月01日
"""
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()