使用朴素贝叶斯计算测试数据的概率

Posted

技术标签:

【中文标题】使用朴素贝叶斯计算测试数据的概率【英文标题】:Computing probability on a test data with Naive Bayes 【发布时间】:2021-10-07 05:37:57 【问题描述】:

我正在使用以下代码使用朴素贝叶斯预测 SMS 文本的输出

from sklearn.naive_bayes import MultinomialNB
mnb=MultinomialNB()
mnb.fit(X,Y)
X_test = np.array(['This is a sample sms'], dtype=object)

X_test_transformed = vec.transform(X_test)

X_test = X_transformed.toarray()

proba=mnb.predict_proba(X_test)
print(proba)

我在 X、Y 上使用 fit 函数训练模型。现在我想预测 SMS This is a sample sms 是否为垃圾邮件。我不确定我做错了什么 因为最后一行应该给我一个概率。但它给了我以下输出enter image description here

 [[9.99999987e-01 1.30424974e-08]
 [9.99996703e-01 3.29712871e-06]
 [1.15232279e-22 1.00000000e+00]
 ...
 [9.62666043e-01 3.73339566e-02]
 [9.99984562e-01 1.54382674e-05]
 [9.66244280e-01 3.37557203e-02]]

【问题讨论】:

概率为1.0,因为已经观察到了测试数据。 未正确观察。我创建了一个新的X_test ,它是新数据。即使它是 0,我也不确定为什么它会返回二维矩阵而不是单个值 我在另一篇帖子***.com/questions/36681449/… 中看到了类似的内容,它解释了一些但仍不完全清楚。我是否必须将第二列中的值相加? 注意:这是一个贝叶斯笑话。 【参考方案1】:

请注意,对于每一行,这两个数字加起来为 1。对于第一行:

9.99999987e-01 = 9.99999987 * 0.1 = 0.999999987

1.30424974e-08 = 1.30424974 * 0.00000001 = 0.000000013

因此,A 类短信的预测概率(这可能是垃圾邮件或非正常短信,取决于代码的其余部分)是 0.999...而 B 类短信的概率是 0.00...。 1

所以基本上 NB 以接近 1 的概率预测那里的 A 类。例如,如果输出为 0.6 、 0.4 (输出矩阵的一行),那么您会知道 NB 以 0.6 的概率预测 A 类,以 0.4 的概率预测 B 类。例如,此附加信息可用于限制您的预测。

编辑:如果你不想要这个分数,请将 .predict_proba 替换为 .predict

【讨论】:

但是proba=mnb.predict_proba(X_test) 这一行为什么要返回多个元组?理想情况下,只有两类 ham 或 spam,它应该返回类似 [9.99999987e-01 1.30424974e-08] 的内容。我注意到响应中的行数是数据集中的记录数......但这背后的原因可能是什么。 所以第一个输出 [9.99999987e-01 1.30424974e-08] 表示给定 SMS 属于 A 类 = 9.99999987e-01 和 B 类 = 1.30424974e-08 的概率。下一行[9.99996703e-01 3.29712871e-06] 是什么意思? 没错。第二行表示 X_test 的第二个元素(X_test 是一个包含用于评估模型的每个 sms 的集合)属于 A 类,概率为 9.99996703e-01,属于 B 类,概率为 3.29712871e-06。同样,第 n 行是测试集第 n 个元素的每个类的预测概率。请记住,正如您正确指出的那样,您需要为测试集中的每个元素提供答案,因此如果 X_test 有 100 行,那么您将获得 100 对以概率形式分配给预测的数字。这是正常的。

以上是关于使用朴素贝叶斯计算测试数据的概率的主要内容,如果未能解决你的问题,请参考以下文章

计算朴素贝叶斯分类中的概率

朴素贝叶斯python小样本实例

朴素贝叶斯算法

机器学习-朴素贝叶斯

朴素贝叶斯与贝叶斯网络

朴素贝叶斯(Naive Bayes)算法