Ответ 1
По умолчанию альфа, параметр сглаживания один. Как сказал мбс, ваш тренировочный набор очень мал. Из-за сглаживания информации не осталось. Если вы установите альфа-значение очень маленькое, вы должны увидеть ожидаемый результат.
Использование 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" в качестве ответа (правильный)? Разве это не просто метка класса?
Может кто-то пролить свет на это?
По умолчанию альфа, параметр сглаживания один. Как сказал мбс, ваш тренировочный набор очень мал. Из-за сглаживания информации не осталось. Если вы установите альфа-значение очень маленькое, вы должны увидеть ожидаемый результат.
Ваш тренировочный набор слишком мал, как показано на
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()
к результатам, чтобы сделать их более читаемыми. Очевидно, что вероятности даже не близки к равным и фактически хорошо классифицируют обучающий набор.