Як виміряти / класифікувати "змінну важливість" при використанні CART? (зокрема, використовуючи {rpart} з R)


27

Створюючи модель CART (конкретно дерево класифікації) за допомогою rpart (в R), часто цікаво знати, яке значення мають різні змінні, що вводяться в модель.

Отже, моє запитання таке: які спільні заходи існують для ранжирування / вимірювання значущості важливості змінних, що беруть участь у моделі 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

(посилання завжди вітаються)


чим це питання відрізняється від stats.stackexchange.com/questions/5443/… ?
steffen

Це питання стосується того, щоб знати, який предиктор мав значення для певного категоріального значення залежної змінної. Це питання є більш широким (змінна важливість / ранжирування без визначення того, на яке номінальне значення воно впливає). Оскільки на це запитання не відповіли, я вважав, що варто сформулювати його в більш загальному вигляді, сподіваючись, що хтось може допомогти ...
Тал Галілі

Відповіді:


42

Змінна важливість, як правило, може бути обчислена на основі відповідного зменшення точності прогнозування при видаленні предиктора, що цікавить (методом перестановки, як у випадковому лісі), або деякого показника зменшення домішки вузла, але див. (1) для огляду доступні методи. Очевидною альтернативою CART є RF звичайно ( randomForest , але дивіться також партію ). У РФ показник важливості Джині визначається як усереднене зменшення домішок вузлів Джіні для всіх дерев у лісі (випливає з того, що індекс домішки Джині для даного материнського вузла більший, ніж значення цього показника для його двох дочірні вузли, див. наприклад (2)).

Я знаю, що Каролін Стробл і полковник. внесли чимало симуляційних та експериментальних досліджень щодо (умовно) змінної важливості у ВЧ та КАРТ (наприклад, (3-4), але є чимало інших, або її дисертація, Статистичні проблеми машинного навчання - до надійного вибору розбиття та Заходи змінного значення ).

Наскільки мені відомо, пакет caret (5) розглядає лише функцію втрати для випадку регресії (тобто середню помилку в квадраті). Можливо, він буде доданий найближчим часом (у будь-якому випадку, приклад із класифікаційним випадком за допомогою k-NN можна знайти в он-лайн довідці dotPlot).

Однак, здається, у Ноеля М О'Бойля є якийсь код R для змінної важливості в CART .

Список літератури

  1. Сандрі та Цуколото. Алгоритм корекції зміщення для вимірювання важливості змінної Джині в класифікаційних деревах . 2008 рік
  2. Ізенман. Сучасні багатоваріантні статистичні методи . Спрингер 2008
  3. Strobl, Hothorn та Zeilis. Вечірка на! . R Journal 2009 1/2
  4. Strobl, Boulesteix, Kneib, Augustin та Zeilis. Умовно-змінне значення для випадкових лісів . BMC Bioinformatics 2008, 9: 307
  5. Кун. Побудова прогнозних моделей в 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

Я думаю, що 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 для певного методу.
chl
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.