Почему xgboost не вычисляет важность для всех переменных при использовании его с mlr3?

#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 (краткий воспроизводимый пример с использованием легкодоступных данных и кода).