Простой пример использования BernoulliNB (классификатор наивных байков) scikit-learn в python - не может объяснить классификацию

Использование scikit-learn 0.10

Почему следующий тривиальный фрагмент кода:

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] )    

Распечатайте ответ "1"? Обучив модель на [0,0,0,0,0] = > 2, я ожидал "2" в качестве ответа.

И почему замена Y на

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

Дайте другой класс "2" в качестве ответа (правильный)? Разве это не просто метка класса?

Может кто-то пролить свет на это?

Ответ 1

По умолчанию альфа, параметр сглаживания один. Как сказал мбс, ваш тренировочный набор очень мал. Из-за сглаживания информации не осталось. Если вы установите альфа-значение очень маленькое, вы должны увидеть ожидаемый результат.

Ответ 2

Ваш тренировочный набор слишком мал, как показано на

clf.predict_proba(X)

что дает

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

который показывает, что классификатор рассматривает все классификации как равновероятные. Сравните с образцом, показанным в документации для BernoulliNB, для которого predict_proba() дает:

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]])

где я применил numpy.exp() к результатам, чтобы сделать их более читаемыми. Очевидно, что вероятности даже не близки к равным и фактически хорошо классифицируют обучающий набор.