3

我正在使用 mlr3 包,我想为不同的模型绘制 ROC 曲线。如果我按照文档中的说明使用交叉验证,它工作得很好,但是如果我使用“holdout”进行重采样,那么我会得到一个错误Error: Invalid show_cb. Inconsistent with calc_avg of evalmod.

这是代码:

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

# one task only
tasks = lapply(c("german_credit"), tsk)

# get some learners and for all learners ...
# * predict probabilities
# * predict also on the training set
learners = c("classif.featureless", "classif.rpart", "classif.ranger", "classif.kknn")
learners = lapply(learners, lrn,
                  predict_type = "prob")

# compare via 3-fold cross validation
resamplings = rsmp("holdout", ratio = .8) # holdout instead of cv

# create a BenchmarkDesign object
design = benchmark_grid(tasks, learners, resamplings)
print(design)

bmr = benchmark(design)
autoplot(bmr, type = "roc")

感谢您的帮助,马修

4

1 回答 1

3

如果其他人遇到同样的问题,这里有一个解决方案。出现问题是因为参数默认calc_avg设置为in并且函数按原样使用 in 。由于返回一个没有不同 dsid 的对象(在交叉验证的情况下,不同的值来自不同的折叠,在坚持的情况下只有一个元素),因此无法进行平均,因此错误(尽管理论上可以)。TRUEprecrec::evalmod()mlr3viz::autoplot()as_precrec()precrec

这是一段代码,可用于绘制具有保留(或任何其他类型的重采样)的 ROC 曲线。使用答案中的代码,我们可以执行以下操作:

roc_data <- evalmod(as_precrec(bmr), mode = "rocprc", calc_avg = FALSE)  %>% # setting calc_avg to FALSE is critical
  fortify() %>% # precrec objects have a fortify generic function
  .[.$curvetype == "ROC", ] # both roc and prc are returned

# Tracer les courbes
ggplot(
  data = roc_data,
  mapping = aes(x = x, y = y, color = modname)
) +
  geom_line()

此代码还具有作为ggplot对象的优点,因此可以轻松修改ggplot2它,而precrec::autoplot().

于 2020-10-19T13:51:30.073 回答