Random Forest Variable Importance Plot Discrepancy?

Oct 27 2020

Estou usando o seguinte código para obter o gráfico de importância da variável Random Forest:

statRF <- randomForest(formula = Trend ~ ., data = data[,features], sampsize=c(600,600,600),mtry=6, ntree=500, importance=TRUE)
varImpPlot(statRF, cex=1.2)

No entanto, quando tento extrair a diminuição média na precisão, obtenho uma importância variável completamente diferente

statRF$importance Decreasing Increasing No Trend MeanDecreaseAccuracy MeanDecreaseGini EcoRegion 0.005331568 0.002025101 6.025702e-05 0.0009792462 6.340508 Geology 0.009487879 0.004385796 4.427072e-03 0.0047468217 25.811581 Avg1980 0.068535362 0.026512398 6.766761e-03 0.0165637391 171.622158 Fire_Group 0.114414044 0.023774639 1.941874e-02 0.0269273991 52.122888 FLOW_SUM 0.009836593 0.009120500 5.692553e-03 0.0069617922 130.574740 MEAN_SLOPE 0.011427702 0.003421026 2.723633e-03 0.0034971800 134.810582 MEAN_ELEVATION 0.071074497 0.027537933 3.030051e-02 0.0321650097 167.462789 NEAR_DIST 0.018364729 0.004711747 9.081642e-04 0.0031616073 133.859939 Latitude 0.065935569 0.035386208 2.414563e-02 0.0301581377 176.920755 Longtitude 0.098719411 0.060942430 4.483657e-02 0.0530569867 200.474059 sort(statRF$importance[,4], decreasing=TRUE)
    Longtitude MEAN_ELEVATION       Latitude     Fire_Group        Avg1980       FLOW_SUM        Geology 
  0.0530569867   0.0321650097   0.0301581377   0.0269273991   0.0165637391   0.0069617922   0.0047468217 
    MEAN_SLOPE      NEAR_DIST      EcoRegion 
  0.0034971800   0.0031616073   0.0009792462

Notavelmente, a elevação é agora a segunda variável "mais importante" em vez da quarta e de algumas outras opções na posição de variáveis ​​diferentes.

varImpPlotQuer saber se a função está plotando algo diferente da variável MeanDecreaseAccuracy do modelo de floresta aleatório? Se sim, como faço para obter esses valores?

EDIT: Posso obter os valores de MeanDecreaseAccuracy do primeiro gráfico com o seguinte código:

var.imp <- varImpPlot(statRF)
var.imp <- as.data.frame(var.imp)

var.imp
                  MeanDecreaseAccuracy MeanDecreaseGini
EcoRegion                  4.939973         6.340508
Geology                   16.326295        25.811581
Avg1980                   34.301641       171.622158
Fire_Group                49.419724        52.122888
FLOW_SUM                  18.991762       130.574740
MEAN_SLOPE                12.053575       134.810582
MEAN_ELEVATION            47.251207       167.462789
NEAR_DIST                 10.508457       133.859939
Latitude                  52.898975       176.920755
Longtitude                74.645221       200.474059

Mas ainda não estou claro por que a escala e a ordem são diferentes em statRF$importance.

Respostas

2 StupidWolf Oct 27 2020 at 18:40

A importância da variável no gráfico final é escalada por seus erros padrão, se você verificar a página de ajuda para o gráfico varImp, o argumento padrão é o scale=TRUEque é passado para a função importance. Para recuperar os valores escalados, você pode usar a importance()função como abaixo:

library(randomForest)
set.seed(111)
fit = randomForest(Species ~ .,data=iris,importance=TRUE)

importance(fit,scale=TRUE)
                setosa versicolor virginica MeanDecreaseAccuracy
Sepal.Length  6.716993  7.4654657  7.697842            10.869088
Sepal.Width   4.581990 -0.5208697  4.224459             3.772957
Petal.Length 22.155981 33.0549839 27.892363            33.272150
Petal.Width  22.497643 31.4966353 31.589361            33.123064
             MeanDecreaseGini
Sepal.Length         9.333510
Sepal.Width          2.425592
Petal.Length        43.324744
Petal.Width         44.146107

Ou para ver como isso é calculado, você:

fit$importance[,1:4] / fit$importanceSD

                setosa versicolor virginica MeanDecreaseAccuracy
Sepal.Length  6.716993  7.4654657  7.697842            10.869088
Sepal.Width   4.581990 -0.5208697  4.224459             3.772957
Petal.Length 22.155981 33.0549839 27.892363            33.272150
Petal.Width  22.497643 31.4966353 31.589361            33.123064