2

所以,我使用的是在这里找到的超导数据集……它包含 82 个变量,我将数据子集为 2000 行。但是当我使用xgboostmlr3时并没有计算所有变量的重要性!?

这是我设置所有内容的方式:

# 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......

关于正在发生的事情有什么建议吗?

4

1 回答 1

2

简短回答:{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 使用不纯或排列并考虑所有拆分的所有特征。

顺便说一句,下次请提供一个代表(使用易于访问的数据和代码的简短可复制示例)。

于 2020-09-17T16:33:50.690 回答