#xgboost #mlr3
#xgboost #mlr3
Вопрос:
Итак, я использую набор данных о сверхпроводимости, найденный здесь… Он содержит 82 переменные, и я устанавливаю данные в 2000 строк. Но когда я использую xgboost
с mlr3
, он не вычисляет важность для всех переменных!?
Вот как я все настраиваю:
# Read in data
mydata <- read.csv("/Users/.../train.csv", sep = ",")
data <- mydata[1:2000,]
# set up xgboost using mlr3
myTaskXG = TaskRegr$new(id = "data", backend = data, target = "critical_temp")
myLrnXG = lrn("regr.xgboost")
myModXG <- myLrnXG$train(myTaskXG)
# Take a look at the importance
myLrnXG$importance()
это выводит что-то вроде этого:
wtd_mean_FusionHeat std_ThermalConductivity entropy_Density
0.685125173 0.105919410 0.078925149
wtd_gmean_FusionHeat wtd_range_atomic_radius entropy_FusionHeat
0.038797205 0.038461823 0.020889094
wtd_mean_Density wtd_std_FusionHeat gmean_ThermalConductivity
0.017211730 0.006662321 0.005598844
wtd_entropy_ElectronAffinity wtd_entropy_Density
0.001292733 0.001116518
Как вы можете видеть, там всего 11 переменных… когда должно быть 81 …. если я выполняю аналогичный процесс с помощью ranger
, все работает отлично.
Есть предложения относительно того, что происходит?
Ответ №1:
Краткий ответ: {xgboost} возвращает не все переменные.
Более длинный ответ:
Это не mlr3
вопрос, а вопрос о xgboost
пакете. importance
Метод этого обучаемого просто вызывает xgboost::xgb.importance
. Если вы посмотрите на пример на этой странице:
data(agaricus.train, package='xgboost')
bst <- xgboost(data = agaricus.train$data, label = agaricus.train$label, max_depth = 2,
eta = 1, nthread = 2, nrounds = 2, objective = "binary:logistic")
xgb.importance(model = bst)
Это возвращает
> xgb.importance(model = bst)
Feature Gain Cover Frequency
1: odor=none 0.67615471 0.4978746 0.4
2: stalk-root=club 0.17135375 0.1920543 0.2
3: stalk-root=rooted 0.12317236 0.1638750 0.2
4: spore-print-color=green 0.02931918 0.1461960 0.2
Но в общем наборе данных 127 переменных.
Математика, лежащая в основе этого, заключается в том, что ranger и xgboost используют разные методы важности, xgboost включает только функции, фактически используемые в установленной модели, тогда как ranger использует примеси или перестановки и учитывает все функции при всех разделениях.
Кстати, в следующий раз, пожалуйста, предоставьте reprex (краткий воспроизводимый пример с использованием легкодоступных данных и кода).