Comment mesurer / classer «l'importance variable» lors de l'utilisation de CART? (en utilisant spécifiquement {rpart} de R)

27

Lors de la construction d'un modèle CART (spécifiquement l'arbre de classification) à l'aide de rpart (dans R), il est souvent intéressant de savoir quelle est l'importance des différentes variables introduites dans le modèle.

Ainsi, ma question est: Quelles sont les mesures communes existantes pour classer / mesurer l'importance des variables participantes dans un modèle CART? Et comment cela peut-il être calculé à l'aide de R (par exemple, lors de l'utilisation du package rpart)

Par exemple, voici un code factice, créé pour que vous puissiez y montrer vos solutions. Cet exemple est structuré de sorte qu'il est clair que les variables x1 et x2 sont "importantes" tandis que (dans un certain sens) x1 est plus important que x2 (puisque x1 devrait s'appliquer à plus de cas, donc avoir plus d'influence sur la structure des données, puis 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

(les références sont toujours les bienvenues)

Tal Galili
la source
en quoi cette question diffère-t-elle de stats.stackexchange.com/questions/5443/… ?
steffen
Cette question se réfère à savoir quel prédicteur était pertinent pour une valeur catégorielle particulière de la variable dépendante. Cette question est plus large (importance / classement variable sans détecter à quelle valeur nominale elle affecte). Comme cette question n'a pas reçu de réponse, j'ai pensé qu'il valait la peine de la formuler d'une manière plus générale dans l'espoir que quelqu'un puisse aider ...
Tal Galili

Réponses:

43

L'importance variable peut généralement être calculée sur la base de la réduction correspondante de la précision prédictive lorsque le prédicteur d'intérêt est supprimé (avec une technique de permutation, comme dans la forêt aléatoire) ou d'une certaine mesure de diminution de l'impureté du nœud, mais voir (1) pour un aperçu de méthodes disponibles. Une alternative évidente à CART est RF bien sûr ( randomForest , mais voir aussi fête ). Avec RF, l'indice d'importance de Gini est défini comme la diminution moyenne de Gini des impuretés des nœuds sur tous les arbres de la forêt (il résulte du fait que l'indice d'impureté de Gini pour un nœud parent donné est supérieur à la valeur de cette mesure pour ses deux nœuds filles, voir par exemple (2)).

Je sais que Carolin Strobl et coll. ont contribué à de nombreuses études de simulation et expérimentales sur l'importance des variables (conditionnelles) dans les RF et les CART (par exemple, (3-4), mais il y en a beaucoup d'autres, ou sa thèse, Statistical Issues in Machine Learning - Towards Reliable Split Selection and Mesures d’importance variable ).

À ma connaissance, le package caret (5) ne considère qu'une fonction de perte pour le cas de régression (c.-à-d. Erreur quadratique moyenne). Peut-être qu'il sera ajouté dans un proche avenir (de toute façon, un exemple avec un cas de classification par k-NN est disponible dans l'aide en ligne de dotPlot).

Cependant, Noel M O'Boyle semble avoir un code R pour l' importance variable dans CART .

Les références

  1. Sandri et Zuccolotto. Un algorithme de correction de biais pour la mesure d'importance variable de Gini dans les arbres de classification . 2008
  2. Izenman. Techniques statistiques multivariées modernes . Springer 2008
  3. Strobl, Hothorn et Zeilis. Faites la fête! . R Journal 2009 1/2
  4. Strobl, Boulesteix, Kneib, Augustin et Zeilis. Importance variable conditionnelle pour les forêts aléatoires . BMC Bioinformatics 2008, 9: 307
  5. Kuhn. Création de modèles prédictifs dans R à l'aide du package caret . JSS 2008 28 (5)
chl
la source
1
Vraiment - mérite bien plus de votes qu'il n'en a.
Matt Parker,
+1 pour la bonne réponse. Et la mise à jour pour les retardataires (comme moi) importance()dans randomForest a une importance variable individuelle avec une diminution moyenne de la précision et une diminution moyenne de Gini.
Zhubarb
3

La fonction suivante (du package Caret) peut être utilisée pour évaluer l'importance variable dans les arbres rpart. J'ai corrigé un bogue dans la fonction Caret lorsque ce seul nœud racine dans l'arbre.

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

}

Le code r suivant produira des scores d'importance pour un arbre rpart "fit"

 varImp(fit)
inondation
la source
1
Merci. Avez-vous signalé le bogue à Max? (le mainteneur du package caret)
Tal Galili
1

Je pense que chl a à peu près répondu à la première partie:

Quelles mesures communes existent pour classer / mesurer l'importance des variables des variables participantes dans un modèle CART?

En ce qui concerne la deuxième partie de votre question:

Et comment cela peut-il être calculé à l'aide de R (par exemple, lors de l'utilisation du package rpart)

Vous pouvez trouver l'importance variable à l'aide de rpart en utilisant le résumé (fit). Cela génère l'importance variable entre plusieurs autres choses. Vous pouvez en savoir plus à ce sujet ici: https://cran.r-project.org/web/packages/rpart/rpart.pdf . Reportez-vous à la page 25.

Jash Shah
la source
0

names(result) spectacles variable.importance

result$variable.importance devrait aider?

shubh
la source
3
Je crois que la question a plus à voir avec les avantages ou la popularité de certaines mesures d'importance variable que la façon d'imprimer celles disponibles en R pour une méthode particulière.
chl