5 votos

Naive Bayes falla con un predictor perfecto

Digamos que tengo una variable que predice perfectamente una de las clases en mis datos:

set.seed(668130)
dat <- iris
dat$X <- sample(1:3, nrow(iris), replace=TRUE)
    dat$X  <- ifelse(dat$Species=='setosa', 1, dat$X)
> table(dat$X, dat$Species)

    setosa versicolor virginica
  1     50         12        15
  2      0         18        15
  3      0         20        20

¿Por qué el NaiveBayes algoritmo de fallar sobre este conjunto de datos?

library(klaR)
> NaiveBayes(Species ~ ., dat)
Error in NaiveBayes.default(X, Y, ...) : 
  Zero variances for at least one class in variables: X

A mí me parece que sería razonable para la salida de una clasificación de 'setosa' 100% del tiempo, si X=1. Otros algoritmos (como randomForest) hacer esto:

library(randomForest)
> randomForest(Species ~ ., dat)

Call:
 randomForest(formula = Species ~ ., data = dat) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 2

        OOB estimate of  error rate: 4.67%
Confusion matrix:
           setosa versicolor virginica class.error
setosa         50          0         0        0.00
versicolor      0         47         3        0.06
virginica       0          4        46        0.08

Es el NaiveBayes algoritmo matemático definido en este caso? Sé el conjunto específico de datos es un poco artificial, pero el problema aparece de vez en cuando cuando estoy en la validación cruzada NaiveBayes modelos.

8voto

Serge - appTranslator Puntos 11916

Tenga en cuenta que dat$X en el código es una variable numérica. El NaiveBayes aplicación en klaR numéricos a las variables predictoras calcula la media y la desviación estándar de la variable de predicción en cada uno de los resultados de nivel. En lugar de lidiar con una desviación estándar de 0, el klaR autores decidieron lanzar un error.

Si cambias dat$X a un factor, va a crear tablas de clasificación es probable esperando. Alternativamente, el naiveBayes función en el e1071 paquete devolverá distribuciones con una desviación estándar de 0 si usted prefiere que más de tirar errores, o puede eliminar el stop(...) código hacia el final de la klaR:::NaiveBayes.default (a pesar de que puede causar problemas con la predicción y la representación de funciones en klaR).

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X