数据挖掘与机器学习:使用朴素贝叶斯进行文档分类

25 篇文章 12 订阅
21 篇文章 1 订阅

目录

任务描述:

相关知识:

一、朴素贝叶斯分类文档的过程:

二、朴素贝叶斯分类文档的核心算法:

编程要求:

测试说明:


任务描述:

本关任务:编写程序,完成朴素贝叶斯分类文档。

相关知识:

为了完成本关任务,你需要掌握:1.朴素贝叶斯分类文档的过程,2.朴素贝叶斯分类文档的核心算法。

一、朴素贝叶斯分类文档的过程:

        机器学习的一个重要应用就是文档的自动分类。在文档分类中,整个文档(如一封电子邮件)是实例,而电子邮件中的某些元素则构成特征。虽然电子邮件是一种会不断增加的文本,但我们同样也可以对新闻报道、用户留言、政府公文等其他任意类型的文本进行分类。我们可以观察文档中出现的词,并把每个词的出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的词目一样多。朴素贝叶斯是上节介绍的贝叶斯分类器的一个扩展,是用于文档分类的常用算法。使用每个词作为特征并观察它们是否出现,这样得到的特征数目会有多少呢?针对的是哪一种人类语言呢?当然不止一种语言。据估计,仅在英语中,单词的总数就有500000之多。为了能进行英文阅读,估计需要掌握数千单词。

         朴素贝叶斯的一般过程:

⑴ 收集数据:可以使用任何方法。

(2)准备数据:需要数值型或者布尔型数据。

(3)分析数据:有大量特征时,绘制特征作用不大,此时使用直方图效果更好。

(4)训练算法:计算不同的独立特征的条件概率。

(5)测试算法:计算错误率。

(6)使用算法:一个常见的朴素贝叶斯应用是文档分类。可以在任意的分类场景中使用朴素贝叶斯命类器,不一定非要是文本。

二、朴素贝叶斯分类文档的核心算法:

编程要求:

根据提示,在右侧编辑器补充代码。

测试说明:

根据所学,完后右侧代码练习。

import numpy as np
import random
import re
import os
os.system("! unzip -o ./机器学习第4章/ham.zip")

'''
Parameters:
    dataSet - 整理的样本数据集
Returns:
    vocabSet - 返回不重复的词条列表,也就是词汇表
'''
# 函数说明:将切分的实验样本词条整理成不重复的词条列表,也就是词汇表
def createVocabList(dataSet):
    vocabSet = set([])                      #创建一个空的不重复列表
    for document in dataSet:
        vocabSet = vocabSet | set(document) #取并集
    return list(vocabSet)

'''
Parameters:
    vocabList - createVocabList返回的列表
    inputSet - 切分的词条列表
Returns:
    returnVec - 文档向量,词集模型
'''
# 函数说明:根据vocabList词汇表,将inputSet向量化,向量的每个元素为1或0
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList)                               #创建一个其中所含元素都为0的向量
    for word in inputSet:                                          #遍历每个词条
        if word in vocabList:                                      #如果词条存在于词汇表中,则置1
            returnVec[vocabList.index(word)] = 1
        else: print("the word: %s is not in my Vocabulary!" % word)
    return returnVec                                               #返回文档向量

'''
Parameters:
    vocabList - createVocabList返回的列表
    inputSet - 切分的词条列表
Returns:
    returnVec - 文档向量,词袋模型
'''
# 函数说明:根据vocabList词汇表,构建词袋模型
def bagOfWords2VecMN(vocabList, inputSet):
    returnVec = [0]*len(vocabList)                          #创建一个其中所含元素都为0的向量
    for word in inputSet:                                   #遍历每个词条
        if word in vocabList:                               #如果词条存在于词汇表中,则计数加一
            returnVec[vocabList.index(word)] += 1
    return returnVec                                        #返回词袋模型

'''
Parameters:
    trainMatrix - 训练文档矩阵,即setOfWords2Vec返回的returnVec构成的矩阵
    trainCategory - 训练类别标签向量,即loadDataSet返回的classVec
Returns:
    p0Vect - 侮辱类的条件概率数组
    p1Vect - 非侮辱类的条件概率数组
    pAbusive - 文档属于侮辱类的概率
'''
# 函数说明:朴素贝叶斯分类器训练函数
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)                     #计算训练的文档数目
    numWords = len(trainMatrix[0])                      #计算每篇文档的词条数
    pAbusive = sum(trainCategory)/float(numTrainDocs)   #文档属于侮辱类的概率
    p0Num = np.ones(numWords); p1Num = np.ones(numWords)#创建numpy.ones数组,词条出现数初始化为1,拉普拉斯平滑
    p0Denom = 2.0; p1Denom = 2.0                        #分母初始化为2,拉普拉斯平滑
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:                       #统计属于侮辱类的条件概率所需的数据,
                                                        #即P(w0|1),P(w1|1),P(w2|1)···
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:                                           #统计属于非侮辱类的条件概率所需的数据,
                                                        #即P(w0|0),P(w1|0),P(w2|0)···
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = np.log(p1Num/p1Denom)                      #取对数,防止下溢出
    p0Vect = np.log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive#返回属于侮辱类的条件概率数组,属于非侮辱类的条件概率数组,文档属于侮辱类的概率

'''
Parameters:
    vec2Classify - 待分类的词条数组
    p0Vec - 侮辱类的条件概率数组
    p1Vec -非侮辱类的条件概率数组
    pClass1 - 文档属于侮辱类的概率
Returns:
    0 - 属于非侮辱类
    1 - 属于侮辱类
'''
# 函数说明:朴素贝叶斯分类器分类函数
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + np.log(pClass1)        #对应元素相乘。logA * B = logA + logB,
                                                            #所以这里加上log(pClass1)
    p0 = sum(vec2Classify * p0Vec) + np.log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else:
        return 0

'''
Parameters:
    trainMatrix - 训练文档矩阵,即setOfWords2Vec返回的returnVec构成的矩阵
    trainCategory - 训练类别标签向量,即loadDataSet返回的classVec
Returns:
    p0Vect - 侮辱类的条件概率数组
    p1Vect - 非侮辱类的条件概率数组
    pAbusive - 文档属于侮辱类的概率
'''
# 函数说明:朴素贝叶斯分类器训练函数
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)                      #计算训练的文档数目
    numWords = len(trainMatrix[0])                       #计算每篇文档的词条数
    pAbusive = sum(trainCategory)/float(numTrainDocs)    #文档属于侮辱类的概率
    p0Num = np.ones(numWords); p1Num = np.ones(numWords) #创建numpy.ones数组,词条出现数初始化为1,拉普拉斯平滑
    p0Denom = 2.0; p1Denom = 2.0                         #分母初始化为2,拉普拉斯平滑
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:                        #统计属于侮辱类的条件概率所需的数据,
                                                         #即P(w0|1),P(w1|1),P(w2|1)···
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:                                            #统计属于非侮辱类的条件概率所需的数据,
                                                         #即P(w0|0),P(w1|0),P(w2|0)···
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = np.log(p1Num/p1Denom)                       #取对数,防止下溢出
    p0Vect = np.log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive#返回属于侮辱类的条件概率数组,属于非侮辱类的条件概率数组,文档属于侮辱类的概率

# 函数说明:接收一个大字符串并将其解析为字符串列表
def textParse(bigString):                                       #将字符串转换为字符列表
    listOfTokens = re.split(r'\W*', bigString)                  #将特殊符号作为切分标志进行字符串切分,即非字母、非数字
    return [tok.lower() for tok in listOfTokens if len(tok) > 2]#除了单个字母,例如大写的I,其它单词变成小写

# 函数说明:测试朴素贝叶斯分类器
def spamTest():
    docList = []; classList = []; fullText = []
    for i in range(1, 26):                                             #遍历25个txt文件
        wordList = textParse(open('ham/%d.txt' % i, 'r',encoding='utf-8',errors='ignore').read())#读取每个垃圾邮件,并字符串转换成字符串列表
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(1)                                            #标记垃圾邮件,1表示垃圾文件
        wordList = textParse(open('ham/%d.txt' % i, 'r',encoding='utf-8',errors='ignore').read()) #读取每个非垃圾邮件,并字符串转换成字符串列表
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(0)                            #标记非垃圾邮件,1表示垃圾文件
    vocabList = createVocabList(docList)               #创建词汇表,不重复
    trainingSet = list(range(50)); testSet = []        #创建存储训练集的索引值的列表和测试集的索引值的列表
    ##########
    for i in range(10):
        randIndex = int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])
        trainMat=[];trainClasses = []
        for docIndex in trainingSet:
            trainMat.append(setOfWords2Vec(vocabList,docList[docIndex]))
            trainClasses.append(classList[docIndex])
    ##########
    p0V, p1V, pSpam = trainNB0(np.array(trainMat), np.array(trainClasses))#训练朴素贝叶斯模型
    errorCount = 0                                                        #错误分类计数
    for docIndex in testSet:                                              #遍历测试集
        wordVector = setOfWords2Vec(vocabList, docList[docIndex])         #测试集的词集模型
        if classifyNB(np.array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:#如果分类错误
            errorCount += 1                                               #错误计数加1
            print("分类错误的测试集:",docList[docIndex])
    print('错误率:%.2f%%' % (float(errorCount) / len(testSet) * 100))


if __name__ == '__main__':
    spamTest()

import numpy as np
import random
import re
import os
os.system("! unzip -o ./机器学习第4章/ham.zip")

'''
Parameters:
    dataSet - 整理的样本数据集
Returns:
    vocabSet - 返回不重复的词条列表,也就是词汇表
'''
# 函数说明:将切分的实验样本词条整理成不重复的词条列表,也就是词汇表
def createVocabList(dataSet):
    vocabSet = set([])                      #创建一个空的不重复列表
    for document in dataSet:
        vocabSet = vocabSet | set(document) #取并集
    return list(vocabSet)

'''
Parameters:
    vocabList - createVocabList返回的列表
    inputSet - 切分的词条列表
Returns:
    returnVec - 文档向量,词集模型
'''
# 函数说明:根据vocabList词汇表,将inputSet向量化,向量的每个元素为1或0
def setOfWords2Vec(vocabList, inputSet):
    returnVec = [0] * len(vocabList)                               #创建一个其中所含元素都为0的向量
    for word in inputSet:                                          #遍历每个词条
        if word in vocabList:                                      #如果词条存在于词汇表中,则置1
            returnVec[vocabList.index(word)] = 1
        else: print("the word: %s is not in my Vocabulary!" % word)
    return returnVec                                               #返回文档向量

'''
Parameters:
    vocabList - createVocabList返回的列表
    inputSet - 切分的词条列表
Returns:
    returnVec - 文档向量,词袋模型
'''
# 函数说明:根据vocabList词汇表,构建词袋模型
def bagOfWords2VecMN(vocabList, inputSet):
    returnVec = [0]*len(vocabList)                          #创建一个其中所含元素都为0的向量
    for word in inputSet:                                   #遍历每个词条
        if word in vocabList:                               #如果词条存在于词汇表中,则计数加一
            returnVec[vocabList.index(word)] += 1
    return returnVec                                        #返回词袋模型

'''
Parameters:
    trainMatrix - 训练文档矩阵,即setOfWords2Vec返回的returnVec构成的矩阵
    trainCategory - 训练类别标签向量,即loadDataSet返回的classVec
Returns:
    p0Vect - 侮辱类的条件概率数组
    p1Vect - 非侮辱类的条件概率数组
    pAbusive - 文档属于侮辱类的概率
'''
# 函数说明:朴素贝叶斯分类器训练函数
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)                     #计算训练的文档数目
    numWords = len(trainMatrix[0])                      #计算每篇文档的词条数
    pAbusive = sum(trainCategory)/float(numTrainDocs)   #文档属于侮辱类的概率
    p0Num = np.ones(numWords); p1Num = np.ones(numWords)#创建numpy.ones数组,词条出现数初始化为1,拉普拉斯平滑
    p0Denom = 2.0; p1Denom = 2.0                        #分母初始化为2,拉普拉斯平滑
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:                       #统计属于侮辱类的条件概率所需的数据,
                                                        #即P(w0|1),P(w1|1),P(w2|1)···
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:                                           #统计属于非侮辱类的条件概率所需的数据,
                                                        #即P(w0|0),P(w1|0),P(w2|0)···
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = np.log(p1Num/p1Denom)                      #取对数,防止下溢出
    p0Vect = np.log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive#返回属于侮辱类的条件概率数组,属于非侮辱类的条件概率数组,文档属于侮辱类的概率

'''
Parameters:
    vec2Classify - 待分类的词条数组
    p0Vec - 侮辱类的条件概率数组
    p1Vec -非侮辱类的条件概率数组
    pClass1 - 文档属于侮辱类的概率
Returns:
    0 - 属于非侮辱类
    1 - 属于侮辱类
'''
# 函数说明:朴素贝叶斯分类器分类函数
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
    p1 = sum(vec2Classify * p1Vec) + np.log(pClass1)        #对应元素相乘。logA * B = logA + logB,
                                                            #所以这里加上log(pClass1)
    p0 = sum(vec2Classify * p0Vec) + np.log(1.0 - pClass1)
    if p1 > p0:
        return 1
    else:
        return 0

'''
Parameters:
    trainMatrix - 训练文档矩阵,即setOfWords2Vec返回的returnVec构成的矩阵
    trainCategory - 训练类别标签向量,即loadDataSet返回的classVec
Returns:
    p0Vect - 侮辱类的条件概率数组
    p1Vect - 非侮辱类的条件概率数组
    pAbusive - 文档属于侮辱类的概率
'''
# 函数说明:朴素贝叶斯分类器训练函数
def trainNB0(trainMatrix,trainCategory):
    numTrainDocs = len(trainMatrix)                      #计算训练的文档数目
    numWords = len(trainMatrix[0])                       #计算每篇文档的词条数
    pAbusive = sum(trainCategory)/float(numTrainDocs)    #文档属于侮辱类的概率
    p0Num = np.ones(numWords); p1Num = np.ones(numWords) #创建numpy.ones数组,词条出现数初始化为1,拉普拉斯平滑
    p0Denom = 2.0; p1Denom = 2.0                         #分母初始化为2,拉普拉斯平滑
    for i in range(numTrainDocs):
        if trainCategory[i] == 1:                        #统计属于侮辱类的条件概率所需的数据,
                                                         #即P(w0|1),P(w1|1),P(w2|1)···
            p1Num += trainMatrix[i]
            p1Denom += sum(trainMatrix[i])
        else:                                            #统计属于非侮辱类的条件概率所需的数据,
                                                         #即P(w0|0),P(w1|0),P(w2|0)···
            p0Num += trainMatrix[i]
            p0Denom += sum(trainMatrix[i])
    p1Vect = np.log(p1Num/p1Denom)                       #取对数,防止下溢出
    p0Vect = np.log(p0Num/p0Denom)
    return p0Vect,p1Vect,pAbusive#返回属于侮辱类的条件概率数组,属于非侮辱类的条件概率数组,文档属于侮辱类的概率

# 函数说明:接收一个大字符串并将其解析为字符串列表
def textParse(bigString):                                       #将字符串转换为字符列表
    listOfTokens = re.split(r'\W*', bigString)                  #将特殊符号作为切分标志进行字符串切分,即非字母、非数字
    return [tok.lower() for tok in listOfTokens if len(tok) > 2]#除了单个字母,例如大写的I,其它单词变成小写

# 函数说明:测试朴素贝叶斯分类器
def spamTest():
    docList = []; classList = []; fullText = []
    for i in range(1, 26):                                             #遍历25个txt文件
        wordList = textParse(open('ham/%d.txt' % i, 'r',encoding='utf-8',errors='ignore').read())#读取每个垃圾邮件,并字符串转换成字符串列表
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(1)                                            #标记垃圾邮件,1表示垃圾文件
        wordList = textParse(open('ham/%d.txt' % i, 'r',encoding='utf-8',errors='ignore').read()) #读取每个非垃圾邮件,并字符串转换成字符串列表
        docList.append(wordList)
        fullText.append(wordList)
        classList.append(0)                            #标记非垃圾邮件,1表示垃圾文件
    vocabList = createVocabList(docList)               #创建词汇表,不重复
    trainingSet = list(range(50)); testSet = []        #创建存储训练集的索引值的列表和测试集的索引值的列表
    ##########
    for i in range(10):
        randIndex = int(random.uniform(0,len(trainingSet)))
        testSet.append(trainingSet[randIndex])
        del(trainingSet[randIndex])
        trainMat=[];trainClasses = []
        for docIndex in trainingSet:
            trainMat.append(setOfWords2Vec(vocabList,docList[docIndex]))
            trainClasses.append(classList[docIndex])
    ##########
    p0V, p1V, pSpam = trainNB0(np.array(trainMat), np.array(trainClasses))#训练朴素贝叶斯模型
    errorCount = 0                                                        #错误分类计数
    for docIndex in testSet:                                              #遍历测试集
        wordVector = setOfWords2Vec(vocabList, docList[docIndex])         #测试集的词集模型
        if classifyNB(np.array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:#如果分类错误
            errorCount += 1                                               #错误计数加1
            print("分类错误的测试集:",docList[docIndex])
    print('错误率:%.2f%%' % (float(errorCount) / len(testSet) * 100))


if __name__ == '__main__':
    spamTest()

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据挖掘与数据分析 数据挖掘与数据分析 ⼀、数据挖掘和数据分析概述 数据挖掘和数据分析都是从数据中提取⼀些有价值的信息,⼆者有很多联系,但是⼆者的侧重点和实现⼿法有所区分。 数据挖掘和数据分析的不同之处: 1、在应⽤⼯具上,数据挖掘⼀般要通过⾃⼰的编程来实现需要掌握编程语⾔;⽽数据分析更多的是借助现有的分析⼯具进⾏。 2、在⾏业知识⽅⾯,数据分析要求对所从事的⾏业有⽐较深的了解和理解,并且能够将数据与⾃⾝的业务紧密结合起来;⽽数据挖掘不需 要有太多的⾏业的专业知识。 3、交叉学科⽅⾯,数据分析需要结合统计学、营销学、⼼理学以及⾦融、政治等⽅⾯进⾏综合分析;数据挖掘更多的是注重技术层⾯的结 合以及数学和计算机的集合 数据挖掘和数据分析的相似之处: 1、数据挖掘和数据分析都是对数据进⾏分析、处理等操作进⽽得到有价值的知识。 2、都需要懂统计学,懂数据处理⼀些常⽤的⽅法,对数据的敏感度⽐较好。 3、数据挖掘和数据分析的联系越来越紧密,很多数据分析⼈员开始使⽤编程⼯具进⾏数据分析,如SAS、R、SPSS等。⽽数据挖掘⼈员 在结果表达及分析⽅⾯也会借助数据分析的⼿段。⼆者的关系的界限变得越来越模糊。 ⼆、数据挖掘 1 数学预备知识 概率论:⽀撑整个数据挖掘算法和机器学习算法的数学基础,要熟悉常见的⼀些概率分布。 矩阵论:线性代数中对数据挖掘最有⽤的部分,还有⼀些线性空间相关知识也很重要。 信息论:将信息和数学紧密连接在⼀起并完美的表达的桥梁,需要掌握信息熵、信息增益等相关知识。 统计学:数据分析最早的依赖基础,通常和概率论⼀起应⽤,现在的机器学习数据挖掘很多都是基于统计的,常见的均值、⽅差、协⽅差 等都要熟练掌握。 2 编程基础 数据挖掘需要⼀定的编程基础,因为要实现模型以及数据的处理很多⼯作都是需要程序来进⾏的,数据挖掘常⽤的编程语⾔如下: SQL:数据库的熟练使⽤是任何数据挖掘⼈员必不可少的技能。 C++ :有很多的标准模板库以及机器学习模型库进⾏调⽤可以⽅便编程实现。 Python:对字符串处理有极⼤的优势,是解释型语⾔,实现简单,⽽且有很多开源的机器学习模型库的⽀持,可处理⼤规模数据。 Matlab:拥有强⼤的矩阵运算,也是解释型语⾔,有很多发展较成熟库可以直接调⽤,⽀持数据结果的可视化表⽰,但是处理数据量有 限。 R:近年兴起的数据分析编程语⾔,数据可视化做的⽐较好,语法简单,学习成本很低,很多⾮程序设计⼈员都可以数量掌握。 Java:使⽤范围最⼴的编程语⾔,有很多社区进⾏交流,进⾏编程实现具有灵活⾼效的特点,不⾜之处就是实现功能的代码量较⼤(相对于 其他数据挖掘编程语⾔)。 Scala: ⼀种具有⾯向对象风格、函数式风格、更⾼层的并发模型的编程语⾔。同时Scala是⼤数据处理平台Spark的实现语⾔。 3 数据挖掘模型知识 机器学习数据挖掘是紧密相关的,要进⾏数据挖掘需要掌握⼀些机器学习所⽤的⽅法和模型知识,通过模型的训练可以得到处理数据的最 优的模型数据挖掘常⽤的模型如下: 3.1 监督学习模型 就是⼈们常说的分类,通过已有的训练样本(即已知数据以及其对应的输出)去训练得到⼀个最优模型(这个模型属于某个函数的集合,最 优则表⽰在某个评价准则下是最佳的),再利⽤这个模型将所有的输⼊映射为相应的输出,对输出进⾏简单的判断从⽽实现分类的⽬的,也 就具有了对未知数据进⾏分类的能⼒。 3.1.1决策树: 决策树是⽤于分类和预测的主要技术之⼀,决策树学习是以实例为基础的归纳学习算法,它着眼于从⼀组⽆次序、⽆规则的实例中推理出以 决策树表⽰的分类规则。构造决策树的⽬的是找出属性和类别间的关系,⽤它来预测将来未知类别的记录的类别。它采⽤⾃顶向下的递归⽅ 式,在决策树的内部节点进⾏属性的⽐较,并根据不同属性值判断从该节点向下的分⽀,在决策树的叶节点得到结论。 主要的决策树算法有ID3、C4.5(C5.0)、CART、PUBLIC、SLIQ和SPRINT算法等。它们在选择测试属性采⽤的技术、⽣成的决策树的 结构、剪枝的⽅法以及时刻,能否处理⼤数据集等⽅⾯都有各⾃的不同之处。 3.1.2 贝叶斯⽅法: 贝叶斯(Bayes)分类算法是⼀类利⽤概率统计知识进⾏分类的算法,如朴素贝叶斯(Naive Bayes)算法。这些算法主要利⽤Bayes定理 来预测⼀个未知类别的样本属于各个类别的可能性,选择其中可能性最⼤的⼀个类别作为该样本的最终类别。由于贝叶斯定理的成⽴本⾝需 要⼀个很强的条件独⽴性假设前提,⽽此假设在实际情况中经常是不成⽴的,因⽽其分类准确性就会下降。为此就出现了许多降低独⽴性假 设的贝叶斯分类算法,如TAN(Tree Augmented Native Bayes)算法,它是在贝叶斯⽹络结构的基础上增加属性对之间的关联来实现 的。
好的,那我们来实现一个朴素贝叶斯分类器吧。 首先,我们需要导入需要的库,包括numpy、pandas、sklearn中的train_test_split和MultinomialNB。代码如下: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB ``` 接下来,我们要读取数据集。这里我们使用UCI机器学习库中的Spambase数据集,该数据集包含了4601封电子邮件,其中1813封是垃圾邮件,2788封是正常邮件。数据集中有57个特征,包括每封邮件中出现的单词的频率、字符的频率等。我们可以使用pandas库读取该数据集,代码如下: ```python data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data', header=None) ``` 然后,我们将数据集分成训练集和测试集。训练集用来训练模型,测试集用来评估模型的性能。我们可以使用sklearn中的train_test_split函数来实现数据集的分割,代码如下: ```python X_train, X_test, y_train, y_test = train_test_split(data.iloc[:,:-1], data.iloc[:,-1], test_size=0.3, random_state=42) ``` 这里我们将数据集按照7:3的比例分成训练集和测试集。 接下来,我们可以使用MultinomialNB来实现朴素贝叶斯分类器。MultinomialNB适用于多项式分布的数据,这里我们将每个特征的频率作为输入。代码如下: ```python clf = MultinomialNB() clf.fit(X_train, y_train) ``` 在这里,我们使用fit函数对训练集进行拟合,从而得到一个朴素贝叶斯分类器。 最后,我们可以使用测试集来评估模型的性能。代码如下: ```python y_pred = clf.predict(X_test) accuracy = np.mean(y_pred == y_test) print('Accuracy:', accuracy) ``` 这里我们使用predict函数对测试集进行预测,然后计算模型的准确率。 完整代码如下: ```python import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.naive_bayes import MultinomialNB # 读取数据集 data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data', header=None) # 分割数据集为训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(data.iloc[:,:-1], data.iloc[:,-1], test_size=0.3, random_state=42) # 训练朴素贝叶斯分类器 clf = MultinomialNB() clf.fit(X_train, y_train) # 评估模型性能 y_pred = clf.predict(X_test) accuracy = np.mean(y_pred == y_test) print('Accuracy:', accuracy) ``` 运行该代码,可以得到以下输出: ``` Accuracy: 0.8205099279858907 ``` 这意味着我们的朴素贝叶斯分类器在该测试集上的准确率约为82%。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shining0596

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值