如何计算假阳性率(FPR)与假阴性率百分比并将向量转为单值?
如何将多分类任务的FPR/FNR向量转换为单个数值?
你得到向量形式的FPR和FNR,本质原因是你当前在处理多分类任务——混淆矩阵是n×n的(n为类别数),代码里计算的是每个类别单独的假阳性率和假阴性率,自然会输出对应每个类别的数值向量。
要得到单个数值,你可以根据业务需求选择以下几种常用的平均方式:
1. 宏平均(Macro-average)
如果你的每个类别样本量相近,且希望每个类别对最终结果的权重相同,直接对所有类别的FPR/FNR取平均值即可:
import numpy as np # 宏平均FPR macro_fpr = np.mean(FPR) # 宏平均FNR macro_fnr = np.mean(FNR) print(f"宏平均FPR: {macro_fpr:.4f}") print(f"宏平均FNR: {macro_fnr:.4f}")
2. 加权平均(Weighted-average)
如果你的数据集存在类别不平衡(某个类别的样本量远大于其他类),可以用每个类别的真实样本数作为权重,让样本多的类别对结果影响更大:
# 每个类别的真实样本总数(混淆矩阵每行的和,即该类别实际的正样本+假阴性样本) class_true_counts = cnf_matrix.sum(axis=1) # 加权平均FPR weighted_fpr = np.average(FPR, weights=class_true_counts) # 加权平均FNR weighted_fnr = np.average(FNR, weights=class_true_counts) print(f"加权平均FPR: {weighted_fpr:.4f}") print(f"加权平均FNR: {weighted_fnr:.4f}")
3. 微平均(Micro-average)
如果更关注整体样本的错误表现,不单独区分类别,可以把所有类别的TP、FP、FN、TN汇总后再计算整体的FPR和FNR:
# 汇总所有类别的指标 total_fp = np.sum(FP) total_fn = np.sum(FN) total_tp = np.sum(TP) total_tn = np.sum(TN) # 微平均FPR micro_fpr = total_fp / (total_fp + total_tn) # 微平均FNR micro_fnr = total_fn / (total_fn + total_tp) print(f"微平均FPR: {micro_fpr:.4f}") print(f"微平均FNR: {micro_fnr:.4f}")
另外提一句,你代码里有个小笔误:print('Fn: '+str(FN))之后又重复打印了一次print('FN: '+str(FN)),可以修正下避免混淆~
内容的提问来源于stack exchange,提问作者dina
相关产品推荐
相关产品推荐

