如何在多类别混淆矩阵中单独获取A、N、O类的sensitivity等指标
解决多类别混淆矩阵指标对应问题
当使用sklearn.metrics.multilabel_confusion_matrix计算A、N、O三类的敏感度、特异性和阳性预测值时,若输出包含样本量为0的冗余类别,可通过以下方式明确对应关系:
1. 指定目标类别,过滤冗余结果
multilabel_confusion_matrix默认会包含所有在真实标签或预测标签中出现过的类别,你可以通过labels参数直接指定需要计算的目标类别,避免冗余类别干扰:
from sklearn.metrics import multilabel_confusion_matrix # 假设已加载真实类别act_class和预测类别pred_class target_classes = ['A', 'N', 'O'] # 仅计算指定类别的混淆矩阵 confusion_matrices = multilabel_confusion_matrix(act_class, pred_class, labels=target_classes)
此时confusion_matrices会返回3个混淆矩阵,顺序与target_classes中的A、N、O一一对应。
2. 基于混淆矩阵计算指标
每个类别的混淆矩阵为2x2格式,对应[[TN, FP], [FN, TP]],据此计算各项指标:
- 敏感度(Sensitivity)= TP / (TP + FN)
- 特异性(Specificity)= TN / (TN + FP)
- 阳性预测值(Positive Predictivity)= TP / (TP + FP)
完整代码示例:
import numpy as np from sklearn.metrics import multilabel_confusion_matrix # 替换为你的真实类别和预测类别数据 act_class = [...] pred_class = [...] target_classes = ['A', 'N', 'O'] cm = multilabel_confusion_matrix(act_class, pred_class, labels=target_classes) def get_class_metrics(cm): tn, fp, fn, tp = cm.ravel() # 处理分母为0的情况,避免报错 sensitivity = tp / (tp + fn) if (tp + fn) != 0 else 0.0 specificity = tn / (tn + fp) if (tn + fp) != 0 else 0.0 pos_predictivity = tp / (tp + fp) if (tp + fp) != 0 else 0.0 return sensitivity, specificity, pos_predictivity # 逐个输出每个类别的指标 for cls_name, mat in zip(target_classes, cm): sens, spec, ppv = get_class_metrics(mat) print(f"类别 {cls_name}:") print(f" 敏感度: {round(sens, 4)}") print(f" 特异性: {round(spec, 4)}") print(f" 阳性预测值: {round(ppv, 4)}\n")
关键说明
- 通过
labels参数锁定目标类别后,混淆矩阵的顺序与你指定的target_classes完全一致,不会出现冗余类别。 - 加入分母为0的判断,防止因某类别无真实阳性或预测阳性样本导致的计算错误。
内容的提问来源于stack exchange,提问作者user2129623
相关产品推荐
相关产品推荐

