Как измерить / оценить «важность переменной» при использовании CART? (особенно используя {rpart} из R)


27

При построении модели CART (в частности, дерева классификации) с использованием rpart (в R) часто бывает интересно узнать, какова важность различных переменных, введенных в модель.

Таким образом, мой вопрос: какие общие меры существуют для ранжирования / измерения важности переменных участвующих переменных в модели CART? И как это можно вычислить с помощью R (например, при использовании пакета rpart)

Например, вот некоторый фиктивный код, созданный, чтобы вы могли показать на нем свои решения. Этот пример структурирован таким образом, что ясно, что переменные x1 и x2 являются «важными», в то время как (в некотором смысле) x1 более важен, чем x2 (поскольку x1 должен применяться к большему количеству случаев, таким образом оказывая большее влияние на структуру данных, тогда х2).

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

(ссылки всегда приветствуются)


чем этот вопрос отличается от stats.stackexchange.com/questions/5443/… ?
Штеффен

Этот вопрос относится к знанию того, какой предиктор был релевантным для определенного категориального значения зависимой переменной. Этот вопрос является более широким (переменная важность / ранжирование без определения того, на какую номинальную стоимость это влияет). Поскольку на этот вопрос не был дан ответ, я подумал, что стоит сформулировать его более широко, надеясь, что кто-то сможет помочь ...
Тал Галили,

Ответы:


43

Важность переменной в общем случае может быть рассчитана на основе соответствующего снижения точности прогнозирования при удалении интересующего предиктора (с помощью метода перестановки, как в случайном лесу) или некоторой меры уменьшения примеси узла, но см. (1) для обзора доступные методы. Очевидной альтернативой CART является RF конечно ( randomForest , но смотрите также party ). При использовании RF индекс важности Джини определяется как усредненное уменьшение Джини примесей узлов по всем деревьям в лесу (это следует из того факта, что индекс примесей Джини для данного родительского узла больше, чем значение этой меры для его двух дочерние узлы, см. например (2)).

Я знаю, что Кэролайн Стробл и Колл. внесли большой вклад в имитационные и экспериментальные исследования важности (условной) переменной в RF и CART (например, (3-4)), но есть и много других, или ее диссертация " Статистические проблемы в машинном обучении - на пути к надежному выбору разделения и Меры переменного значения ).

Насколько мне известно, пакет каретки (5) рассматривает только функцию потерь для случая регрессии (т. Е. Среднеквадратичная ошибка). Возможно, он будет добавлен в ближайшем будущем (во всяком случае, пример с классификационным случаем по k-NN доступен в интерактивной справке для dotPlot).

Однако у Ноэля М О'Бойла, похоже, есть некоторый R-код для значения переменной в CART .

Ссылки

  1. Сандри и Цукколотто. Алгоритм коррекции смещения для меры важности переменной Джини в деревьях классификации . 2008
  2. Izenman. Современные многомерные статистические методы . Springer 2008
  3. Стробл, Хоторн и Зейлис. Время вечеринок! , R Journal 2009 1/2
  4. Штробль, Булесте, Кнейб, Августин и Зейлис. Условное значение переменной для случайных лесов . BMC Bioinformatics 2008, 9: 307
  5. Kuhn. Построение прогнозирующих моделей в R с использованием пакета каретки . JSS 2008 28 (5)

1
Действительно - заслуживает гораздо больше голосов, чем имеет.
Мэтт Паркер

+1 за отличный ответ. А обновление для новичков (как и я) importance()в randomForest имеет значение индивидуальной переменной со средним уменьшением точности и средним уменьшением джини.
Жубарб,

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

 varImp(fit)

1
Спасибо. Вы сообщили об ошибке Максу? (сопровождающий пакета карет)
Тал Галили

1

Я думаю, что chl в значительной степени ответил на первую часть:

Какие общие меры существуют для ранжирования / измерения важности переменных участвующих переменных в модели CART?

Что касается второй части вашего вопроса:

И как это можно вычислить с помощью R (например, при использовании пакета rpart)

Вы можете найти значение переменной, используя rpart, используя сводку (fit). Это выводит значение переменной среди нескольких других вещей. Вы можете прочитать больше об этом здесь: https://cran.r-project.org/web/packages/rpart/rpart.pdf . См. Стр. 25.


0

names(result) шоу variable.importance

result$variable.importance должно помочь?


3
Я полагаю, что вопрос больше связан с преимуществами или популярностью некоторых показателей переменной важности, чем с тем, как распечатать те, которые доступны в R для конкретного метода.
ЧЛ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.