Novos níveis de fatores não presentes nos dados de treinamento

Respostas:

7

A RF lida com fatores codificando-os de uma só vez. Ele cria uma nova coluna fictícia para cada nível da variável fator. Quando há níveis de fator novos ou diferentes em um quadro de dados de pontuação, coisas ruins acontecem.

Se o trem e o teste existiram juntos na mesma estrutura de dados no ponto em que o fator foi definido, não há problema. Quando o teste tem seu fator definido separadamente, você recebe problemas.

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)

Você pode solucionar esse problema informando seus fatores de pontuação para corresponder aos dados de treinamento.

# 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
fonte
11
Embora essa seja certamente uma solução alternativa, tenho reservas quanto à consistência dessa abordagem, considerando que esperamos que os dados de treinamento e teste coexistam inteiramente separadamente.
Tommyixi 06/02