朴素贝叶斯改进及其应用

版权声明: https://blog.csdn.net/HUSTLX/article/details/50850390

1、贝叶斯定理

clip_image002[30]是类标号未知的数据样本,clip_image004[12]为某种假设,数据样本clip_image002[31] 属于某特定的类 C ,对于该分类问题,期望确定clip_image007[16],即给定观测数据样本clip_image002[32],假定clip_image004[13]成立的概率,称为后验概率,或称条件clip_image002[33]clip_image004[14]的后验概率。分类就是要确定clip_image007[17]

例如,假定数据样本集由顾客组成,用他们的年龄和收入情况进行分类。假定clip_image002[34]表示顾客的年龄在31岁到40之间并且中等收入,clip_image004[15]表示顾客将购买电脑,则clip_image007[18]反映的是观察到顾客clip_image002[35]的年龄在31岁到40之间并且中等收入时,clip_image002[36]将购买电脑的确定程度。clip_image013[10]为先验概率,在无论顾客clip_image002[37]的年龄和收入情况而购买电脑的概率。后验概率clip_image007[19]比先验概率clip_image013[11]基于更多的背景知识,而clip_image013[12]是独立于clip_image002[38]的。与之类似,clip_image016[8]是在条件clip_image004[16]下,clip_image002[39]的后验概率,即已知顾客clip_image002[40]购买电脑,其年龄在31岁到40岁之间并且中等收入的概率。由于通常情况下clip_image007[20]难以直接计算,我们可以利用贝叶斯定理,通过相对容易计算的clip_image016[9],来求解clip_image007[21]

贝叶斯定理提供了一种由clip_image019[6]clip_image013[13]clip_image016[10]计算clip_image007[22]的方法,具体是:

clip_image021[4]

2、朴素的贝叶斯分类器

朴素贝叶斯分类就是假定一个属性值对给定类的影响独立于其他属性的值,该假定称作类条件独立,做此假定是为了简化计算,在此意义下称为“朴素的”。朴素贝叶斯分类的工作过程如下:

(1)    每个数据样本用一个n维特征向量clip_image023[6]表示,分别描述n个属性clip_image025[6]样本的n个度量。 

(2)    假定m个类clip_image027[4]。给定一个未知的数据样本clip_image023[7],朴素贝叶斯分类将未知的样本分配给类clip_image029[4],当且仅当

clip_image031[4]

根据贝叶斯定理clip_image033[4],最大化clip_image035[6]即可进行分类,其中令clip_image035[7]最大的类clip_image038[16]称为最大后验假设。

(3)    其中clip_image019[7]代表属性集clip_image025[7]取值为clip_image041[4]时的联合概率,为常数,所以最大化时只需使clip_image043[4]最大即可。类clip_image038[17]的先验概率可以用clip_image046[4]计算,其中clip_image048[4]是类clip_image050[4]中训练样本数,clip_image052[4]是训练样本总数。

(4)    给定具有许多属性的数据集 ,计算clip_image054[6] clip_image056[4]的开销可能非常大。为降低计算clip_image054[7]的开销,可以做类条件独立的朴素假定。在此情况下有:

clip_image058[4]概率clip_image060[4]可以由训练样本估值,其中:

(a)    如果clip_image062[6] 离散  性,clip_image064[4],其中clip_image066[4]是样本集中属于类型clip_image038[18]的样本个数。clip_image068[4]是样本集中于类型clip_image038[19] 且属性clip_image062[7]取值为clip_image071[4]的样本个数。

(b)    clip_image073[4]是连续值属性, 常用的处理方法有两种: 一是对其离散化, 然后按照离散值处理; 另一种是假定这一属性服从某一分布。

对未知样本clip_image002[41]分类的时候,对每个类clip_image038[20],计算clip_image077[4]。样本clip_image002[42]被指派到类clip_image038[21]当且仅当clip_image081[4]时,clip_image002[43]被指派到其clip_image084[4]最大的类clip_image038[22] 

二、 实验过程

1、实验流程

本次实验采用RSS数据源采集网站数据,用到了下面两个数据源爬数据:

ny = feedparser.parse('http://newyork.craigslist.org/stp/index.rss')
sf = feedparser.parse('http://sfbay.craigslist.org/stp/index.rss')

得到每个网站的文章之后建立列表doclist,并且建立每篇文章相对应的类标签classlist,再生成一个所有单词出现的列表vocablist。接下来统计每个单词出现的次数,次数出现较多的单词一般是类似于andthefor之类的并不能给分类带来帮助的无用单词,我们把这些高频词去掉。我们在doclist中随机取20个作为测试集,剩余的作为训练集,先计算某个类占的先验概率pAbusive,再计算每个类每个单词占总的这个单词出现的概率p0Vect,p1Vect,测试的时候把待测试的样本向量分别乘以p0Vect,p1Vect再每个元素加起来分别加先验概率取log。算出来哪个概率大就属于哪个类。

2、改进算法

我主要做了互信息特征选择,也就是用互信息选择所有出现单词中的一些做特征。互信息衡量的是某个特征词和类别之间的统计独立关系。某个特征词和某个类别ci 传统的互信息定义度量两个对象之间的相互性,在不良信息过滤问题中用于度量特征对于主题的区分度。 则特征词 t 和类别 ci 的互信息公式定义为:

clip_image087[5]

其中Pt ci表示训练集中既包含特征 又属于类别 ci 的文档概率,Pt表示在整个文本训练集中包含特征 的文档概率,Pci表示在训练集中属于类别 ci 的文档概率,Pt | ci)表示在类别 ci 中包含特征 的文档概率。在某个类别 ci 中出现的概率高, 而在其他类别中出现的概率低的特征 将获得较高的互信息, 也就有可能被选择为类别 ci 的特征。 在 个类别的文本训练集上特征项 的互信息定义为:

clip_image089[5]

互信息根据特征与类别共同出现的概率, 度量特征和类别的相关性。 对于某一类别 ci 来讲,特征词 的互信息越大,说明该词与该类的共现概率越大。 下面利用一个简单的例子对传统互信息算法进行分析, 设存在两类文本 c1 c2  每类中包含 篇文档,特征词集合中有 t1 t2 t3 三个词,并且在类别 c1 c2 的分布情况如表 所示。

clip_image091[5]

利用式2计算可得:

clip_image093[5]

我用这样的计算方法到的每个单词的互信息,具体python实现如下:

def chooseN(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)
    numWords = len(trainMatrix[0])
    pAbusive = sum(trainCategory)/float(numTrainDocs)
    MI=zeros(numWords)
    pCondition1=ones(numWords)
    pCondition0=ones(numWords)
    deleteN=[]
    for i in range(numWords):
        for j in range(numTrainDocs):
            if trainCategory[j]==1:
                pCondition1[i]=pCondition1[i]+trainMatrix[j][i]
            else:
                pCondition0[i]=pCondition0[i]+trainMatrix[j][i]
        MI[i]=pAbusive*log(pCondition1[i]/(pCondition1[i]+pCondition0[i]))+\
              (1-pAbusive)*log(pCondition0[i]/(pCondition1[i]+pCondition0[i]))
        if MI[i]>-0.8:
            deleteN.append(i)
    return deleteN

下图是在一次计算中得到的MI

clip_image095[5]

另外去高频词的时候发现去掉10个高频词的时候效果比较好。下面是实验数据:

方法(错误率)

1

2

3

4

5

6

7

8

9

10

平均错误率

互信息去10

0

0.15

0

0.05

0

0.05

0.1

0.1

0.1

0.05

0.06

互信息

0.1

0.15

0

0.1

0

0.15

0.05

0

0.05

0.15

0.075

10

0.25

0.35

0.35

0.4

0.4

0.35

0.3

0.35

0.25

0.35

0.335

30

0.35

0.4

0.45

0.4

0.5

0.3

0.35

0.45

0.3

0.45

0.395

三、 实验小结

这次实验相对前两次比较难,首先要理解原来朴素贝叶斯的每个步骤的代码,对于改进还要看文献,改进的互信息又很难具体下手写代码,最后找见一篇中文的“文本分类中互信息特征选择方法的研究与算法改进”的论文按照论文当中的方法才用代码实现,不过很奇怪的是计算到互信息之后用互信息小的做特征词反而得到了很好的效果,这和传统的方法是相反的,而且对于实验的两个RSS源数据每天测试的结果不太一样,有可能是网站新闻有变动之类的

猜你喜欢

转载自blog.csdn.net/HUSTLX/article/details/50850390