使用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
相关产品推荐
相关产品推荐

