如何使用 BernoulliNB?
How do I use BernoulliNB?
我正在尝试使用 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
它工作正常并且您正在正确使用它(代码方面)。 Predicted A
是预测的 class 标签。在您的情况下,可能的标签由 O
定义,并且 1,2,3
和 Predicted A
将始终具有从该集合中提取的值。
对于概率,不能保证它们会是 =1
,事实上它们几乎永远不会是。
我认为你的困惑源于这样一个事实,即你正在向它提供已知的训练数据,但输出却不同?我的猜测是您的此处的训练数据太小,所以结果略有偏差。为它提供更多数据将提高它在这个已知训练集上的准确性。
我会注意到,您真正想要的是为其提供一个大型已知训练集,然后预测一个未知测试数据集。我也许可以详细了解为什么会这样,但我建议阅读有关 classifier 的教程(scikit 文档还不错,但任何教程都应该涵盖这一点)。
代码方面,我觉得一切都很好。
我正在尝试使用 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
它工作正常并且您正在正确使用它(代码方面)。 Predicted A
是预测的 class 标签。在您的情况下,可能的标签由 O
定义,并且 1,2,3
和 Predicted A
将始终具有从该集合中提取的值。
对于概率,不能保证它们会是 =1
,事实上它们几乎永远不会是。
我认为你的困惑源于这样一个事实,即你正在向它提供已知的训练数据,但输出却不同?我的猜测是您的此处的训练数据太小,所以结果略有偏差。为它提供更多数据将提高它在这个已知训练集上的准确性。
我会注意到,您真正想要的是为其提供一个大型已知训练集,然后预测一个未知测试数据集。我也许可以详细了解为什么会这样,但我建议阅读有关 classifier 的教程(scikit 文档还不错,但任何教程都应该涵盖这一点)。
代码方面,我觉得一切都很好。