如何调整R(mlr)中learner的factor.levels顺序统一多任务输出
问题根本原因
- 你用
case_when生成的目标列是字符串类型,mlr自动将其转换为因子时默认按字典序排列水平,这才是概率列顺序变化的核心原因 makeClassifTask的positive参数仅用于性能指标(比如混淆矩阵、AUC)计算时指定正类,不会改变因子水平排序,也不会影响预测结果的概率列输出顺序- 训练完成后手动修改
learner.train$factor.levels无效,因为模型训练阶段已经固定了内部的类别顺序,后续修改不会生效 - 你在iris数据测试时顺序一致,是因为
not开头的字符串首字母n的字典序比S(Setosa)、V(Versicolor)都靠前,所以默认排序都是负类在前;如果换成首字母比n小的类别(比如Apple),默认顺序就会变成正类在前,和你原有问题的表现一致
可行解决方案
方案1:预处理阶段直接固定因子水平(最推荐,从根源统一顺序)
在生成二分类目标列时直接转成因子,手动指定固定的水平顺序,所有任务统一按「目标颜色在前,负类在后」的规则设置即可,示例代码:
colours <- Col %>% drop_na(colour) %>% # 直接指定levels顺序,后续所有流程都会沿用这个顺序 mutate(Colour = factor( case_when(colour == 'Yellow' ~ 'Yellow', TRUE ~ 'notYellow'), levels = c("Yellow", "notYellow") ))
所有二分类任务都按这个规则设置,输出的概率列、混淆矩阵顺序会完全统一。
方案2:预测结果输出后统一调整列顺序
如果已经完成训练不想重跑,可以在导出数据前按你需要的规则重排列顺序,保证所有任务导出的列顺序一致:
# 以Yellow任务为例,固定按prob.Yellow、prob.notYellow的顺序选择列 matrix3 <- task.proben.pred$data %>% add_column(proben, .before = T) %>% select(proben, prob.Yellow, prob.notYellow, truth, response)
方案3:构造预测任务时同步指定正类
你之前构造task.proben时没有设置positive参数,也需要和训练任务保持一致,避免混淆矩阵计算出错:
# 训练和测试任务的positive参数保持一致 task.colours <- makeClassifTask(colours, target = "Colour", positive = "Yellow") task.proben <- makeClassifTask(colours.probe, target = "Colour", positive = "Yellow")
内容的提问来源于stack exchange,提问作者bienexo
相关产品推荐
相关产品推荐

