机器学习笔记十四 朴素贝叶斯实例

一、使用朴素贝叶斯进行文档分类

机器学习 一个重要应用就是文档的自动分类。可以观察文档出现的词,并把每个词 出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的词目一样多。朴素贝叶斯是贝叶斯分类器的一个扩展,是用于文档分类的常用算法。

朴素贝叶斯的一般过程

  1. 收集数据:可以使用任何方法
  2. 准备数据:需要数值型或者布尔型数据
  3. 分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好
  4. 训练算法:计算不同的独立特征的条件概率
  5. 测试算法:计算错误率
  6. 使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯分类器,不一定非要是文本。

由统计学知,如果每个特征需要N个样本,那么对于1000个特征的词汇表将需要N1000个样本。所需要的样本数会随着特征数目增大而迅速增长。如果特征之间相互独立,那么样本数可以从N1000减少到100 x N。
所谓独立(independence),指的是统计意义上的独立,即一个特征或单词出现的可能性与它和其它单词相邻没有关系。例如:单词bacon出现在unhealty后面与出现在delicious后面的概率相同。当然这种假设并不正确,bacon常常出现在delicious附近,而很少出现在unhealthy附近,这个假设正是朴素(naive)的含义。
朴素贝叶斯另一个假设时,所有特征值同等重要 。 其实这个假设也有问题。

朴素贝叶斯分类器通常有两种实现方式:一种基于贝努利模型实现,一种基于多项式模型实现。基于贝努利模型,不考虑词在文档中出现的次数,只考虑出不出现,因此在这个意义上相当于假设词是等权重的。

二、使用Python进行文本分类(未完)

要从文本中获取特征,需要先拆分文本。
其做法是:这里的特征是来自文本的词条(token),一个词条是字符的任意组合。可以把词条想象为单词,也可以使用非单词词条,如URL、IP地址或者任意其他字符串。然后针每一个文本片段表示为一个词条向量,其中值为1表示词条出现在文档中,0表示词条未出现。

以留言板为例,要构建一个快速过滤器,如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标识为内容不当。对此问题建立两个类别:侮辱类和非侮辱类,使用1和0分别表示 。

1. 准备数据 从文本中构建词向量

创建一个bayes.py

def loadDataSet():
    postingList=[['my','dog','has','flea', 'problems','help','please'],
              ['maybe','not','take','hime','to','dog','park','stupid'],
              ['my','dalmation','is','so','cute','I','love','hime'],
              ['stop','posting','stupid','worthless','garbage'],
              ['mr','licks','ate','my','steak','how','to','stop','hime'],
              ['quit','buying','worthless','dog','food','stupid']]
     classVec = [0,1,0,1,0,1]
     return postingList,classVec

def createVocabList(dataSet):
    vocabSet = set([])
    for document in dataSet:
        vocabSet = vocabSet | set(document)
    return list(vocabSet)

def setOfWords2Vec(vocabList,inputSet):
    returnVec [0]*len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1
        else: print "the word: %s is not in my Vocabulary!" % word
    return returnVec

函数loadDataSet()创建一些实验样本。函数返回的第一个变量是词条切分后的文档集合。
createVocabList()会创建一个包含在所有文档中出现的不重复词的列表。
setOfWords2Vec该函数的输入参数为词汇表及某个文档,输出的是文档向量,向量的每一元素 1或0.

三、 机器学习实战 学习笔记

算法描述

  1. 获取样本文本,将样本人工分类整理,并进行标记
  2. 对每个类别的样本文本进行中文分词
  3. 去除本文本垃圾词条
  4. 将整理后词条合成样本文本的特征组,分析并计算词条频率信息,即:词语在每个类别出现的次数除以该类别的总词语数。
    如,某类别的词条总数是100个,而词条“冬天”出现了5次,那么“冬天”一词在该文件中的词频就是5/100。
  5. 根据词频信息,计算词条在各类别文本的先验概率。词条i的各类别先验概率计算公式为:
    Pi(A)=COUNTi(A)/WORDCOUNT(A)

    Pi(B)=COUNTi(A)/WORDCOUNT(B)

    Pi(C)=COUNTi(A)/WORDCOUNT(C)
  6. 读取未知样本,进行中文分词,去除垃圾词,然后形成样本特征组。
  7. 将未知样本特征词条的先验概率代入朴素贝叶斯公式计算后验算概率,计算得到的最大概率的所属类别即为文本所属类别。

先验概率计算

同一条词条在不同类型的文本中出现的频繁通常并不一样,很多词条只会在某些类别的文本中出现,如“微软”、“谷歌”等词条极少出现在战争类题材的文本中,而“黑莓”、“3G”等极少出现在健康类题材的文本中。词条先验概率计算通过提取不同类别中的样本的词条,分析其在所有类别中出现的概率,它会以词条为键值,生成词条先验概率哈希数组(在Python中称为字典结构),以供后期分类算法使用。
根据相互贝叶斯的先验概率计算公式来看,在后期计算中,需要计算词条先验概率累乘。如某词在某类型的样本中从来没有出现,其概率为0,这样将会使累乘结果变为0,算法变得毫无意义。在计算先验概率后,在每个词条的先验概率基础上加上一个适当的较小的概率值,防止累乘出现0.此外,某词在某类型的所有样本中未出现,不代表该词不会出现在该类型的所有文本中,因此,这个较小概率值非常有必要加入先验概率的计算中。

最大后验概率

对未知文本分类时,需要计算后验概率,对于在文本中出现的词条,提取其在先验概率哈希数组中的概率值。然后分别计算不同类型哈希数组中出现的词条的验概率累乘,从而得到未知文本属于不同类型的后验概率,其中,最大概率所属类别即为未知文本所属类别。

通常来说,一个分类效果较好的朴素贝叶斯算法,其每个类别的样本数量大致有2000~10000个。近年来,基于朴素贝叶斯分类的改进算法越来越多,最普遍的是在算法中加入权重的影响,针对某些关键词或中心词加上权重,这种方法称为加权朴素贝叶斯算法。可以查询:《厦门大学学报:自然科学版》2012年第4期上饶丽丽等的文章《基于特征相关的改进加权朴素贝叶斯分类算法》。

你可能感兴趣的:(机器学习)