Zero-R模型使用Caret混淆矩阵计算灵敏度特异度结果不一致问题
问题原因
- 指标定义匹配错误
你手动计算得到的0.6187~0.6305区间数值实际是整体分类准确率,而非灵敏度。Zero-R模型会全量预测为训练集中占比更高的类别,此处全预测为B,准确率恰好等于测试集B类样本的占比,和你给出的区间完全吻合。
按照你指定positive="B"的参数设定:
- 灵敏度定义为「实际为B的样本中被预测为B的比例」,所有B类样本都被正确预测,因此结果为1.0000
- 特异度定义为「实际为M的样本中被预测为M的比例」,所有M类样本都被预测为B,因此结果为0.0000
函数本身的输出符合指标定义,不存在计算错误。
- 因子水平警告触发原因
你的预测结果全为B,导致预测值变量testDiagnosisPred的因子水平仅包含"B",和真实标签testDiagnosis的双水平(B、M)不一致,因此触发了自动重编码的警告,该警告本次未影响计算结果,但其他场景下可能导致指标计算偏差。
解决方法
- 消除警告:生成预测结果后,手动统一预测值和真实标签的因子水平,代码如下:
testDiagnosisPred <- factor(testDiagnosisPred, levels = levels(testDiagnosis))
- 匹配业务需求调整参数:如果你的分析场景中需要将恶性(M)作为核心识别的正类,修改调用参数为
positive = "M"即可得到对应指标;如果确实以B为正类,可直接从函数返回结果中提取准确率指标,无需手动计算,代码如下:
cm <- confusionMatrix(testDiagnosisPred, testDiagnosis, positive = "B") # 直接读取准确率 acc <- cm$overall["Accuracy"] # 直接读取灵敏度 sens <- cm$byClass["Sensitivity"]
- 手动校验逻辑:如果需要自行核对结果,可先提取原始混淆矩阵再计算,避免指标定义混淆:
raw_cm <- cm$table # 正类为B时的灵敏度计算 tp <- raw_cm["B", "B"] fn <- raw_cm["M", "B"] calc_sens <- tp/(tp + fn)
内容的提问来源于stack exchange,提问作者cocoakrispies93
相关产品推荐
相关产品推荐

