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.
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.
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)
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,]
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]])
}
}
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.
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>