【发布时间】: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 有什么作用?
【问题讨论】: