美文网首页
《机器学习实战》笔记(3) 第四章

《机器学习实战》笔记(3) 第四章

作者: appcompat_v7 | 来源:发表于2017-05-31 00:07 被阅读28次

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

4.1

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

4.4

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

4.5

  1. 准备数据:从文本中构建词向量
def loadDataSet():
    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 is abusive, 0 not
    return postingList, classVec
# 创建训练文档的set集合
def createVocabList(dataSet):
    vocabSet = set([])
    for data in dataSet:
        vocabSet = vocabSet | set(data)
    return list(vocabSet)
# 生成一个元素为0 或 1的向量,表示训练文档的单词在输入文档中是否存在
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] = 1
    return returnVec

第二个方法生成了一个没有重复元素的 list ,第三个方法生成了一个元素为 0 或 1 的向量,用于表示输入文档中词汇在训练文档中出现的情况。

  1. 训练算法:首先可以通过类别i(侮辱性留言或非侮辱性留言)中文档书除以总的文档数来计算概率 p(ci) 。接下来计算 p(w|ci) ,这里就要用到朴素贝叶斯假设。如果将 w 展开为一个个独立特征,那么就可以将上述概率写作 p(w0,w1,w2..wn|ci)。

    伪代码:

    计算每个类别中文档数目
    
    对每篇训练文档:
    
     对每个类别:
    
         如果词条出现在文档中—>增加该字条的计数值
    
         增加所有词条的计数值
    
    对每个类别:
    
     对每个词条:
    
     将该词条的数目除以总词条数目得到条件概率
    
    返回每个类别的条件概率
    

    代码部分

    # 正常文档和侮辱性文档中每个词出现的概率
    def trainNBO(trainMatrix, trainCategory):
        # 文档数量
        numTrainDocs = len(trainMatrix)
        pAbusive = sum(trainCategory) / float(numTrainDocs)
        # 每篇文档词的个数
        numWords = len(trainMatrix[0])
    
        p0Num = zeros(numWords)
        p0Total = 0
        p1Num = ones(numWords)
        p1Total = 0
        # 遍历文档
        for index in range(numTrainDocs):
            if trainCategory[index] == 1:
                # 类别1中每个词汇出现的次数
                p1Num += trainMatrix[index]
                # 总个数
                p1Total += sum(trainMatrix[index])
            else:
                p0Num += trainMatrix[index]
                p0Total += sum(trainMatrix[index])
        p0Vec = p0Num / p0Total
        p1Vec = p1Num / p0Total
        return p0Vec, p1Vec, pAbusive
    
  2. 测试算法:利用贝叶斯分类器分类时,要计算多个概率的乘积以获得文档属于某个类别的概率,即 p(w0|1) * p(w1|1) * ...* p(wn|1) 。如果其中一个概率值为0,那么最后乘积也为0。为了降低这种影响,可将所有的词出现次数初始化为1,并将分母初始化为2。

    另一个问题学生下溢出(乘数太小导致最后结果为0),解决办法是对乘积去自然对数。所以,

    p0Vec = log(p0Num / p1Denom)
    

    测试代码:

    def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
        p1 = sum(vec2Classify * p1Vec) + log(pClass1)
        p0 = sum(vec2Classify * p0Vec) + log(1 - pClass1)
        return 1 if p1 > p0 else 0
    

    vec2Classify 表示要分类的向量。

  3. 准备数据:目前为止,我们将每个词出现与否作为一个特征,这可以被描述成为词集模型。如果一个词在文档中出现不止一次,这可能意味着包含该词是否出现在文档中所不能表达的某种信息,这种方法被称为词袋模型。在词集中,每个单词可以出现多次,而在词袋中,每个词能出现多次。

# 生成向量,表示训练文档的单词在输入文档中是否存在
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList)
    for word in inputSet:
        if word in vocabList:
            returnVec[vocabList.index(word)] += 1
    return returnVec

相关文章

  • 机器学习实战:基于Scikit-Learn和TensorFlow

    机器学习实战:基于Scikit-Learn和TensorFlow---第四章笔记 一、学习目标 之前用了那么多的机...

  • 机器学习实战-knn

    机器学习实战笔记-knn算法实战 本文内容源于《机器学习实战》一书,主要介绍了knn(k-nearest neig...

  • 思维导图

    《机器学习实战》思维导图 过完书后可以查漏补缺,温故知新。 《机器学习实战》读书笔记

  • K-Means算法

    参考链接:1. python机器学习实战之K均值聚类2. 机器学习实战之K-Means算法3.《机器学习实战》(十...

  • 机器学习实战之KNN算法

    本系列教程为《机器学习实战》的读书笔记。首先,讲讲写本系列教程的原因:第一,《机器学习实战》的代码由Python2...

  • 《机器学习》西瓜书学习笔记(索引)

    第一章,第二章:《机器学习》西瓜书学习笔记(一) 第三章:《机器学习》西瓜书学习笔记(二) 第四章,第五章:《机器...

  • 《机器学习实战》笔记(3) 第四章

    基于概率论的分类方法:朴素贝叶斯 4.1 朴素贝叶斯:优点:在数据较少的情况下仍然有效,可以处理多类别问题缺点:对...

  • 机器学习实战-数据探索(变量变换、生成)

    《机器学习实战-数据探索(1、变量识别;2、单变量分析;3、双变量分析)》 机器学习实战-数据探索(缺失值处理) ...

  • 机器学习实战-数据探索(异常值处理)

    《机器学习实战-数据探索(1、变量识别;2、单变量分析;3、双变量分析)》 机器学习实战-数据探索(缺失值处理)上...

  • 机器学习实战(一)

    学习笔记(机器学习实战:基于Scikit-Learn和TensorFlow) 材料(代码示例、练习题等)可在此链接...

网友评论

      本文标题:《机器学习实战》笔记(3) 第四章

      本文链接:https://www.haomeiwen.com/subject/gerdfxtx.html