Это кросс-пост от Перекрестная проверка . Мне не повезло, когда я публиковал там вопросы, связанные с пакетом 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
?