Ich erhalte den Fehler "Neue Faktoren, die in den Trainingsdaten nicht vorhanden sind". Aber ich habe die Ebenen und Klassen für jede Spalte in der Entwicklung sowie die Testdaten überprüft und sie sind gleich. Eine plausible Erklärung?
Ich erhalte den Fehler "Neue Faktoren, die in den Trainingsdaten nicht vorhanden sind". Aber ich habe die Ebenen und Klassen für jede Spalte in der Entwicklung sowie die Testdaten überprüft und sie sind gleich. Eine plausible Erklärung?
Antworten:
RF behandelt Faktoren durch One-Hot-Codierung. Es wird eine neue Dummy-Spalte für jede Ebene der Faktorvariablen erstellt. Wenn ein Scoring-Datenrahmen neue oder andere Faktorstufen enthält, passieren schlimme Dinge.
Wenn der Zug und der Test zum Zeitpunkt der Definition des Faktors zusammen in derselben Datenstruktur vorhanden waren, liegt kein Problem vor. Wenn der Faktor des Tests separat definiert ist, treten Probleme auf.
library("randomForest")
# Fit an RF on a few numerics and a factor. Give test set a new level.
N <- 100
df <- data.frame(num1 = rnorm(N),
num2 = rnorm(N),
fac = sample(letters[1:4], N, TRUE),
y = rnorm(N),
stringsAsFactors = FALSE)
df[100, "fac"] <- "a suffusion of yellow"
df$fac <- as.factor(df$fac)
train <- df[1:50, ]
test <- df[51:100, ]
rf <- randomForest(y ~ ., data=train)
# This is fine, even though the "yellow" level doesn't exist in train, RF
# is aware that it is a valid factor level
predict(rf, test)
# This is not fine. The factor level is introduced and RF can't know of it
test$fac <- as.character(test$fac)
test[50, "fac"] <- "toyota corolla"
test$fac <- as.factor(test$fac)
predict(rf, test)
Sie können dieses Problem umgehen, indem Sie Ihre Bewertungsfaktoren so angeben, dass sie mit den Trainingsdaten übereinstimmen.
# Can get around by relevelling the new factor. "toyota corolla" becomes NA
test$fac <- factor(test$fac, levels = levels(train$fac))
predict(rf, test)