Почему во время обучения модели выбран другой гиперпараметр, чем при пересчете? - PullRequest
1 голос
/ 10 октября 2019

Во время повторной выборки проверяется параметр max_depth со значениями 5 и 9. Однако во время обучения используется совершенно другое значение 10. Я ожидал, что во время обучения будет установлен параметр, возвращающий наименьшее RMSE. В этом случае было выбрано совершенно другое значение параметра.

library("mlr3")
library("paradox")
library("mlr3learners")
library("mlr3tuning")
library("data.table")

set.seed(10)

x1 = 1:100
x2 = 2 * x1
y = x1^2 - x2 + rnorm(100)

data = data.table(
   x1 = x1,
   x2 = x2,
   y = y
)

task = TaskRegr$new("task", backend = data, target = "y")

lrn_xgb = mlr_learners$get("regr.xgboost")

ps = ParamSet$new(
   params = list(
      ParamInt$new(id = "max_depth", lower = 4, upper = 10)
   ))

at = AutoTuner$new(learner = lrn_xgb, 
                   resampling = rsmp("cv", folds = 2),
                   measures = msr("regr.rmse"), 
                   tune_ps = ps,
                   terminator = term("evals", n_evals = 1),
                   tuner = tnr("random_search"))

resampling_outer = rsmp("cv", folds = 2)

rr = resample(task = task, learner = at, resampling = resampling_outer)
#> max_depth = 5
#> max_depth = 9

at$train(task)
#> max_depth = 10

Информация о сеансе:

R version 3.6.1 (2019-07-05)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 8.1 x64 (build 9600)

Matrix products: default

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] mlr3learners_0.1.3 mlr3tuning_0.1.0   data.table_1.12.2 
[4] paradox_0.1.0      mlr3_0.1.3

loaded via a namespace (and not attached):
 [1] lgr_0.3.3        lattice_0.20-38  mlr3misc_0.1.4  
 [4] digest_0.6.21    crayon_1.3.4     grid_3.6.1      
 [7] R6_2.4.0         backports_1.1.4  magrittr_1.5    
[10] stringi_1.4.3    uuid_0.1-2       Matrix_1.2-17   
[13] checkmate_1.9.4  xgboost_0.90.0.2 tools_3.6.1     
[16] compiler_3.6.1   Metrics_0.1.4

1 Ответ

3 голосов
/ 11 октября 2019

Все, что происходит, правильно. Дело в том, что AutoTuner добавляет алгоритм обучения xgboost с помощью метода настройки, который находит (оптимальный? Хороший? Хорошо работающий?) Гиперпараметр, затем устанавливает их в ученике, затем обучает модель посредством окончательного вызова обученияалгоритм.

Вы можете представить это как

Данные -> [Сплит-данные] -> [Настройка] - (opt.HPs, Data) -> [Поезд] -> Модель

Если вы хотите (только немного) менее уродливую картинку для этого, взгляните на мою лекцию по адресу:

https://compstat -lmu.github.io / lecture_i2ml / article /content.html (см. day5, настройка и вложенная повторная выборка)

Теперь в вашем коде выше 3 проходов вышеуказанного конвейера. 2 в вашем 2-кратном резюме, 1 в конце. На каждом проходе происходит настройка вызова. По разным данным. Так что НЕТ ГАРАНТИИ, что 3 оптимальных конфига HP одинаковы. Прежде всего, первые 2 являются выборками данных из выборки, лежащей в основе распределения данных, и имеют одинаковый размер. Так что довольно много «того же», но они все еще являются стохастическими образцами. Так что результаты могут отличаться. Особенно, когда есть много конфигураций HP с почти такой же производительностью, что и оптимальная конфигурация HP. И данных мало. И тюнер довольно стохастический. (NB: Все это верно для вашего примера ....) Для третьего прогона настройки базовое распределение данных остается прежним, но теперь данные обучения стали даже немного больше (в вашем случае, вдвое больше, из-за2CV). Это также может привести к разным результатам.

В общем, вы можете проверить по крайней мере примерно одинаковые результаты настройки, как вы делали выше, и начать «беспокоиться» / проверять / использовать свой инструмент обучения человека (мозг) почему тюнинг на самом деле "нестабилен". Но в вашем случае, данные настолько малы, и эксперимент больше похож на «игрушечный эксперимент», что я не думаю, что имеет смысл задуматься над этим здесь. Почему это технически не ошибка, я объяснил выше.

Вот еще один, надеюсь, полезный аналог: Забудьте AutoTuner, запустите точно такой же код с простой линейной регрессией. Вы запускаете 2CV с ним, и вы помещаете его в полные данные. Для линейной модели создано 3 вектора «бета» параметра. Вы ожидаете, что они будут одинаковыми? Нет. Вы бы волновались, если бы они все были супер-разными? Потенциально.

Мой последний пример и ваш код очень связаны. Мой последний пример я бы назвал «обучение 1-го уровня». И мы оптимизируем функцию риска линейной модели численно. Тюнинг "обучение 2-го уровня". Он по-прежнему оптимизирует параметры, гиперпараметры или параметры 2-го уровня. И это оптимизирует другой «риск»: перекрестная проверка ошибок. И использует другие методы оптимизации, может быть, случайный поиск, может быть байесовской оптимизации. Но на абстрактном уровне оба метода очень похожи.

Это сравнение очень помогло мне как студенту, а также причина, по которой mlr в некоторой степени выглядит так, как и в случае с AutoTuner.

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