2017-01-12 2 views
2

J'ai utilisé le package forestFloor pour visualiser la structure du modèle de forêt aléatoire. Tout s'est bien passé jusqu'à ce que j'essaie d'utiliser forestFloor() sur une sortie de forêt aléatoire du package caret. J'ai besoin d'utiliser caret au lieu de randomForest pour mon ensemble de données car j'ai des classes gravement déséquilibrées, donc en utilisant la stratégie d'échantillonnage SMOTE. J'ai corrigé quelques choses, en passant keep.inbag=TRUE et keep.forest=TRUE en caret::train, puis en trouvant l'objet randomForest caché dans l'objet de classe train, $finalModel.Comment utiliser forestFloor() sur la sortie randomForest du paquet caret?

Je reçois toujours l'erreur: Error in eval(substitute(expr), envir, enclos) : index out of bounds

S'il vous plaît voir l'exemple de travail minimale suivante, tirée de l'ensemble de données du diabète Indiens Pima mlbench. Merci d'avance!

> sessionInfo() 
R version 3.3.2 (2016-10-31) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Ubuntu 14.04.5 LTS 

other attached packages: 
[1] DMwR_0.4.1   caret_6.0-70  ggplot2_2.1.0  
[4] lattice_0.20-34  forestFloor_1.9.5 randomForest_4.6-12 
[7] mlbench_2.1-1 

library(mlbench) 
library(randomForest) 
library(forestFloor) 

data(PimaIndiansDiabetes) 
y = PimaIndiansDiabetes$diabetes 
X = PimaIndiansDiabetes 
X = X[,!names(X)=="diabetes"] 
rf.randomForest = randomForest(X,y,sampsize=25,ntree=5000,mtry=4, 
keep.inbag = T,keep.forest = T) 

## Use forestFloor on randomForest output, works great 
ff = forestFloor(rf.randomForest,X,binary_reg = T,calc_np=T) 
Col = fcol(ff,cols=1,outlier.lim = 2.5) 
plot(ff,col=Col,plot_GOF = T) 

## Now fit random forest using SMOTE from caret package 
ctrl <- trainControl(method = "cv", number=5, 
        classProbs = TRUE, 
        summaryFunction = twoClassSummary, 
        sampling = "smote") 
rf.SMOTE <- train(x=X,y=y, 
         method = "rf", 
         tuneGrid = data.frame(mtry = 3), 
         metric = "ROC", 
         trControl = ctrl, 
         keep.inbag=TRUE, 
         keep.forest=TRUE) 
rf.caret <- rf.SMOTE$finalModel 

## Use forestFloor on caret output, throws error 
ff = forestFloor(rf.caret,X,binary_reg = T,calc_np=T) 
+0

Avez-vous déjà trouvé une solution pour cela? – Pete900

+0

Sorte de ... ce n'est pas l'ensemble du paquet 'caret', juste le rééchantillonnage SMOTE. Soren a répondu avec un correctif potentiel mais je ne l'ai pas encore essayé: https://github.com/sorhawell/forestFloor/issues/22 – bstock

Répondre

0

avec compris cela l'aide de Soren: https://github.com/sorhawell/forestFloor/issues/22. Sorel: Le problème est que la version caret de SMOTE rééchantillonne les données d'apprentissage et les enregistre ailleurs (?). Pour estimer les contributions de fonctionnalité, vous devez transmettre le même jeu de données (X) que celui utilisé pour la formation à forestFloor. Les calculs de contribution de caractéristiques avec forestFloor reposent sur l'échantillonnage hors sac et la matrice d'entrée pour correspondre à l'ensemble d'apprentissage fourni.

Correction: il est possible d'utiliser la fonction SMOTE dans le package DMwR au lieu d'utiliser SMOTE dans le package caret. DMwR::SMOTE renvoie les données d'entraînement ré-échantillonnées que vous pouvez ensuite mettre dans randomForest puis forestFloor.

library(randomForest) 
library(DMwR) 
library(forestFloor) 
# covar = names of covariate/feature column names (character vector) 
# target = response column names (character) 
X <- cbind(dat[,covar], factor(dat[,target])) 
names(X) <- c(covar, target) 
bin.formula <- formula(paste0(target," ~ ",paste0(covar,collapse=" + "))) 
X.SMOTE <- SMOTE(bin.formula, data=X, k=5) 
rf.SMOTE <- randomForest(x=X.SMOTE[,covar], y=X.SMOTE[,target], keep.inbag=T, ...) 
ff.bin = forestFloor(rf.fit = rf.SMOTE, X = X.SMOTE[,covar])