Как я могу использовать BernoulliNB? - PullRequest
0 голосов
/ 18 октября 2018

Я пытаюсь использовать BernoulliNB.Используя те же данные для обучения и тестирования, я получаю прогнозы, отличные от данных обучения и вероятностей, отличных от 1. Почему это так?

import pandas as pd
from sklearn.naive_bayes import BernoulliNB
BNB = BernoulliNB()

# Data
df_1 = pd.DataFrame({'O' : [1,2,3,1,1,3,1,2,2,1],
                     'I1': [1,0,0,1,0,0,1,1,0,1],
                     'I2': [0,0,1,0,0,1,0,0,1,0],
                     'I3': [1,0,0,0,0,0,1,0,0,0]})

df_I = df_1.iloc[:,1:4]
S_O  = df_1['O']

# Bernoulli Naive Bayes Classifier
A_F = BNB.fit(df_I, S_O)
A_P = BNB.predict(df_I)
A_R = BNB.predict_proba(df_I)

df_P = pd.DataFrame(A_P)
df_R = pd.DataFrame(A_R)

df_P.columns = ['Predicted A']
df_R.columns = ['Prob 1', 'Prob 2', 'Prob 3']

df_1 = df_1.join(df_P)
df_1 = df_1.join(df_R)

Результаты

O   I1  I2  I3  Predicted A Prob 1  Prob 2  Prob 3
1   1   0   1   1           .80     .15     .05
2   0   0   0   2           .59     .33     .08
3   0   1   0   3           .18     .39     .43
1   1   0   0   1           .59     .33     .08
1   0   0   0   2           .59     .33     .08
3   0   1   0   3           .18     .39     .43
1   1   0   1   1           .80     .15     .48
2   1   0   0   1           .59     .33     .08
2   0   1   0   3           .18     .39     .43
1   1   0   0   1           .59     .33     .08

Я попытался описать, что я пытаюсь сделать, здесь:

https://stats.stackexchange.com/questions/367829/how-probable-is-a-set

1 Ответ

0 голосов
/ 22 октября 2018

Он работает правильно, и вы используете его правильно (по кодам).Predicted A - метка предсказанного класса.В вашем случае возможные метки определены как O, а 1,2,3 и Predicted A всегда будут иметь значения, взятые из этого набора.

Для вероятностей нет гарантии, что они будут =1на самом деле их почти никогда не будет.

Я думаю, что ваша путаница проистекает из того факта, что вы предоставляете ему известные тренировочные данные, и все же результат отличается?Я предполагаю, что ваши тренировочные данные здесь слишком малы , поэтому они немного отличаются.Подача этого большего количества данных повысит его точность в этом известном тренировочном наборе.

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

С точки зрения кода, все выглядит хорошодля меня.

...