为什么 xgboost 在与 mlr3 一起使用时不计算所有变量的重要性?
Why is xgboost not calculating the importance for all variables when using it with mlr3?
所以,我使用找到的超导数据集 here... 它包含 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
执行类似的过程,一切都会完美无缺。
对正在发生的事情有什么建议吗?
简短回答:{xgboost} 不 return 所有变量。
更长的答案:
这不是 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)
这个returns
> 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(使用易于访问的数据和代码的简短可重现示例)。
所以,我使用找到的超导数据集 here... 它包含 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
执行类似的过程,一切都会完美无缺。
对正在发生的事情有什么建议吗?
简短回答:{xgboost} 不 return 所有变量。
更长的答案:
这不是 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)
这个returns
> 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(使用易于访问的数据和代码的简短可重现示例)。