2013-06-27 11 views
5

Quando si tenta di utilizzare l'uscita di randomForest per classificare nuovi dati (o anche i dati di training originale), ottengo il seguente errore:nuovi livelli di fattore non presenti nei dati di addestramento

> res.rf5 <- predict(model.rf5, train.rf5) 
Error in predict.randomForest(model.rf5, train.rf5) : 
    New factor levels not present in the training data 

Che cosa significa questo errore significare? Perché questo errore si verifica anche quando provo a prevedere gli stessi dati che ho usato per allenare?

Un piccolo esempio che può essere utilizzato per riprodurre l'errore è riportato di seguito.

train.rf5 <- structure(
    list(A = structure(c(2L, 1L, 1L, 1L, 1L, 1L, 3L, 1L, 1L, 3L), 
        .Label = c("(-0.1,19.9]", "(19.9,40]", "(80.1,100]"), 
        class = c("ordered", "factor")), 
     B = structure(c(3L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 4L), 
        .Label = c("1", "2", "4", "5"), 
        class = c("ordered", "factor")), 
     C = structure(c(1L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L), 
        .Label = c("FALSE", "TRUE"), 
        class = "factor")), 
    .Names = c("A", "B", "C"), 
    row.names = c(7L, 8L, 10L, 11L, 13L, 15L, 16L, 17L, 18L, 19L), 
    class = "data.frame") 

#    A B  C 
# 7 (19.9,40] 4 FALSE 
# 8 (-0.1,19.9] 1 FALSE 
# 10 (-0.1,19.9] 1 TRUE 
# 11 (-0.1,19.9] 1 FALSE 
# 13 (-0.1,19.9] 1 FALSE 
# 15 (-0.1,19.9] 1 TRUE 
# 16 (80.1,100] 2 TRUE 
# 17 (-0.1,19.9] 1 FALSE 
# 18 (-0.1,19.9] 1 FALSE 
# 19 (80.1,100] 5 TRUE 

require(randomForest) 
model.rf5 <- randomForest(C ~ ., data = train.rf5) 
res.rf5 <- predict(model.rf5, train.rf5) # Causes error 

vedo alcune domande possibilmente correlate sul SO, ma non credo che risolvere il mio problema direttamente

  1. dropping factor levels in a subsetted data frame in R
  2. Random forest package in R shows error during prediction() if there are new factor levels present in test data. Is there any way to avoid this error?

A differenza di 1), lo faccio non hanno livelli di fattore che non sono rappresentati nei dati, e diversamente da 2), i livelli dei fattori nei miei dati di test e di treno sono identici.

Edit: Ulteriori informazioni:

sessionInfo() 
R version 3.0.1 (2013-05-16) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=C     LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] randomForest_4.6-7 

loaded via a namespace (and not attached): 
[1] tools_3.0.1 
+0

Scommetto che ha qualcosa a che fare con i fattori ordinati. –

risposta

5

ho provato il mio speculazione che i fattori ordinate sono stati la fonte del problema, ed ottengo nessun errore quando l'unica cosa che faccio è rimuovere il "ordinato" dalle classi di quella struttura. Non vedo nella documentazione che i fattori ordinati non sono consentiti, ma non vedo che siano stati presi in considerazione in modo specifico. È possibile che questo non sia mai successo prima. Sembrerebbe che l'ordinamento imporrebbe ulteriori complessità e che, se si desidera che l'ordine sia tenuto in considerazione, è possibile offrire i "punteggi" as.numeric(.) all'algoritmo RF.

+0

Grazie DWin, vedo un thread vecchio del 2008 correlato, potrebbe essere lo stesso problema. https://stat.ethz.ch/pipermail/r-help/2008-April/160833.html – cyang

+0

Ahah. Sembra che sia caduto dal radar di Andy. Spero che il mio suggerimento di utilizzare una variabile punteggio derivata dal fattore ordinato abbia ancora valore. –

Problemi correlati