机器学习实战之朴素贝叶斯

在学习朴素贝叶斯分类模型之前,我们回顾一下之前学习的KNN和决策树,读者本人的总结:不同的机器学习方法有着不同的假设和理论进行支撑,而这些假设和理论在很大程度上体现了该算法的优缺点。

KNN:在样本空间中,相同的类型数据在空间呈聚集状态,也就是距离会靠近,基于这个假设,只需要对测试样本与训练样本进行距离计算,最近距离的样本的类别很大程度上就是测试样本的类别。

决策树:基于信息理论。样本数据是混乱的(熵高),但好在有特征这个东西,如何有效利用特征让样本不混乱,可分,这就是决策树需要完成的事情。

而今天介绍的朴素贝叶斯是基于贝叶斯准则的算法,那为啥要加个朴素呢?因为臣妾做不到啊!(朴素贝叶斯假设特征独立且同等重要)。

朴素贝叶斯原理

如图,为我们的样本数据集。

样本

我们现在用 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

也就是说,我们会选择高概率对应的类别。这就是该算法的核心思想,但如何计算p1(x,y) 和p2(x,y)呢?这里就需要条件概率和贝叶斯准则的知识了。

条件概率和贝叶斯准则

条件概率是在B发生的前提下,A发生的概率,数学公式为P(A|B)。我们来看下书中的案例:

一个装了 7 块石头的罐子,其中 3 块是白色的,4 块是黑色的,那取出白色的概率为3/7,取出黑色的为4/7,这个很简单。

案例

如果用两个桶进行存放,如图所示,在B桶的情况下取出白球的概率是多少呢?很明显是1/3,图中是可以看出来的,但当问题复杂时,直接求就很困难,这里就需要条件概率公式:

公式
案例

另一种计算条件概率的算法为贝叶斯准则:

公式
算法原理

我们继续看之前的案例:

  • 如果 p1(x,y) > p2(x,y) ,那么类别为1
  • 如果 p2(x,y) > p1(x,y) ,那么类别为2

这里我们用条件概率的写法,p(c1|x,y)和p(c2|x,y),这个在实际中很不好求解,所以使用贝叶斯准则:

公式

这样就变为了:

  • 如果 P(c1|x, y) > P(c2|x, y), 那么属于类别 c1
  • 如果 P(c2|x, y) > P(c1|x, y), 那么属于类别 c2

朴素贝叶斯之文本分类

问题描述与数据

以在线社区的留言板为例,有侮辱性的文字(1)和正常言论(0),该数据也是自己创建的。

def loadDataSet():

    """

    创建数据集

    :return: 单词列表postingList, 所属类别classVec

    """

    postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], #[0,0,1,1,1......]

                   ['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 is abusive, 0 not

    return postingList, classVec
构建词向量

我们都知道计算机是不能直接识别文字的,这时就需要将文字转换为数字,怎么进行转换呢?

例如这里有两段文字:

  • 我爱中国
  • 我不喜欢吃苹果

首先对文本进行切分,然后组成没有重复的列表(词汇表):

我, 爱, 中国, 不喜欢, 吃苹果

然后针对词汇表,对两段文字进行向量化,出现的词就会赋值为1,否则为0,则两段文字转换为下面两个词向量。

  • 1, 1, 1, 0 ,0
  • 1, 0, 0, 0 ,0

下面代码构建词向量:

def createVocabList(dataSet):

    vocabSet= set([])

    for i in dataSet:

        vocabSet = vocabSet | set(i)

    return list(vocabSet)



def set0fWords2Vec(vocabList, inputSet):

    returnVec = [0]\*len(vocabList)

    for word in inputSet:

        if word in inputSet:

            returnVec[vocabList.index(word)] = 1

    return returnVec
训练算法

由于是多个特征,这里计算公式写为w矩阵形式:

公式

代码如下:

from numpy import \*

def trainNB0(trainMatrix, trainCategory):

    numTrainDocs = len(trainMatrix)

    numWords = len(trainMatrix[0])

    pAbusive = sum(trainCategory)/float(numTrainDocs)

    p0Num = ones(numWords);p1Num = ones(numWords)

    p0Denom = 2.0;p1Denom = 2.0

    for i in range(numTrainDocs):

        if trainCategory[i] == 1:

            p1Num += trainMatrix[i]

            p1Denom += sum(trainMatrix[i])

        else:

            p0Num += trainMatrix[i]

            p0Denom += sum(trainMatrix[i])

    p1Vect = log(p1Num/p1Denom)

    p0Vect = log(p0Num/p0Denom)

    return p0Vect, p1Vect, pAbusive
测试算法

最后对算法进行测试:

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):

    p1 = sum(vec2Classify \* p1Vec) + log(pClass1) # P(w|c1) \* P(c1) ,即贝叶斯准则的分子

    p0 = sum(vec2Classify \* p0Vec) + log(1.0 - pClass1) # P(w|c0) \* P(c0) ,即贝叶斯准则的分子·

    if p1 > p0:

        return 1

    else:

        return 0



def testingNB():

    listOPosts, listClasses = loadDataSet()

    myVocabList = createVocabList(listOPosts)

    trainMat = []

    for postinDoc in listOPosts:

        trainMat.append(set0fWords2Vec(myVocabList, postinDoc))

    p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))

    testEntry = ['love', 'my', 'dalmation']

    thisDoc = array(set0fWords2Vec(myVocabList, testEntry))

    print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))

    testEntry = ['stupid', 'garbage']

    thisDoc = array(set0fWords2Vec(myVocabList, testEntry))

    print(testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb))
结果

算法优缺点

  • 优点:数据量少也可以使用,可以处理多类问题
  • 缺点:对数据较敏感

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏自然语言处理

朴素贝叶斯一步步轻松学3

朴素贝叶斯分类算法模型在中文领域中的应用。我们对新闻语料进行多文本分类操作,本文选择艺术、文学、教育、哲学、历史五个类别的训练文本,然后采用新的测试语料进行分类...

693
来自专栏人工智能

人工智能之头像识别

图像识别是人工智能的一个重要方面,下面通过一个简单列子进行练习: 随着圣诞的到来,大家纷纷@官方微信给自己的头像加上一顶圣诞帽。当然这种事情用很多P图软件都可以...

20710
来自专栏杨熹的专栏

双向 LSTM

本文结构: 为什么用双向 LSTM 什么是双向 LSTM 例子 ---- 为什么用双向 LSTM? 单向的 RNN,是根据前面的信息推出后面的,但有时候只看前面...

4635
来自专栏NewbieWeb

WebGL ThreeJS学习总结四

通过前段时间的学习,现在已经能使用ThreeJS框架制作一些简单3D效果,对原生WebGL也有了简单的了解;在学习过程中察觉到自己在数学方面欠缺的太多,所以我决...

921
来自专栏目标检测和深度学习

深度学习 机器学习 课程

2017-12-19 Queen 目标检测和深度学习 本文整理了机器学习/深度学习比较优秀的线上开放课程,一般来说,入门机器学习的经典课程是Stanford: ...

32810
来自专栏量化投资与机器学习

朴素贝叶斯模型(NBM)详解与在Matlab和Python里的具体应用

今天给大家介绍机器学习的一种分类模型朴素贝叶斯模型,这是我整理了好久的文章,希望大家能学到一点知识我也是欣慰的^_^o~ 努力! 点击阅读原文可获得工具包连接...

8209
来自专栏大数据挖掘DT机器学习

常见概率分布及在R中的应用

常见概率分布 离散型 1.二项分布Binomial distribution:binom 二项分布指的是N重伯努利实验,记为X ~ b(n,p),E(x)=np...

3177
来自专栏云时之间

帮助阿姨学数学(线性代数篇)

前言 第一次接触线性代数是在大一的第一学期,学完以后分数不低,但是在结束考试后我就有点心虚,在这一段时间因为有个阿姨来问我线性代数,又温习了一遍,心里边变得更心...

36313
来自专栏人工智能的秘密

朴素贝叶斯基于概率论的分类算法

机器学习算法的基础当属概率论,所以理解和使用概率论在机器学习中就显得尤为重要。本文给大家提供一个使用概率分类的方法——朴树贝叶斯。如果写出一个最简单的贝叶斯分类...

2400
来自专栏开心的学习之路

贝叶斯决策理论(数学部分)

概率质量函数(Probability Mass Function)是针对离散值而言的,通常用大写字母P表示。假设某个事

1333

扫码关注云+社区