randomForest et bug d'importance variable?

10

Je n'ai pas la différence entre le rfobject$importanceet importance(rfobject)dans la colonne MeanDecreaseAccuracy.

Exemple:

> data("iris")
> fit <- randomForest(Species~., data=iris, importance=TRUE)
> fit$importance
                  setosa  versicolor   virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 0.027078501 0.019418330 0.040497602           0.02898837         9.173648
Sepal.Width  0.008553449 0.001962036 0.006951771           0.00575489         2.472105
Petal.Length 0.313303381 0.291818815 0.280981959           0.29216790        41.284869
Petal.Width  0.349686983 0.318527008 0.270975757           0.31054451        46.323415
> importance(fit)
               setosa versicolor virginica MeanDecreaseAccuracy MeanDecreaseGini
Sepal.Length 1.277324   1.632586  1.758101            1.2233029         9.173648
Sepal.Width  1.007943   0.252736  1.014141            0.6293145         2.472105
Petal.Length 3.685513   4.434083  4.133621            2.5139980        41.284869
Petal.Width  3.896375   4.421567  4.385642            2.5371353        46.323415
> 

J'obtiens des valeurs MeanDecreaseAccuracy différentes mais j'ai le même ordre pour les variables d'importance (pour fit$importanceet pour importance(fit)):

  1. Petal.Width

  2. Pétale.Longueur

  3. Sepal.Length

  4. Sepal.Width

Mais dans d'autres ensembles de données, je reçois parfois des commandes différentes. Quelqu'un peut-il expliquer ce qui se passe ici? Est-ce peut-être un bug?


Modifier (en réponse à Martin O'Leary )

D'accord merci! J'ai remarqué autre chose.

En jetant un œil à la rfcv()fonction, j'ai remarqué la ligne:

impvar <- (1:p)[order(all.rf$importance[, 1], decreasing = TRUE)]

avec cette ligne, nous choisissons la première colonne all.rf$importancequi nous donne l'ordre des mesures spécifiques à la classe (pour le premier facteur ) calculées comme une diminution moyenne de la précision uniquement. Cela n'a pas toujours le même ordre que la diminution moyenne de la précision sur toutes les classes ( MeanDecreaseAccuracy). Ne serait - il mieux choisir soit la MeanDecreaseAccuracyou MeanDecreaseGinicolonne, ou mieux en utilisant la importance()-fonction pour les valeurs mises à l' échelle? Nous aurions donc un nombre séquentiellement réduit de prédicteurs classés par importance variable (sur toutes les classes) et non seulement classés par importance variable pour la première classe.

Giuseppe
la source

Réponses:

13

Non, ce n'est pas un bug. Les valeurs indiquées dans ne fit$importancesont pas mises à l'échelle, tandis que les valeurs données par importance(fit)sont exprimées en termes d'écarts types (tels que donnés par fit$importanceSD). Il s'agit généralement d'une mesure plus significative. Si vous voulez les valeurs "brutes", vous pouvez les utiliser importance(fit, scale=FALSE).

En général, c'est une très mauvaise idée de s'appuyer sur les détails internes d'un objet en forme, lorsqu'une fonction d'extraction est fournie. Il n'y a aucune garantie quant au contenu de fit$importance- ils pourraient changer radicalement d'une version à l'autre sans préavis. Vous devez toujours utiliser la fonction d'extraction lorsqu'elle est fournie.


Edit: Oui, cette ligne rfcv()ressemble à un bug, ou du moins à un comportement involontaire. C'est en fait un bon exemple de pourquoi vous ne devriez pas vous fier au contenu de choses comme fit$importance. Si l'ajustement concerne une forêt de régression, la première colonne de fit$importanceest %IncMSEéquivalente à importance(fit, type=1). Cependant, cela ne vaut pas dans le cas de la classification, où vous avez des colonnes supplémentaires pour chaque niveau de facteur.

Martin O'Leary
la source