为什么将xgboost与mlr3一起使用时不计算所有变量的重要性?

问题描述

因此,即时通讯使用的是超导数据集here ...它包含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进行类似的过程,那么一切都会很好地工作。

有什么建议吗?

解决方法

简短的回答:{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个变量。

这背后的数学只是游骑兵和xgboost使用不同的重要性方法,xgboost仅包括拟合模型中实际使用的功能,而游骑兵使用杂质或置换并考虑所有分割的所有特征。

下次请提供reprex(使用可轻松访问的数据和代码的可复制示例)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...