2013-01-03 16 views
7

Sto cercando di classificarmi con randomForest, ma ricevo ripetutamente un messaggio di errore per il quale non sembra esserci alcuna soluzione apparente (randomForest ha funzionato bene per me fare regressione in passato). Ho incollato il mio codice qui sotto. 'successo' è un fattore, tutte le variabili dipendenti sono numeri. Qualche suggerimento su come eseguire correttamente questa classificazione?R randomForest per la classificazione

> rf_model<-randomForest(success~.,data=data.train,xtest=data.test[,2:9],ytest=data.test[,1],importance=TRUE,proximity=TRUE) 

Error in randomForest.default(m, y, ...) : 
    NA/NaN/Inf in foreign function call (arg 1) 

anche, ecco un esempio di dataset:

head(data)

success duration goal reward_count updates_count comments_count backers_count  min_reward_level max_reward_level 
True 20.00000 1500   10   14    2   68    1    1000 
True 30.00000 3000   10    4    3   48    5    1000 
True 24.40323 14000   23    6    10   540    5    1250 
True 31.95833 30000   9   17    7   173    1   10000 
True 28.13211 4000   10   23    97   2936    10    550 
True 30.00000 6000   16   16   130   2043    25    500 
+0

Senza un esempio completamente riproducibile, no. Per lo meno, vorrei (1) controllare che non ci siano valori NA nei tuoi dati, e (2) lanciare 'traceback()' per vedere se puoi ottenere alcune informazioni più dettagliate su dove si verifica l'errore. – joran

+0

prova a cambiare i valori "successo" in nomi di specie invece di "Veri". puoi come noi l'output di srt (dati) ?? –

+1

Sembra che tu abbia già accettato una risposta; Mi sono imbattuto in questo e ho trovato che per la classificazione, era dovuto alla mia variabile di risposta che era della classe 'chr'. O facendo 'data $ var <- as.factor (data $ var)', o predicendo con 'randomForest (as.factor (data $ var) ~., ...)' ha risolto questo problema per me. – Hendy

risposta

2

Hai provato regressione sugli stessi dati? in caso contrario, verificare i valori "Inf" nei dati e provare a rimuoverli, se presenti, dopo aver rimosso NA e NaN. Potete trovare le informazioni utili per quanto riguarda la rimozione Inf dal basso,

R is there a way to find Inf/-Inf values?

Esempio,

Class V1 V2 V3 V4 V5 V6 V7 V8 V9 
1 11 Inf 4 232 23 2 2 34 0.205567767 
1 11 123 4 232 23 1 2 34 0.162357601 
1 13 123 4 232 23 1 2 34 -0.002739357 
1 13 123 4 232 23 1 2 34 0.186989878 
2 67 14 4 232 67 1 2 34 0.109398677 
2 67 14 4 232 67 2 2 34 0.18491187 
2 67 14 4 232 34 2 2 34 0.098728256 
2 44 769.03 4 21 34 2 2 34 0.204405869 
2 44 34 4 11 34 1 2 34 0.218426408 

# When Classification was performed, following error pops out. 
rf_model<-randomForest(as.factor(Class)~.,data=data,importance=TRUE,proximity=TRUE) 
Error in randomForest.default(m, y, ...) : 
NA/NaN/Inf in foreign function call (arg 1) 

# Regression was performed, following error pops out. 
rf_model<-randomForest(Class~.,data=data,importance=TRUE,proximity=TRUE) 
Error in randomForest.default(m, y, ...) : 
NA/NaN/Inf in foreign function call (arg 1) 

Quindi, si prega di controllare con molta attenzione i vostri dati. Inoltre: Messaggio di avviso: In randomForest.default (m, y, ...): La risposta ha cinque o meno valori univoci. Sei sicuro di voler fare la regressione?

0

È perché ci sono più di 32 livelli per una delle variabili. Livelli significa valori distinti per una variabile. Rimuovi quella variabile e riprova.

8

Oltre ai fatti ovvi relativi alla presenza di NA, ecc., Questo errore è quasi sempre causato dalla presenza di tipi di caratteristiche di carattere nel set di dati. Il modo per capirlo è considerando cosa fa realmente la foresta casuale. Stai partizionando la funzione di set di dati per caratteristica. Quindi, se una delle caratteristiche è un vettore di caratteri, come partiresti partendo dal set di dati? Hai bisogno di categorie per partizionare un dato. Quanti "maschi" rispetto a "femmina" - categorie ...

Per le funzioni numeriche come Età o prezzo, è possibile creare categorie per bucketing; maggiore di una certa età, minore del prezzo certo ecc. Non è possibile farlo con le caratteristiche del personaggio puro. Pertanto, ne hai bisogno come fattori nel tuo set di dati.

5

In generale, ci sono 2 ragioni principali che si ottiene questo messaggio di errore:

  1. Se la cornice di dati contiene una colonna di carattere vettoriale, invece di fattori. Basta convertire la colonna dei caratteri in un fattore

2. Se i dati contengono valori errati, l'applicazione di una foresta casuale genererà anche questo errore. La testina non visualizzerà i valori anomali. Per esempio:

x = rep(x = sample(c(0,1)), times = 24)

y = c(sample.int(n=50,size = 40),Inf,Inf) 

df = data.frame(col1 = x , col2 = y) 

head(df) 
    col1 col2 
> 1 1 26 
> 2 0 33 
> 3 1 23 
> 4 0 21 
> 5 1 45 
> 6 0 27 

Ora applicando foresta casuale su df causerà lo stesso errore:

model = randomForest(data = df , col2 ~ col1 , ntree = 10)

Error in randomForest.default(m, y, ...) : NA/NaN/Inf in foreign function call (arg 2)

Soluzione: Consente di identificare i valori cattivi nel DF. Come indicato sopra il metodo is.finite() controlla se il vettore di input contiene valori finiti appropriati o meno.Per esempio:

is.finite(c(5,6,1000000,NaN,Inf))
[1] TRUE TRUE TRUE FALSE FALSE

Ora consente di identificare le colonne contenenti i valori cattivi nella nostra cornice di dati e li conta.

sum(!is.finite(as.vector(df[,names(df) %in% c("col2")])))
[1] 4
sum(!is.finite(as.vector(df[,names(df) %in% c("col1")])))
[1] 0

Lascia cadere questi record e prendere basta prendere i buoni dischi:

df1 =df[is.finite(as.vector(df[,names(df) %in% c("col2")])) &
is.finite(as.vector(df[,names(df) %in% c("col1")])) , ]

ed eseguire il foresta casuale, ancora una volta:

model1 = randomForest(data = df1 , col2 ~ col1 , ntree = 10)
Call:
randomForest(formula = col2 ~ col1, data = df1, ntree = 10)

0

Semplicemente convertendo tutte le colonne di fattore, è possibile evitare questo errore Anche io ero di fronte a questo errore. La colonna, in particolare, che non è stata convertita in fattore. Ho scritto appositamente per questo. E infine il mio codice ha funzionato.

Problemi correlati