R erreur de forêt aléatoire - type de prédicteurs dans les nouvelles données ne correspondent pas

j'essaie d'utiliser la fonction de régression de quantile dans R (quantregForest) qui est construit sur Random Forest package. J'obtiens une erreur d'inadéquation de type que je ne peux pas tout à fait comprendre pourquoi.

je forme le modèle en utilisant

qrf <- quantregForest(x = xtrain, y = ytrain)

qui fonctionne sans problème, mais lorsque j'essaie de tester avec de nouvelles données telles que

quant.newdata <- predict(qrf, newdata= xtest)

il donne l'erreur suivante:

Error in predict.quantregForest(qrf, newdata = xtest) : 
Type of predictors in new data do not match types of the training data.

mes données de formation et d'essai proviennent de sources distinctes fichiers (donc cadres de données séparés) mais ayant le même format. J'ai vérifié les catégories de prédicteurs

sapply(xtrain, class)
sapply(xtest, class)

Voici la sortie:

> sapply(xtrain, class)
pred1     pred2     pred3     pred4     pred5     pred6     pred7     pred8 
"factor" "integer" "integer" "integer"  "factor"  "factor" "integer"  "factor" 
pred9    pred10    pred11    pred12 
"factor"  "factor"  "factor"  "factor" 


> sapply(xtest, class)
pred1     pred2     pred3     pred4     pred5     pred6     pred7     pred8 
"factor" "integer" "integer" "integer"  "factor"  "factor" "integer"  "factor" 
pred9    pred10    pred11    pred12 
"factor"  "factor"  "factor"  "factor" 

Ils sont exactement les mêmes. J'ai aussi vérifié les valeurs de "NA". Ni xtrain ni xtest n'ont de valeur NA. Est-ce que je manque quelque chose de banal ici?

I mise à Jour: l'exécution de la prédiction sur les données d'apprentissage donne toujours la même erreur

> quant.newdata <- predict(qrf, newdata = xtrain)
Error in predict.quantregForest(qrf, newdata = xtrain) : 
names of predictor variables do not match

mise à jour II: j'ai combiné ma formation et les jeux de tests de sorte que les lignes de 1 à 101 sont les données de formation et le reste est le test. J'ai modifié l'exemple fourni dans la (quantregForest):

data <-  read.table("toy.txt", header = T)
n <- nrow(data)
indextrain <- 1:101
xtrain <- data[indextrain, 3:14]
xtest <- data[-indextrain, 3:14]
ytrain <- data[indextrain, 15]
ytest <- data[-indextrain, 15]

qrf <- quantregForest(x=xtrain, y=ytrain)
quant.newdata <- predict(qrf, newdata= xtest)

et ça marche! J'apprécierais que quelqu'un explique pourquoi ça marche de cette façon et pas de l'autre.

19
demandé sur Gizem 2014-07-18 20:19:47

6 réponses

@mgoldwasser a raison en général, mais il y a aussi un très méchant bug dans predict.randomForest: Même si vous avez exactement les mêmes niveaux dans la formation et dans la prédiction, il est possible d'obtenir cette erreur. Cela est possible lorsque vous avez un facteur où vous avez intégré NA comme niveau séparé. Le problème est que predict.randomForest fait essentiellement ce qui suit:

# Assume your original factor has two "proper" levels + NA level:
f <- factor(c(0,1,NA), exclude=NULL)

length(levels(f)) # => 3
levels(f)         # => "0" "1" NA

# Note that
sum(is.na(f))     # => 0
# i.e., the values of the factor are not `NA` only the corresponding level is.

# Internally predict.randomForest passes the factor (the one of the training set)
# through the function `factor(.)`.
# Unfortunately, it does _not_ do this for the prediction set.
# See what happens to f if we do that:
pf <- factor(f)

length(levels(pf)) # => 2
levels(pf)         # => "0" "1"

# In other words:
length(levels(f)) != length(levels(factor(f))) 
# => sad but TRUE

ainsi, il sera toujours jeter le NA niveau à partir de l'ensemble d'entraînement et verra toujours un niveau dans l'ensemble des estimations.

une solution de contournement est de remplacer la valeur NA du niveau de l'avant à l'aide de randomForest:

levels(f)[is.na(levels(f))] <- "NA"
levels(f) # => "0"  "1"  "NA"
          #              .... note that this is no longer a plain `NA`

appel factor(f) ne rejette pas le niveau, et le contrôle réussit.

16
répondu bluenote10 2015-02-22 15:41:20

cela se produit parce que vos variables de facteur dans le jeu d'entraînement et le jeu de test ont des niveaux différents(pour être plus précis, le jeu de test n'a pas certains des niveaux présents dans l'entraînement). Ainsi, vous pouvez résoudre cela par exemple en utilisant le code ci-dessous pour toutes vos variables de facteur.:

levels(test$SectionName) <- levels(train$SectionName)
14
répondu Rohit Kumar Singh 2018-10-03 20:25:11

j'ai eu le même problème. Vous pouvez essayer d'utiliser un petit truc pour égaliser les classes de formation et d'essai. Liez la première ligne de l'ensemble d'entraînement à l'ensemble d'essai et supprimez-la. Pour votre exemple, il devrait ressembler à ceci:

    xtest <- rbind(xtrain[1, ] , xtest)
    xtest <- xtest[-1,]
13
répondu Dejan Pljevljakusic 2016-06-29 10:47:14

développer la solution de @user1849895:

common <- intersect(names(train), names(test)) 
for (p in common) { 
  if (class(train[[p]]) == "factor") { 
    levels(test[[p]]) <- levels(train[[p]]) 
  } 
}
11
répondu James Hirschorn 2016-03-23 05:13:41

C'est un problème avec les niveaux de chacun des facteurs différents. Vous devez vérifier pour vous assurer que vos niveaux de facteur restent cohérents entre votre test et les ensembles de formation.

c'est une étrange bizarrerie de random forest, et ça n'a pas de sens pour moi.

2
répondu mgoldwasser 2014-09-30 17:55:03

j'ai résolu de la manière suivante:

## Creating sample data
values_development=factor(c("a", "b", "c")) ## Values used when building the random forest model
values_production=factor(c("a", "b", "c", "ooops")) ## New values to used when using the model

## Deleting cases which were not present when developing
values_production=sapply(as.character(values_production), function(x) if(x %in% values_development) x else NA)

## Creating the factor variable, (with the correct NA value level)
values_production=factor(values_production)

## Checking
values_production # =>  a     b     c  <NA> 
0
répondu pablo_sci 2016-02-12 19:14:43