R中如何编写嵌套ifelse()评估三分类预测构建混淆矩阵
三分类预测类别判定与混淆矩阵报错解决方案
阈值问题说明
- 三分类场景不需要使用0.33作为判定阈值。多分类默认判定规则为取单样本对应所有类别中预测概率最高的类别作为最终预测结果,和类别数对应的平均概率无强制绑定关系,仅当存在特殊错判成本管控需求时,才需要自定义阈值调整判定逻辑。
嵌套ifelse()正确实现
你之前的嵌套语句仅输出2个类别,核心原因是判断条件未做全类别互斥校验,仅判断单类别概率是否超过固定值,没有和其余两类概率做横向比较。正确写法如下,假设pred_model_Tree1为三列概率数据框,列名与类别名France/Holland/Spain一一对应:
# 逐行判定最高概率对应类别 pred_class <- ifelse( pred_model_Tree1$France > pred_model_Tree1$Holland & pred_model_Tree1$France > pred_model_Tree1$Spain, "France", ifelse( pred_model_Tree1$Holland > pred_model_Tree1$Spain, "Holland", "Spain" ) ) # 统一因子水平,彻底解决confusionMatrix的水平不一致报错 pred_class <- factor( pred_class, levels = levels(test_set$Country) )
注意:
test_set$Country是你测试集上的真实分类标签,直接取它的因子水平赋值给预测结果,能100%保证两者水平顺序、名称完全一致,不需要手动输入水平值。
更简洁的替代实现(避免手写ifelse出错)
不需要手写嵌套判断,直接用内置函数逐行取最大概率对应列名即可,逻辑更稳定:
# 逐行返回最大概率对应的列名,即为预测类别 pred_class <- colnames(pred_model_Tree1)[apply(pred_model_Tree1, 1, which.max)] # 同样统一因子水平 pred_class <- factor(pred_class, levels = levels(test_set$Country))
混淆矩阵调用
完成上述步骤后,直接调用函数即可正常输出全类别分类精度统计量:
library(caret) confusionMatrix(data = pred_class, reference = test_set$Country)
内容的提问来源于stack exchange,提问作者Alice Hobbs
相关产品推荐
相关产品推荐

