10

Usando scikit-learn 0,10ejemplo simple que utiliza BernoulliNB (Bayes ingenuo clasificador) scikit-learn en Python - no puede explicar la clasificación

¿Por qué el siguiente fragmento de código trivial:

from sklearn.naive_bayes import * 

import sklearn 
from sklearn.naive_bayes import * 

print sklearn.__version__ 

X = np.array([ [1, 1, 1, 1, 1], 
       [0, 0, 0, 0, 0] ]) 
print "X: ", X 
Y = np.array([ 1, 2 ]) 
print "Y: ", Y 

clf = BernoulliNB() 
clf.fit(X, Y) 
print "Prediction:", clf.predict([0, 0, 0, 0, 0])  

Imprime una respuesta de "1"? Habiendo entrenado el modelo en [0,0,0,0,0] => 2 esperaba la respuesta "2".

y por qué reemplazar Y con

Y = np.array([ 3, 2 ]) 

Dale una clase diferente "2" como una respuesta (la correcta)? ¿No es solo una etiqueta de clase?

¿Alguien puede arrojar algo de luz sobre esto?

+0

Tienes razón, cambiar Y no debería cambiar nada. Podría reproducirme con el maestro actual. Supongo que esto tiene que ver con que el clasificador esté indeciso. –

+0

Usando 0.18.2, obtengo 2 sin cambiar alfa. – Aaron

Respuesta

5

Su conjunto de entrenamiento es demasiado pequeño como se puede demostrar por

clf.predict_proba(X) 

que produce

array([[ 0.5, 0.5], 
     [ 0.5, 0.5]]) 

lo que demuestra que el clasificador considera que todas las clasificaciones como equiprobables. Comparar con el ejemplo que se muestra en la documentación para BernoulliNB para los que predict_proba() rendimientos:

array([[ 2.71828146, 1.00000008, 1.00000004, 1.00000002, 1.  ], 
     [ 1.00000006, 2.7182802 , 1.00000004, 1.00000042, 1.00000007], 
     [ 1.00000003, 1.00000005, 2.71828149, 1.  , 1.00000003], 
     [ 1.00000371, 1.00000794, 1.00000008, 2.71824811, 1.00000068], 
     [ 1.00000007, 1.0000028 , 1.00000149, 2.71822455, 1.00001671], 
     [ 1.  , 1.00000007, 1.00000003, 1.00000027, 2.71828083]]) 

donde he aplicado a numpy.exp() resultados para hacerlos más legibles. Obviamente, las probabilidades ni siquiera son casi iguales y, de hecho, clasifican bien el conjunto de entrenamiento.

8

Por defecto, alfa, el parámetro de suavizado es uno. Como dijo msw, tu conjunto de entrenamiento es muy pequeño. Debido al suavizado, no queda información. Si configura alfa a un valor muy pequeño, debería ver el resultado que esperaba.

Cuestiones relacionadas