朴素贝叶斯

朴素贝叶斯方法是一组基于贝叶斯定理的有监督学习算法,其“朴素”假设是给定类变量值的每一对特征之间存在条件独立性。贝叶斯定理给出了给定的类变量与依赖特征向量x_1x_n之间的关系:
P(y \mid x_1, \dots, x_n) = \frac{P(y) P(x_1, \dots x_n \mid y)} {P(x_1, \dots, x_n)}
使用朴素条件独立假设:
P(x_i | y, x_1, \dots, x_{i-1}, x_{i+1}, \dots, x_n) = P(x_i | y),
总的来说,这个关系被简化为:
P(y \mid x_1, \dots, x_n) = \frac{P(y) \prod_{i=1}^{n} P(x_i \mid y)}{P(x_1, \dots, x_n)}
由于P(x_1, \dots, x_n)输入为常数,我们可以使用以下分类规则:
朴素贝叶斯

我们可以用极大后验(MAP)估计来估计;前者则是训练集中类的相对频率。

不同的朴素贝叶斯分类器的区别主要在于它们对分布的假设。

尽管朴素贝叶斯分类器的假设明显过于简化,但它们在许多实际情况下都能很好地工作,比如著名的文档分类和垃圾邮件过滤。它们需要少量的训练数据来估计必要的参数。

与更复杂的方法相比,朴素贝叶斯学习者和分类器可以非常快。类条件特征分布的解耦意味着每个分布都可以独立地估计为一维分布。这反过来又有助于缓解来自维度诅咒的问题。

另一方面,尽管朴素贝叶斯被认为是一个不错的分类器,但它是一个糟糕的估计器,所以来自predict_proba的概率输出不需要太认真对待。

Gaussian Naive Bayes

GaussianNB实现了高斯朴素贝叶斯分类算法。假设特征的似然为高斯分布:
P(x_i \mid y) = \frac{1}{\sqrt{2\pi\sigma^2_y}} \exp\left(-\frac{(x_i – \mu_y)^2}{2\sigma^2_y}\right)
并利用极大似然法对参数进行估计。

>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> from sklearn.naive_bayes import GaussianNB
>>> gnb = GaussianNB()
>>> y_pred = gnb.fit(iris.data, iris.target).predict(iris.data)
>>> print("Number of mislabeled points out of a total %d points : %d"
...       % (iris.data.shape[0],(iris.target != y_pred).sum()))
Number of mislabeled points out of a total 150 points : 6

Multinomial Naive Bayes

MultinomialNB实现了对多项式分布数据的朴素贝叶斯算法,是文本分类中使用的两种经典朴素贝叶斯变体之一(其中数据通常表示为字向量计数,尽管tf-idf向量也知道在实践中工作得很好)。每个类y的分布由向量\theta_y =(\theta_{y1},\ldots,\theta_{yn})参数化,其中n为特征个数(在文本分类中,为词汇量),\theta_{yi}为特征i出现在属于y类的样本中的概率P(x_i \mid y)
参数\theta_y由极大似然平滑版估计,即相对频率计数:
朴素贝叶斯
其中N_{yi}=\sum_{x \in T}x_i为训练集T中y类样本中feature i出现的次数,N_{y} =\sum_{i=1}^{n} N_{yi}为y类所有feature的总数。
平滑先验\alpha \ge 0解释了学习样本中不存在的特征,并防止在进一步计算中出现零概率。设置\alpha=1称为拉普拉斯平滑,而\alpha <1称为李德斯通平滑。

Bernoulli Naive Bayes

针对多变量伯努利分布的数据,BernoulliNB实现了朴素贝叶斯训练和分类算法;例如,可能有多个特性,但每个特性都假定是一个二进制值(伯努利,布尔值)变量 。因此,该类要求样本用二值特征向量表示;如果传递任何其他类型的数据,BernoulliNB实例可以对其输入进行二进制化(取决于二进制参数)。
基于贝努利朴素贝叶斯的决策规则
P(x_i \mid y) = P(i \mid y) x_i + (1 – P(i \mid y)) (1 – x_i)
它与多项式NB(Multinomial Naive Bayes)规则的不同之处在于,它显式地惩罚了作为类y指标的特征i的不出现,其中多项式变量会简单地忽略一个不出现的特征。

在文本分类的情况下,可以使用单词出现向量(而不是单词计数向量)来训练和使用这个分类器。BernoulliNB可能在某些数据集上表现得更好,特别是那些文档更短的数据集。如果时间允许,建议对这两种模型进行评估。

基于Python实现朴素贝叶斯方法

流程:1)收集数据;2)准备数据:需要数值型或布尔型数据。如果是文本文件,要解析成词条向量bai;3)分析数据:有大量特征时,用直方图分析效果更好;4)训练算法:计算不同的独立特征的条件概率;5)测试算法:计算错误率;6)使用算法:一个常见的朴素贝叶斯应用是文档分类。
接下来的例子是源于《机器学习实战》中:分析两个不同地方征婚广告的用词

1)首先,收集数据:从RSS获取数据
朴素贝叶斯

备注:’import sys’ ‘reload(sys)’ ‘sys.setdefaultencoding(‘utf-8’)’这三句话最好同时加上,这样可以有效避免从RSS获取数据发生乱码

其实,从RSS获取数据基本需要掌握的就是parse函数。
2)接下来,准备一些基础函数

  • 将文本解析为词向量,此时需要引入正则模块’re‘

朴素贝叶斯

  • 从简析的文档中生成词汇列表

朴素贝叶斯
备注:Python中的set()集合中的元素是各不相同的,由此创建没有重复单次的词汇表

  • 获取高频词中的前n个

朴素贝叶斯

  • 朴素贝叶斯函数

朴素贝叶斯

  • 基于朴素贝叶斯结果分类

朴素贝叶斯

  • 最终调用函数代码

朴素贝叶斯

谢谢阅读!

赞(3)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址