机器学习实战 | 第4章 基于概率论的分类方法: 朴素贝叶斯

4.1 基于贝叶斯决策理论的分类方法

				朴素贝叶斯
优点:在数据较少的情况下仍然有效,可以处理多类别问题。
缺点:对于输入数据的准备方式较为敏感。
适用数据类型:标称型数据。

用p1(x,y)表示数据点(x,y)属于类别1的概率;
用p2(x,y)表示数据点(x,y)属于类别2的概率;
那么对于一个新数据点(x,y),可以用下面的规则来判断它的类别:
 如果 p1(x,y) > p2(x,y),那么类别为1。
 如果 p2(x,y) > p1(x,y),那么类别为2。

贝叶斯决策理论的核心思想:选择具有最高概率的决策。

4.2 条件概率

贝叶斯准则:告诉我们如何交换条件概率中的条件与结果,即如果已知P(x|c),要求P(c|x),则:
条件概率

4.3 使用条件概率来分类

贝叶斯理论真正需要计算和比较的是p(c1|x, y)和p(c2|x, y)。
这些符号所代表的具体意义是:
给定某个由x、y表示的数据点,那么该数据点来自类别c1的概率是多少?数据点来自类别c2的概率又是多少?
应用贝叶斯准则:贝叶斯准则

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

朴素贝叶斯是贝叶斯分类器的一个扩展,是用于文档分类的常用算法。

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

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

4.5 使用 Python 进行文本分类

要从文本中获取特征,需要先拆分文本。
以在线社区的留言板为例。对言论建立两个类别:侮辱类和非侮辱类,使用1和0分别表示。
接下来首先给出将文本转换为数字向量的过程,然后介绍如何基于这些向量来计算条件概率,并在此基础上构建分类器,最后还要介绍一些利用Python实现朴素贝叶斯过程中需要考虑的问题。

4.5.1 准备数据:从文本中构建词向量

我们将把文本看成单词向量或者词条向量,也就是说将句子转换为向量。考虑出现在所有文档中的所有单词,再决定将哪些词纳入词汇表或者说所要的词汇集合,然后必须要将每一篇文档转换为词汇表上的向量。

程序清单4-1 词表到向量的转换函数

将一组单词转换为一组数字

from numpy import *

def loadDataSet():
    '''
    postingList: 进行词条切分后的文档集合
    classVec:类别标签
    使用伯努利模型的贝叶斯分类器只考虑单词出现与否(01'''
    postingList=[['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
                 ['maybe', 'not', 'take', 'him', 'to', 'dog', 'park', 'stupid'],
                 ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'],
                 ['stop', 'posting', 'stupid', 'worthless', 'garbage'],
                 ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'],
                 ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']]
    classVec = [0,1,0,1,0,1]    #1代表侮辱性文字,0代表正常言论
    return postingList,classVec


def Create_wordVec(dataset):
    # 创建一个空集
    word_set = set([])
    for doc in dataset:
        # 创建两个集合的并集
        word_set = word_set | set(doc) # 通过对两个集合取并,找出所有非重复的单词
    return list(word_set)

def Words2Vec(wordList, input_set):
    '''
    @wordList:为前一个函数的输出值(包含单词)
    @input_set:输入需要分类的集合
    函数输出:包含01的布尔型向量(对应Wordlist中的单词出现与否)
    '''
    return_vec = [0] * len(wordList)
    # 创建与词汇表等长的列表向量,其中所含元素都为0
    for word in input_set:
        if word in wordList:
            return_vec[wordList.index(word)] = 1 # 出现的单词赋1
        else: print("the word %s is not in list" % word)
    return return_vec

执行:

>import bayes
>wordlist,classlist = bayes.loadDataSet()
>myVoc = bayes.Create_wordVec(wordlist)
>myVoc
['is', 'love', 'please', 'to', 'has', 'him', 'dog', 'stop', 'mr', 'ate', 'how', 'stupid', 'licks', 'garbage', 'buying', 'posting', 'cute', 'quit', 'food', 'I', 'so', 'worthless', 'maybe', 'flea', 'park', 'help', 'problems', 'dalmation', 'take', 'not', 'steak', 'my']
>bayes.Words2Vec(myVoc,wordlist[0])
[0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]
>bayes.Words2Vec(myVoc,wordlist[3])
[0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

4.5.2 训练算法:从词向量计算概率

使用这些数字计算概率
重写贝叶斯
粗体w表示这是一个向量,即它由多个数值组成。在这个例子中,数值个数与词汇表中的词个数相同。
使用上述公式,对每个类计算该值,然后比较这两个概率值的大小。
1)首先可以通过类别i(侮辱性留言或非侮辱性留言)中文档数除以总的文档数来计算概率p(ci);
2)计算p(w|ci)。
如果将w展开为一个个独立特征,那么就可以将上述概率写作p(w0,w1,w2…wN|ci)。
这里假设所有词都互相独立,该假设也称作条件独立性假设,它意味着可以使用p(w0|ci)p(w1|ci)p(w2|ci)…p(wN|ci)来计算上述概率,这就极大地简化了计算的过程。

该函数的伪代码如下:
贝叶斯准则伪代码

程序清单4-2 朴素贝叶斯分类器训练函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值