贝叶斯分类器

一、贝叶斯定理

假设对于某个数据集,随机变量C表示样本为C类的概率,F1表示测试样本某特征出现的概率,套用基本贝叶斯公式,则如下所示:

上式表示对于某个样本,特征F1出现时,该样本被分为C类的条件概率。那么如何用上式来对测试样本分类呢?

举例来说,有个测试样本,其特征F1出现了(F1=1),那么就计算P(C=0|F1=1)和P(C=1|F1=1)的概率值。前者大,则该样本被认为是0类;后者大,则分为1类。

对该公示,有几个概念需要熟知:

先验概率(Prior)。P(C)是C的先验概率,可以从已有的训练集中计算分为C类的样本占所有样本的比重得出。

证据(Evidence)。即上式P(F1),表示对于某测试样本,特征F1出现的概率。同样可以从训练集中F1特征对应样本所占总样本的比例得出。

似然(likelihood)。即上式P(F1|C),表示如果知道一个样本分为C类,那么他的特征为F1的概率是多少。

对于多个特征而言,贝叶斯公式可以扩展如下:

二、朴素贝叶斯算法

通过某些特征对不同的内容进行分类。
特征的定义 任何可以用来判断内容中具备或缺失的东西。如要对文档进行分类时,所谓的内容就是文档,特征就是文档中的单词(当然你也可以选择其他合理的东西)

当向贝叶斯分类器输入一个要进行分类的样本后,分类器会先对该样本进行分析,确定其特征,然后将根据这些特征时,计算样本属于各分类的概率。

朴素贝叶斯分类器的具体工作步骤:
1) 学习:向分类器输入一系列的训练数据,注意这些数据是包括其所属类别的,分类器将对训练数据进行分析,计算出
1.各个特征在各个分类中出现的概率(=某分类中具有该特征的数据数目 / 该分类数目)如先计算出各个单词在各种分类的文档出现的概率。
将该概率作为某分类下某特征出现的条件概率P(feature | category)
2.任选一个样本属于某分类的概率(=某分类文章数 / 文章总数)
记该概率为p(category)
在朴素的贝叶斯分类器中,我们假设将要组合的各个概率相互独立(当然,很多时候并非如此。我们有时会发现,当样本拥有某一特征时,则它就更可能拥有另一项特征。)
2)分类计算:在向分类器提供大量学习数据后,我们就可以用它对新的样本进行分类了。
首先对样本进行分析,找出其具有的各种特征,利用这些特征,我们来计算各个分类中出现该样本的概率p(sample | category)。为了完成这一计算,我们只要简单将该分类下在该文档中出现过的特征出现的条件概率相乘即可。即π (P(feature | category) 这里的feature是该样本拥有的所有特征。
但是,我们实际要计算的是P (category | sample),即给定样本属于某分类的条件概率。
这里,就用到了贝叶斯定理:P(A | B)=P(B | A)P(A) / P(B)
这里就是:P(category | sample)= P(sample | category)P(category) / P(sample)
其中,P(sample | category)P(category)都已经在学习中计算得到,而P(sample)是样本出现 的概率,我们可以计算它,但是这是没有意义的,因为我们会计算出各个分类的条件概率,然后比较它们的大小确定样本所属的分类,而对各个条件概率而言p(sample)是完全一样的。

朴素贝叶斯算法,是基于贝叶斯定理与特征条件独立假设的分类与方法;
为了简化计算,朴素贝叶斯算法做了一假设:“朴素的认为各个特征相互独立”。这么一来,上式的分子就简化成了:

P(C)P(F1|C)P(F2|C)...P(Fn|C)。

这样简化过后,计算起来就方便多了。

这个假设是认为各个特征之间是独立的,看上去确实是个很不科学的假设。因为很多情况下,各个特征之间是紧密联系的。然而在朴素贝叶斯的大量应用实践实际表明其工作的相当好。

其次,由于朴素贝叶斯的工作原理是计算P(C=0|F1...Fn)和P(C=1|F1...Fn),并取最大值的那个作为其分类。而二者的分母是一模一样的。因此,我们又可以省略分母计算,从而进一步简化计算过程。

另外,贝叶斯公式推导能够成立有个重要前期,就是各个证据(evidence)不能为0。也即对于任意特征Fx,P(Fx)不能为0。而显示某些特征未出现在测试集中的情况是可以发生的。因此实现上通常要做一些小的处理,例如把所有计数进行+1(加法平滑(additive smoothing,又叫拉普拉斯平滑(Laplace smothing))。而如果通过增加一个大于0的可调参数alpha进行平滑,就叫Lidstone平滑。

例如,在所有6个分为C=1的影评样本中,某个特征F1=1不存在,则P(F1=1|C=1) = 0/6,P(F1=0|C=1) = 6/6。

经过加法平滑后,P(F1=1|C=1) = (0+1)/(6+2)=1/8,P(F1=0|C=1) = (6+1)/(6+2)=7/8。

注意分母的+2,这种特殊处理使得2个互斥事件的概率和恒为1。

最后,我们知道,当特征很多的时候,大量小数值的小数乘法会有溢出风险。因此,通常的实现都是将其转换为log:

log[P(C)P(F1|C)P(F2|C)...P(Fn|C)] = log[P(C)]+log[P(F1|C)] + ... +log[P(Fn|C)]

将乘法转换为加法,就彻底避免了乘法溢出风险。

三、数据模型的建立
3.1 Iris花分类
# 导入pd、np库
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# 导入数据源
from sklearn.datasets import load_iris
#导入交叉验证库
from sklearn.model_selection import train_test_split
#导入GaussianNB库
from sklearn.naive_bayes import GaussianNB

iris = load_iris()
#设置特征X
X = iris.data
#设置目标Y
y = iris.target

#将数据集拆分为训练集和测试集,其中训练集为原数据集的60%,测试集为40%。
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.4,random_state=524)

#建立高斯朴素贝叶斯模型。
clf=GaussianNB()

#使用训练集对模型进行训练
clf.fit(X_train,y_train)
GaussianNB(priors=None)

#使用测试集数据检验模型准确率
clf.score(X_test,y_test)

#给一组数据[5.9,3.2,5.1,2.1]进行预测
clf.predict([[5.9,3.2,5.1,2.1]])

  • 21
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值