2013-07-28 14 views
10

Iniziare a scrivere questa domanda e quindi capire la risposta. Andando a metterlo qui per i posteri, dal momento che è stato difficile trovare risposte su questo.Perché naiveBayes restituisce tutte le NA per la classificazione multiclasse in R?

Sto tentando di utilizzare il classificatore naiveBayes dal pacchetto e1071. Sembra non avere problemi a generare le previsioni per i nuovi dati, ma in realtà ho bisogno delle stime di probabilità per le classi dei nuovi dati.

Esempio:

> model <- naiveBayes(formula=as.factor(V11)~., data=table, laplace=3) 
> predict(model, table[,1:10]) 
[1] 4 4 4 4 4 4 4 4 1 1 1 3 3 1 1 
> predict(model, table[,1:10], type="raw") 
     1 2 3 4 
[1,] NA NA NA NA 
[2,] NA NA NA NA 
[3,] NA NA NA NA 
[4,] NA NA NA NA 
[5,] NA NA NA NA 
[6,] NA NA NA NA 
[7,] NA NA NA NA 
[8,] NA NA NA NA 
[9,] NA NA NA NA 
[10,] NA NA NA NA 
[11,] NA NA NA NA 
[12,] NA NA NA NA 
[13,] NA NA NA NA 
[14,] NA NA NA NA 
[15,] NA NA NA NA 

Questo mi sembra assurdo, dal momento che il fatto che il modello è in grado di previsioni di uscita significa che deve avere stime di probabilità per le classi. Cosa sta causando questo strano comportamento?

Alcune cose che ho già provato senza successo:

  • tipo aggiungendo = "raw" alla chiamata del modello di costruzione.
  • Usando i NaiveBayes funzionano dal pacchetto Klar invece (che non può gestire il

un esempio di alcuni dati che produce questo errore:.

table[1:5,] 
    V1 V2  V3   V4  V5  V6  V7  V8  V9 
1 0 0 0.000000 0.0000000 0.000000 0.0000000 0.6711444 0.7110409 0.0000000 
2 0 0 0.000000 0.0000000 -1.345804 2.1978370 0.6711444 0.7110409 0.0000000 
3 0 0 1.923538 -3.6718725 0.000000 0.0000000 0.0000000 0.0000000 0.8980172 
4 0 0 1.923538 -0.4079858 0.000000 0.0000000 0.0000000 0.0000000 0.8980172 
5 0 0 0.000000 0.0000000 -1.345804 0.2930449 0.6711444 0.7110409 0.0000000 
     V10 V11 
1 0.0000000 6 
2 0.0000000 3 
3 -3.1316213 2 
4 -0.2170431 5 
5 0.0000000 4 
+0

Per renderlo più riproducibile, sarebbe bello se si potesse aggiungere alcuni dati con cui potremmo risolvere lo stesso errore. – Arun

+0

@Arun sicuro. Ne metterò un po 'adesso. –

+0

grazie per aver tenuto conto dei miei suggerimenti. Una cosa. Hai menzionato 'as.factor (V17)' nel tuo codice, ma ci sono 11 colonne nei dati .. Mi manca qualcosa qui o ci dovrebbero essere più colonne in 'table'? Anche 'dput (head (table))' forse meglio copiare/incollare i tuoi dati affinché altri possano riprodurli. – Arun

risposta

9

Questo accade perché uno dei classi il set di dati ha una sola istanza

Una semplice soluzione per la mia applicazione era quella di clonare quella registrazione e aggiungere una piccola quantità di rumore, dopo di che prevedere come funziona.

Modifica: sembra che l'aggiunta di rumore non sia sempre richiesta. Ecco un esempio molto semplice che risolve il set di dati scritto in questione, con la semplice aggiunta di una copia extra di ogni riga della tabella:

> table <- as.data.frame(rbind(as.matrix(table),as.matrix(table)) 
> nms <- colnames(table) 
> model <- naiveBayes(table[,1:length(nms)-1], factor(table[,length(nms)])) 
> predict(model, table[,1:(length(nms)-1)], type='raw') 
       2   3   4   5   6 
[1,] 2.480502e-34 6.283185e-12 6.283185e-12 2.480502e-34 1.000000e+00 
[2,] 1.558542e-45 9.999975e-01 2.506622e-06 1.558542e-45 6.283170e-12 
[3,] 1.000000e+00 1.558545e-45 1.558545e-45 6.283185e-12 2.480502e-34 
[4,] 6.283185e-12 1.558545e-45 1.558545e-45 1.000000e+00 2.480502e-34 
[5,] 1.558542e-45 2.506622e-06 9.999975e-01 1.558542e-45 6.283170e-12 
[6,] 2.480502e-34 6.283185e-12 6.283185e-12 2.480502e-34 1.000000e+00 
[7,] 1.558542e-45 9.999975e-01 2.506622e-06 1.558542e-45 6.283170e-12 
[8,] 1.000000e+00 1.558545e-45 1.558545e-45 6.283185e-12 2.480502e-34 
[9,] 6.283185e-12 1.558545e-45 1.558545e-45 1.000000e+00 2.480502e-34 
[10,] 1.558542e-45 2.506622e-06 9.999975e-01 1.558542e-45 6.283170e-12 
+0

E invece di dirlo a parole, se potessi condividere il codice, sarebbe molto più Se potessi implementare entrambi i miei suggerimenti, sarei felice di fare +1 su Q & A. – Arun

+0

@Arun. Una buona idea Grazie per i tuoi suggerimenti! –

Problemi correlati