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

使用mlr3::autoplot()绘制holdout重采样基准ROC曲线报错求助

解决mlr3中holdout重采样绘制ROC曲线的报错问题

这个报错的核心原因很明确:单次holdout重采样只有一组测试集结果,但autoplot(bmr, type = "roc")默认会尝试计算平均ROC曲线并显示置信区间——这一逻辑是为交叉验证这类多次重采样场景设计的,单次holdout的结果无法支撑这个计算,因此出现参数不匹配的冲突。

下面给你两种针对性的解决方案:

方案1:绘制单次holdout的ROC曲线(不做平均)

直接在autoplot调用里明确关闭平均计算和置信区间显示,就能适配单次holdout的场景,修改后的代码如下:

library("mlr3")
library("mlr3learners")
library("mlr3viz")

# 你的原有代码部分
tasks = lapply(c("german_credit"), tsk)
learners = c("classif.featureless", "classif.rpart", "classif.ranger", "classif.kknn")
learners = lapply(learners, lrn, predict_type = "prob")
resamplings = rsmp("holdout", ratio = .8)
design = benchmark_grid(tasks, learners, resamplings)
bmr = benchmark(design)

# 修改后的autoplot调用
autoplot(bmr, type = "roc", calc_avg = FALSE, show_cb = FALSE)

运行后就能正常生成每个模型在单次holdout测试集上的ROC曲线。

方案2:多次重复holdout以生成平均ROC曲线

如果你希望得到更稳定的平均ROC结果,可以让holdout重复多次(比如10次),这样就满足了计算平均曲线的要求,代码修改如下:

library("mlr3")
library("mlr3learners")
library("mlr3viz")

tasks = lapply(c("german_credit"), tsk)
learners = c("classif.featureless", "classif.rpart", "classif.ranger", "classif.kknn")
learners = lapply(learners, lrn, predict_type = "prob")

# 设置重复10次的holdout
resamplings = rsmp("holdout", ratio = .8)
resamplings$param_set$values$repeats = 10  # 添加这一行配置重复次数

design = benchmark_grid(tasks, learners, resamplings)
bmr = benchmark(design)

# 现在可以直接用默认参数绘制平均ROC曲线
autoplot(bmr, type = "roc")

此时因为有10次holdout的结果作为支撑,autoplot可以正常计算平均ROC并显示置信区间,不会再出现报错。


内容的提问来源于stack exchange,提问作者maRmat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:57:34