Neue Faktoren, die in den Trainingsdaten nicht enthalten sind

Antworten:

7

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)
Dex Groves
quelle
1
Obwohl dies sicherlich eine Problemumgehung ist, habe ich Bedenken hinsichtlich der Solidität dieses Ansatzes, da wir davon ausgehen, dass Trainings- und Testdaten vollständig getrennt nebeneinander existieren.
Tommyixi