在 python 中使用 BernoulliNB(朴素贝叶斯分类器)scikit-learn 的简单示例 - 无法解释分类

Posted

技术标签:

【中文标题】在 python 中使用 BernoulliNB(朴素贝叶斯分类器)scikit-learn 的简单示例 - 无法解释分类【英文标题】:Simple example using BernoulliNB (naive bayes classifier) scikit-learn in python - cannot explain classification 【发布时间】:2012-08-02 04:56:58 【问题描述】:

使用 scikit-learn 0.10

为什么下面的琐碎代码sn-p:

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”类作为答案(正确的)?这不就是一个类标签吗?

有人能解释一下吗?

【问题讨论】:

你是对的,改变 Y 不应该改变任何东西。我可以用当前的主人重现。我想这与未确定的分类器有关。 使用 0.18.2,我得到 2 而无需更改 alpha。 【参考方案1】:

默认情况下,alpha,平滑参数为 1。正如 msw 所说,您的训练集非常小。由于平滑,没有留下任何信息。如果您将 alpha 设置为非常小的值,您应该会看到预期的结果。

【讨论】:

【参考方案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() 应用于结果以使其更具可读性。显然,概率甚至不接近相等,实际上对训练集进行了很好的分类。

【讨论】:

以上是关于在 python 中使用 BernoulliNB(朴素贝叶斯分类器)scikit-learn 的简单示例 - 无法解释分类的主要内容,如果未能解决你的问题,请参考以下文章

利用sklearn进行朴素贝叶斯分类

sklearn中的naive bayes算法

机器学习理论大会战——朴素贝叶斯(分类实践)

class_prior 实际上是啥?

当预测变量不是二进制时,Sklearn 朴素贝叶斯伯努利分类器如何工作?

当python使用“Python.h”调用该c++进程时,如何在python中停止一个c++进程