贝叶斯分类器原理与应用

贝叶斯决策

对于机器学习还有一种将概率应用于其中的一类算法,我们这里先介绍贝叶斯决策论,也算是从另一个角度来思考机器学习的算法。

假设对于数据集,对应的数据类别有N种,分别为:

Y={c1,c2,,cN}

L(Y,f(X)) 为损失函数,那么我们可以得出将一个样本点 x 分类为ci所产生的期望损失为
Rexp(f)=E[L(Y,f(X))]

本身这个期望是对联合概率分布求的,这里我们也可以由条件概率求出来,可得
Rexp(f)=EXk=1K[L(ck,f(X))]P(ck|X)

这个公式很好理解, 符号右边整体代表的是,对于一个输入 X ,它所有可能的输出带来的总的损失。之后总的期望损失是对这个损失按照X求期望。
为了使期望风险最小化,显然,我们最小化每个 X 对应的期望风险就行了,即
f(x)=argminyYk=1KL(ck,y)P(ck|X=x)

当我们采用0-1损失函数的时候,
=argminyY(1P(y=ck|X=x))

最后我们就可以得到 后验概率最大化准则:
f(x)=argmaxckP(ck|X=x)

即对于每个样本x,选择能够使后验概率最大化的类别,但是实际中我们是不知道后验概率的,知道的话我们就不用再算来算去了。
所以,对于后验概率的估计,产生了两种方法,
(1)一种叫 判别式模型,这种是直接对后验概率 P(c|x) 建模,然后预测,相关的算法比如决策树,神经网络以及SVM。判别式模型是直接就给出了输出的类别。
(2)第二种叫 生成式模型,它是对联合概率分布 P(x,c) 建模,之后由条件概率公式得出后验概率( 其实也就是条件概率)。相关的算法比如下面要介绍的朴素贝叶斯分类器。生成式模型的特点是我们可以知道对于输入,它输出不同的类别的改率分别是多大,而不是直接就给出一个类别,虽然一般情况下我们肯定会选择生成模型输出的概率最大的类别。

朴素贝叶斯分类

贝叶斯定理我们基本都是学过的

P(c|x)=P(x,c)P(x)=P(x|c)P(c)P(x)

其中 P(c) 就是先验概率,之所以叫它先验概率,就是因为这个是根据以往的经验是预先知道的。 P(x|c) 就是对于类别c, x 属于c的概率,也称作“似然”(likelihood)。P(x)是归一化因子。
贝叶斯分类就是希望从上式估计出后验概率,但是这里有个问题,样本 x 通常是多维的,x=(x1,x2,,xk),每个维度又有不同的取值 ai 个,那么总的可能取值有 ki=1ai 个,维度越高这个数字基本是指数增加,对于有限个的数据是很难给出有效的估计的,因为相对于所有的可能,样本点还是太少,所以我们就引出了 朴素贝叶斯分类

朴素贝叶斯分类采用了属性独立假设:对于已知类别,假设所有属性相互独立。
那么我们的贝叶斯公式可以写成

P(c|x)=P(c)P(x|c)P(x)=P(c)P(x)i=1dP(xi|c)

P(x) 对所有类别都是相同的,那么我们不考虑它,可以得出贝叶斯分类器:
hnb(x)=argmaxcYP(c)i=1dP(xi|c)

解释一下就是对于任意样本,对所有的c计算上式,然后选择其中使得上式值最大的c作为 x 对应的类别。

下面介绍一下,上面的式子该怎么计算:
假设我们有数据集合D,第c类样本是它的子集为 Dc ,那么先验概率为

P(c)=|Dc||D|

然后求对于每个属性的条件概率,对于离散情况,令 Dc,xi Dc 中第i个属性为 xi 的样本组成的集合,那么条件概率为
P(xi|c)=|Dc,xi||Dc|

那么对于连续属性呢?我们假设条件概率服从正态分布 p(xi|c)N(μc,i,σ2c,i) 那么有
p(xi|c)=12πσc,iexp((xiμc,i)22σ2c,i)

最后如果在某个类别里面某个属性的取值个数为0,那么条件概率 P(xi|c) 就是0,由于最后计算概率是连乘,这将导致无论其他属性包含什么信息,最后的结果都是0,这是不合理的,所以我们采用一种叫拉普拉斯平滑(Laplace Smoothing)的方法修正一下。

P^(c)=|Dc|+1|D|+N

P^(xi|c)=|Dc.xi|+1|Dc|+Ni

其中 N 表示数据集中可能的类别数,Ni表示第 i <script id="MathJax-Element-43" type="math/tex">i</script>个属性可能的取值个数。

以上就是朴素贝叶斯分类的原理,下面介绍scikit-learn中相关算法的使用

scikit-learn 中的使用

sklearn.naive_bayes模块中只有三个分类器,分别为,BernoulliNB(),GaussianNB(),MultinomialNB()

BernoulliNB

(alpha=1.0, binarize=0.0, fit_prior=True, class_prior=None)
Naive Bayes classifier for multivariate Bernoulli models.
Like MultinomialNB, this classifier is suitable for discrete data. The difference is that while MultinomialNB works with occurrence counts, BernoulliNB is designed for binary/boolean features.
这个分类器也是适用于离散数据的,但是它适用范围更狭窄,适用于二值的数据
参数中的alpha是平滑的参数,为1的时候就是上面说过的拉普拉斯平滑
具体的使用基本和其他分类器类似。

>>> import numpy as np
>>> X = np.random.randint(2, size=(6, 100))
>>> Y = np.array([1, 2, 3, 4, 4, 5])
>>> from sklearn.naive_bayes import BernoulliNB
>>> clf = BernoulliNB()
>>> clf.fit(X, Y)
BernoulliNB(alpha=1.0, binarize=0.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2:3]))
[3]

randint()函数用于生成随机的整数,范围在[low,high)之间,如果没有指定high,那么就是[0,low)
上面的代码相当于生成了6个100维的数据,每个维度的取值都是二值的。然后用这个BernoulliNB
分类器预测。

GaussianNB

Gaussian Naive Bayes (GaussianNB)
Can perform online updates to model parameters via partial_fit method. For details on algorithm used to update
feature means and variance online, see Stanford CS tech report STAN-CS-79-773 by Chan, Golub, and LeVeque:
http://i.stanford.edu/pub/cstr/reports/cs/tr/79/773/CS-TR-79-773.pdf

它之所以叫Gaussian的,就是因为在这个分类器中,条件概率是按照高斯分布计算的。
这个分类器的参数更简单,只有一个参数。但是它有一个作用是可以用partial_fit函数用来做“在线升级”,这个概念我没有学过,但是好像是如果数据集非常大不能够一下子读取。可以利用这个函数分批次读取训练。

>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
>>> Y = np.array([1, 1, 1, 2, 2, 2])
>>> from sklearn.naive_bayes import GaussianNB
>>> clf = GaussianNB()
>>> clf.fit(X, Y)
GaussianNB(priors=None)
>>> print(clf.predict([[-0.8, -1]]))
[1]
>>> clf_pf = GaussianNB()
>>> clf_pf.partial_fit(X, Y, np.unique(Y))
GaussianNB(priors=None)
>>> print(clf_pf.predict([[-0.8, -1]]))
[1]

MultinomialNB

Naive Bayes classifier for multinomial models
The multinomial Naive Bayes classifier is suitable for classification with discrete features (e.g., word counts for text classification). The multinomial distribution normally requires integer feature counts. However, in practice, ractional counts such as tf-idf may also work.
这个分类器就是上面最原本的朴素贝叶斯分类的实现,一般适用于离散的参数。
参数中alpha依然是控制平滑的,alpha等于1也是拉普拉斯平滑。
属性中class_log_prior_可以输出各个类的先验概率, feature_log_prob_ 可以输出条件概率

>>> import numpy as np
>>> X = np.random.randint(5, size=(6, 100))
>>> y = np.array([1, 2, 3, 4, 5, 6])
>>> from sklearn.naive_bayes import MultinomialNB
>>> clf = MultinomialNB()
>>> clf.fit(X, y)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
>>> print(clf.predict(X[2:3]))
[3]

综上介绍了贝叶斯分类的基本原理和基本应用,他还有些比较深的应用,比如在官方文档中看到了Out-of-core naive Bayes model fitting,以及在文档处理分析中也有应用。但是这里就不深究了,感兴趣的可以自己研究

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值