【问题标题】:R mlr - How does tuneThreshold work to tune the prediction threshold?R mlr - tuneThreshold 如何调整预测阈值?
【发布时间】:2020-01-25 20:42:17
【问题描述】:

这是来自Cross Validated 的交叉帖子。我没有任何运气在那里发布与mlr 包相关的问题,所以我想我会在这里尝试。

我想使用tuneThreshold 结合学习器参数来调整以下分类任务的阈值。

我第一次尝试在学习器调优期间通过设置makeTuneControlRandom(..., tune.threshold = TRUE)来调优阈值:

library(ElemStatLearn)
library(mlr)
data(spam)
load_all()

task = makeClassifTask(data = spam, target = "spam")
lrn1 = makeLearner("classif.gbm", predict.type = "prob")
ps = makeParamSet(
  makeIntegerParam("interaction.depth", lower = 1, upper = 5)
)
ctrl = makeTuneControlRandom(maxit = 2, tune.threshold = TRUE)
lrn2 = makeTuneWrapper(lrn1, par.set = ps, control = ctrl, resampling = cv2)
r = resample(lrn2, task, cv3, extract = getTuneResult)
print(r$extract)

[[1]]
Tune result:
Op. pars: interaction.depth=4
Threshold: 0.52
mmce.test.mean=0.0586857

[[2]]
Tune result:
Op. pars: interaction.depth=5
Threshold: 0.54
mmce.test.mean=0.0557573

[[3]]
Tune result:
Op. pars: interaction.depth=5
Threshold: 0.51
mmce.test.mean=0.0514993

这里的最佳阈值是 0.51。

然后我尝试直接在预测对象上使用tuneThreshold 调整阈值:

tuneThreshold(r$pred)
$th
[1] 0.5650756

$perf
      mmce 
0.05303195 

这里的最佳阈值为 0.565。我不明白为什么这里的最佳阈值与上面的不同,为什么它没有返回与上面找到的相同的阈值,即 0.51?它似乎增加了另一层随机性,但我不知道在哪里或如何,因为当我再次调用tuneThreshold(r$pred) 时,阈值和性能分数不会改变。 tuneThreshold 是如何工作的?预测对象r$pred 有什么作用?

【问题讨论】:

    标签: r mlr


    【解决方案1】:
    • 您引用 CrossValidated 的链接已失效

    • 对于随机过程始终使用set.seed() 以使其可重现

    • load_all() 是干什么用的?

    至于你的问题:

    为什么你会认为它们是一样的?你正在做两件完全不同的事情:

    • 值 1 是在 CV 场景调优期间找到的最佳阈值

    • 值 2 是来自单个预测对象的调用(它存储的数据集与 CV 中的数据集不同)

    当我再次调用 tuneThreshold(r$pred) 时,阈值和 性能分数不变。

    此调用中没有采样,因此结果将始终相同。 在 CV 期间,您有一个不确定的采样,它会在每次运行中更改您的数据集 - 除非您设置种子。

    【讨论】:

    • 谢谢@pat-s。我了解值 1 的来源,但我对值 2 感到特别困惑。外部 CV 产生 3 个模型,每个模型都有自己的预测和阈值,那么为什么将 tuneThreshold 应用于 ResamplePrediction 对象只返回一个单一门槛? getPredictionProbabilities(r$pred) 同样也返回一个预测概率向量——这些概率是如何计算的?它只是所有 3 个 CV 折叠的预测概率的集合吗?
    猜你喜欢
    • 2019-07-06
    • 2019-03-18
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-07
    • 2019-09-02
    • 1970-01-01
    相关资源
    最近更新 更多