如何在R中的二进制h2o GBM中为每个类获得不同的变量重要性?

时间:2017-12-02 15:00:17

标签: r machine-learning classification h2o gbm

我正在尝试探索使用带有h2o的GBM来解决分类问题以替换逻辑回归(GLM)。我的数据中的非线性和相互作用使我认为GBM更合适。

我已经运行了基线GBM(见下文),并将AUC与逻辑回归的AUC进行了比较。 GBM的表现要好得多。

在经典线性逻辑回归中,人们将能够看到每个预测变量(x)对结果变量(y)的方向和影响。

现在,我想以同样的方式评估估算GBM的变量重要性。

如何获得每个(两个)类的变量重要性?

我知道变量重要性与逻辑回归中的估计系数不同,但它有助于我理解哪个预测因子会影响哪个类。

其他人问过similar questions,但提供的答案对H2O对象不起作用。

非常感谢任何帮助。

example.gbm <- h2o.gbm(
  x = c("list of predictors"), 
  y = "binary response variable", 
  training_frame = data, 
  max_runtime_secs = 1800, 
  nfolds=5,
  stopping_metric = "AUC")

2 个答案:

答案 0 :(得分:8)

AFAIS,一种更强大的机器学习方法,解释它下面发生的事情就越复杂。

GBM方法的优点(正如您已经提到的)也会给理解模型带来困难。对于数值变量,当GBM模型可能使用不同的值而某些可能具有正面影响而其他可能具有负面影响时,这尤其适用。

对于GLM,当没有指定交互时,数字变量将是单调的,因此您可以获得正面或负面影响。

现在总体观点很难,我们有什么方法可以分析模型吗?我们可以从两种方法开始:

部分依赖图

h2o提供h2o.partialplot,它为每个变量提供部分(即边际)效果,可以看作效果:

library(h2o)
h2o.init()
prostate.path <- system.file("extdata", "prostate.csv", package="h2o")
prostate.hex <- h2o.uploadFile(path = prostate.path, destination_frame = "prostate.hex")
prostate.hex[, "CAPSULE"] <- as.factor(prostate.hex[, "CAPSULE"] )
prostate.hex[, "RACE"] <- as.factor(prostate.hex[,"RACE"] )
prostate.gbm <- h2o.gbm(x = c("AGE","RACE"),
                       y = "CAPSULE",
                       training_frame = prostate.hex,
                       ntrees = 10,
                       max_depth = 5,
                       learn_rate = 0.1)
h2o.partialPlot(object = prostate.gbm, data = prostate.hex, cols = "AGE")

enter image description here

个人分析器

LIME包[https://github.com/thomasp85/lime]提供了检查每个观察值的变量贡献的功能。幸运的是,这个r包已经支持h2o

enter image description here

答案 1 :(得分:1)

您可以尝试h2o.varimp(object)