来自 randomForestExplainer 包的最小深度交互

Minimal depth interaction from randomForestExplainer package

因此,当在 R 中使用 randomForestExplainer 包的最小深度交互功能时,我得到了一些难以解释的结果。

我模拟了一些数据 (x1, x2,..., x5),其中 x1 是二进制的,x2-x5 是连续的。在我的模型中,没有相互作用。

我正在使用 randomForest 包创建一个随机森林,然后 运行 通过 randomForestExplainer 包创建它。

这是我用来模拟数据和随机森林的代码:

library(randomForest)
library(randomForestExplainer)

n <- 100
p <- 4

# Create data:
xrandom <- matrix(rnorm(n*p)+5, nrow=n)
colnames(xrandom)<- paste0("x",2:5)
d <- data.frame(xrandom)
d$x1 <- factor(sample(1:2, n, replace=T))

# Equation:
y <- d$x2 + rnorm(n)/5

y[d$x1==1] <- y[d$x1==1]+5
d$y <- y

# Random Forest:
fr <- randomForest(y ~ ., data=d,localImp=T)

# Random Forest Explainer:
interactions_frame <- min_depth_interactions(fr, names(d)[-6])
head(interactions_frame, 2)

这会产生以下结果:

   variable    root_variable mean_min_depth occurrences interaction
1       x1            x1       4.670732           0       x1:x1
2       x1            x2       2.606190         221       x2:x1
  uncond_mean_min_depth
1              1.703252
2              1.703252

所以,我的问题是,如果 x1:x1 出现 0 次(这是预期的),那么它怎么也有 mean_min_depth? 当然,如果它出现 0 次,那么它不可能有最小深度? [或者更确切地说,最小深度 = 0 或 NA]

这是怎么回事?我是不是误解了什么?

谢谢

我的理解是这与 min_depth_interactionsmean_sample 参数的选择有关。默认选择用根为 x1 的最大子树的深度替换 NA。详情如下。

这个参数 mean_sample 有什么用?它指定了如何处理不存在感兴趣交互的树。共有三个选项:

  1. relevant_trees。这仅考虑存在感兴趣交互的树。在您的示例中,这为 mean_min_depth 交互 x1:x1 提供了 NA,这是您正在寻找的行为。

    interactions_frame <- min_depth_interactions(fr, names(d)[-6], mean_sample = "relevant_trees")
    head(interactions_frame, 2)
      variable root_variable mean_min_depth occurrences interaction uncond_mean_min_depth
    1       x1            x1             NA           0       x1:x1              1.947475
    2       x1            x2       1.426606         218       x2:x1              1.947475
    
  2. all_trees。 relevant_trees 有一个主要问题,即对于只出现在少数树中的交互,取条件最小深度的平均值忽略了这个交互并不那么重要的事实。在这种情况下,较小的平均条件最小深度并不意味着交互很重要。为了解决这个问题,指定 mean_sample = "all_trees" 将感兴趣的交互的条件最小深度替换为根变量的最大子树的平均深度。基本上,如果我们正在查看 x1:x2 的交互,它表示对于没有这种交互的树,给它一个根为 x1 的最深树的值。这为交互 x1:x2mean_min_depth 提供了一个(希望很大的)数值,从而使其不那么重要。

    interactions_frame <- min_depth_interactions(fr, names(d)[-6], mean_sample = "all_trees")
    head(interactions_frame, 2)
      variable root_variable mean_min_depth occurrences interaction uncond_mean_min_depth
    1       x1            x1       4.787879           0       x1:x1               1.97568
    2       x1            x2       3.654522         218       x2:x1               1.97568
    
  3. top_trees。现在这是 mean_sample 的默认选择。我的理解是它类似于 all_trees,但试图降低替换缺失值的贡献。动机是 all_treesmean_min_depth 拉近相同的值,当有很多参数但没有足够的观察时,即浅树。为了减少替换缺失值的贡献,top_trees 仅计算 n 树的子集的平均条件最小深度,其中 n 是与指定根进行任何交互的树的数量当前的。假设在您的示例中,在这 500 棵树中,只有 300 棵树有任何交互 x1:whatever,那么我们在填写 x1:x1 的值时只考虑这 300 棵树。因为这种交互出现 0 次,所以用相同的值替换 500 个 NA 与替换 300 个 NA 不会影响均值,所以它是相同的值 4.787879。 (我们的结果略有不同,我认为这与种子值有关)。

    interactions_frame <- min_depth_interactions(fr, names(d)[-6], mean_sample = "top_trees")
    head(interactions_frame, 2)
      variable root_variable mean_min_depth occurrences interaction uncond_mean_min_depth
      variable root_variable mean_min_depth occurrences interaction uncond_mean_min_depth
    1       x1            x1       4.787879           0       x1:x1              1.947475
    2       x1            x2       2.951051         218       x2:x1              1.947475
    

本回答基于我对包作者论文的理解:https://rawgit.com/geneticsMiNIng/BlackBoxOpener/master/randomForestExplainer_Master_thesis.pdf