R tidymodels中roc_curve使用.pred_yes得到反向ROC曲线问题
错误原因
你遇到的ROC曲线反向问题核心是因子水平顺序和roc_curve()的默认规则不匹配:
- R的
factor()函数默认按字符的字母序设置水平顺序,你在构造promoted因子时没有手动指定水平,所以最终因子的水平顺序是c("no", "yes")("n"的字母序排在"y"前) - tidymodels的
roc_curve()默认将truth参数传入的因子的第一个水平作为正例,要求estimate参数传入的列必须是该正例对应的预测概率 - 你传入的
.pred_yes是预测为"yes"的概率,对应因子的第二个水平,和默认要求的正例不匹配,所以得到反向ROC;换成.pred_no时,该列刚好对应默认正例"no"的预测概率,所以结果看起来正常。
修复方案
有两种常用修复方式,任选其一即可:
方案1:手动指定因子正例顺序
在构造promoted因子时明确把正例"yes"放在第一个水平:
salespeople <- salespeople %>% mutate(promoted = factor( ifelse(promoted == 1, "yes", "no"), levels = c("yes", "no") # 正例放第一位 ))
后续调用roc_curve()时保持estimate = .pred_yes即可得到正确结果。
方案2:指定roc_curve()的正例位置
调用roc_curve()时通过event_level参数指定正例是因子的第二个水平:
roc <- roc_curve(predictions, estimate = .pred_yes, truth = promoted, event_level = "second")
帖子优化建议
- 可以补充你运行代码得到的反向ROC的具体表现(比如AUC小于0.5),方便其他用户更快定位问题
- 自定义的
train_test()函数存在隐藏问题:当na.rm=TRUE时你先对原数据集取行索引、再删除原数据集的空值,会导致索引长度和删除空值后的数据集行数不匹配,建议调整为先删空值再取索引 - 可以用
set.seed()固定随机种子,方便其他用户复现你的运行结果
内容的提问来源于stack exchange,提问作者ryanmc25
相关产品推荐
相关产品推荐

