You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 20:45:05