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


27

当使用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

(总是欢迎引用)



这个问题是指知道哪个预测变量与因变量的特定分类值相关。这个问题范围更广(重要性/排名可变而未检测到影响哪个名义价值)。由于未回答该问题,我认为值得用更笼统的方式来表述,以希望有人能够提供帮助...
Tal Galili

Answers:


42

当移除感兴趣的预测变量(使用置换技术,例如在Random Forest中)或某些减少节点杂质的措施时,通常可以根据预测准确性的相应降低来计算变量重要性,但是请参见(1)的概述可用方法。当然,RF显然是CART的替代方案(randomForest,另请参见party)。使用RF时,基尼重要性指数定义为森林中所有树木上节点杂质的平均基尼减少量(其原因是给定父节点的基尼杂质指数大于其两个指标的度量值)子节点,请参见例如(2))。

我知道Carolin Strobl和coll。已经为RF和CART中的(条件)变量重要性提供了大量模拟和实验研究(例如(3-4)),但还有许多其他研究或论文,即机器学习中的统计问题–走向可靠的拆分选择和可变重要性指标)。

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

但是,Noel M O'Boyle似乎在CART中具有一些可变重要性的 R代码。

参考文献

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

1
确实-应该获得的选票远远超过它的票数。
马特·帕克

+1是个不错的答案。对randomForestimportance()中的后起者(如我自己)进行更新,会导致个人变量的重要性随着准确度的平均降低和平均基尼系数的降低而降低。
2015年

3

以下功能(来自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)

谢谢。您是否将该错误报告给了Max?(插入符号包的维护者)
Tal Galili 2014年

1

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

对于CART模型中参与变量的排名/衡量变量重要性,存在哪些常用措施?

关于问题的第二部分:

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

您可以通过使用summary(fit)使用rpart查找变量重要性。这会输出其他方面的可变重要性。您可以在此处了解更多信息:https : //cran.r-project.org/web/packages/rpart/rpart.pdf。请参阅第25页。


0

names(result) 表演 variable.importance

result$variable.importance 应该帮忙吗?


3
我相信这个问题更多地与某些重要性可变的度量的优势或普及有关,而不是如何针对特定方法打印R中可用的度量。
chl 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.