使用 CART 时如何衡量/排名“变量重要性”?(特别是使用 R 中的 {rpart})

机器算法验证 r 分类 模型选择 大车 rpart
2022-02-11 03:16:28

在使用 rpart(在 R 中)构建 CART 模型(特别是分类树)时,了解引入模型的各种变量的重要性通常很有趣。

因此,我的问题是: 在 CART 模型中,对参与变量的变量重要性进行排名/测量的常用措施是什么?以及如何使用 R 进行计算(例如,使用 rpart 包时)

例如,这里创建了一些虚拟代码,以便您可以在上面展示您的解决方案。这个例子的结构很明显变量 x1 和 x2 是“重要的”,而(在某种意义上)x1 比 x2 更重要(因为 x1 应该适用于更多的情况,从而对数据的结构产生更大的影响,然后 x2)。

set.seed(31431)
n <- 400
x1 <- rnorm(n)
x2 <- rnorm(n)
x3 <- rnorm(n)
x4 <- rnorm(n)
x5 <- rnorm(n)

X <- data.frame(x1,x2,x3,x4,x5)

y <- sample(letters[1:4], n, T)
y <- ifelse(X[,2] < -1 , "b", y)
y <- ifelse(X[,1] < 0 , "a", y)

require(rpart)
fit <- rpart(y~., X)
plot(fit); text(fit)

info.gain.rpart(fit) # your function - telling us on each variable how important it is

(总是欢迎参考)

4个回答

当感兴趣的预测器被移除(使用置换技术,如在随机森林中)或节点杂质减少的某种度量时,通常可以根据预测准确性的相应降低来计算变量重要性,但请参见 (1) 的概述可用的方法。CART 的一个明显替代方案当然是 RF(randomForest,但另见派对)。对于 RF,基尼重要性指数被定义为森林中所有树的节点杂质的平均基尼降低(它源于这样一个事实,即给定父节点的基尼杂质指数大于其两个测量值的值)子节点,参见例如 (2))。

我知道Carolin Strobl 和coll。对 RF 和 CART 中的(条件)变量重要性做出了很多模拟和实验研究(例如,(3-4),但还有许多其他研究,或者她的论文,机器学习中的统计问题——走向可靠的拆分选择和变量重要性度量)。

据我所知,插入符号包 (5) 仅考虑回归情况的损失函数(即均方误差)。也许它会在不久的将来添加(无论如何,在线帮助中提供了一个带有 k-NN 分类案例的示例dotPlot)。

然而,Noel M O'Boyle 似乎有一些 R 代码用于CART 中的变量重要性

参考

  1. 桑德里和祖科洛托。分类树中基尼变量重要性度量的偏差校正算法2008年
  2. 伊森曼。现代多元统计技术施普林格 2008
  3. Strobl、Hothorn 和 Zeilis。派对!. R 杂志2009 年 1/2
  4. Strobl、Boulesteix、Kneib、Augustin 和 Zeilis。随机森林的条件变量重要性BMC 生物信息学2008, 9:307
  5. 库恩。使用 caret 包在 R 中构建预测模型JSS 2008 28(5)

以下函数(来自 Caret 包)可用于评估 rpart 树中的变量重要性。当树中只有这个根节点时,我更正了 Caret 函数中的一个错误。

varImp <- function(object, surrogates = FALSE, competes = TRUE, ...)
  {
tmp <- rownames(object$splits)

 allVars <- colnames(attributes(object$terms)$factors)
if(is.null(tmp))
  {
  out<-NULL
    zeros <- data.frame(x = rep(0, length(allVars)),
                        Variable = allVars)
    out <- rbind(out, zeros)
  }

else {

rownames(object$splits) <- 1:nrow(object$splits)
splits <- data.frame(object$splits)
    splits$var <- tmp
splits$type <- ""

frame <- as.data.frame(object$frame)
    index <- 0
    for(i in 1:nrow(frame))
      {
        if(frame$var[i] != "<leaf>")
          {
            index <- index + 1
            splits$type[index] <- "primary"
            if(frame$ncompete[i] > 0)
              {
                for(j in 1:frame$ncompete[i])
                  {
                    index <- index + 1
                    splits$type[index] <- "competing"
                  }
              }
            if(frame$nsurrogate[i] > 0)
              {
                for(j in 1:frame$nsurrogate[i])
                  {
                    index <- index + 1
                    splits$type[index] <- "surrogate"
                  }
              }
          }
      }
    splits$var <- factor(as.character(splits$var))
    if(!surrogates) splits <- subset(splits, type != "surrogate")
    if(!competes) splits <- subset(splits, type != "competing")
    out <- aggregate(splits$improve,
                 list(Variable = splits$var),
                 sum,
                 na.rm = TRUE)

allVars <- colnames(attributes(object$terms)$factors)
if(!all(allVars %in% out$Variable))
      {
        missingVars <- allVars[!(allVars %in% out$Variable)]
        zeros <- data.frame(x = rep(0, length(missingVars)),
                            Variable = missingVars)
        out <- rbind(out, zeros)
      }
    }
    out2 <- data.frame(Overall = out$x)
rownames(out2) <- out$Variable
out2

}

以下 r 代码将为 rpart 树“fit”生成重要性分数

 varImp(fit)

我认为 chl 已经回答了第一部分:

在 CART 模型中,对参与变量的变量重要性进行排名/测量有哪些常用措施?

关于你问题的第二部分:

以及如何使用 R 进行计算(例如,使用 rpart 包时)

您可以使用 rpart 通过 summary(fit) 找到变量重要性。这会在其他几件事中输出可变重要性。您可以在此处阅读更多相关信息:https ://cran.r-project.org/web/packages/rpart/rpart.pdf 。请参阅第 25 页。

names(result)节目variable.importance

result$variable.importance应该有帮助吗?