r语言 - MLR - 计算袋装提升树的特征重要性 (XGBoost)



早上好,

我有一个关于使用 R 中的 MLR 包计算袋提升回归树模型的特征重要性的问题。我正在使用 XGBOOST 进行预测,并且我正在使用 bagging 来估计预测的不确定性。我的数据集相对较大;大约 10k 个要素和观测值。预测工作得很好(见下面的代码(,但我似乎无法计算特征重要性(下面代码的最后一行(。重要性函数崩溃且没有错误...并冻结 R 会话。我看到一些相关的python代码,人们似乎在这里和这里计算每个bagged模型的重要性。我也无法让它在 R 中正常工作。具体来说,我不确定如何访问 MLR 生成的对象(下面代码中的mb对象(中的单个模型。在python中,这似乎是微不足道的。在 R 中,我似乎无法提取mb$learner.model,这在逻辑上似乎最接近我需要的。所以我想知道是否有人对这个问题有任何经验?

请参阅下面的代码

learn1 <- makeRegrTask(data = train.all , target= "resp", weights = weights1)
lrn.xgb <- makeLearner("regr.xgboost", predict.type = "response")
lrn.xgb$par.vals <- list( objective="reg:squarederror", eval_metric="error", nrounds=300, gamma=0, booster="gbtree", max.depth=6)
lrn.xgb.bag = makeBaggingWrapper(lrn.xgb, bw.iters = 50, bw.replace = TRUE,  bw.size = 0.85, bw.feats = 1)
lrn.xgb.bag <- setPredictType(lrn.xgb.bag, predict.type="se")
mb = mlr::train(lrn.xgb.bag, learn1)
fimp1 <- getFeatureImportance(mb)

如果设置bw.feats = 1则对特征重要性值求平均值可能是可行的。 基本上,您只需要应用于存储在HomogeneousEnsembleModel中的所有单个模型即可。一些额外的小心是必要的,因为特征的顺序会因为采样而混淆 - 尽管我们将其设置为 100%。

library(mlr)
data = data.frame(x1 = runif(100), x2 = runif(100), x3 = runif(100))
data$y = with(data, x1 + 2 * x2 + 0.1 * x3 + rnorm(100))
task = makeRegrTask(data = data, target = "y")
lrn.xgb = makeLearner("regr.xgboost", predict.type = "response")
lrn.xgb$par.vals = list( objective="reg:squarederror", eval_metric="error", nrounds=50, gamma=0, booster="gbtree", max.depth=6)
lrn.xgb.bag = makeBaggingWrapper(lrn.xgb, bw.iters = 10, bw.replace = TRUE,  bw.size = 0.85, bw.feats = 1)
lrn.xgb.bag = setPredictType(lrn.xgb.bag, predict.type="se")
mb = mlr::train(lrn.xgb.bag, task)
fimps = lapply(mb$learner.model$next.model, function(x) getFeatureImportance(x)$res)
fimp = fimps[[1]]
# we have to take extra care because the results are not ordered
for (i in 2:length(fimps)) {
fimp = merge(fimp, fimps[[i]], by = "variable")
}
rowMeans(fimp[,-1]) # only makes sense with bw.feats = 1
# [1] 0.2787052 0.4853880 0.2359068

相关内容

  • 没有找到相关文章

最新更新