R mlr - Как работает tuneThreshold для настройки порога предсказания? - PullRequest
0 голосов
/ 25 января 2020

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

1 Ответ

0 голосов
/ 25 января 2020
  • Ваша ссылка на CrossValidated не работает

  • Всегда используйте set.seed() для стохастичности c процессов, чтобы сделать их воспроизводимыми

  • Что такое load_all() для?

Что касается вашего вопроса:

Почему вы предполагаете, что они одинаковы? Вы делаете две совершенно разные вещи:

  • Значение 1 - лучший порог, который был найден во время настройки в сценарии CV

  • Значение 2 - вызов из одного объекта прогноза (который хранит набор данных, отличный от набора данных в резюме)

при повторном вызове tuneThreshold (r $ pred), порога и производительности оценка не меняется.

В этом вызове выборка не выполняется, поэтому результат всегда будет одинаковым. Во время CV у вас есть недетерминированная выборка c, которая изменяет ваши наборы данных при каждом запуске - если вы не установите начальное значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...