zoukankan      html  css  js  c++  java
  • 数据挖掘实践(11):基础理论(十一)数学基础(十一)概率(七)sklearn中的朴素⻉叶斯

    1 sklearn中的朴素⻉叶斯

    from sklearn.naive_bayes import GaussianNB
    # from sklearn.naive_bayes import BernoulliNB
    from sklearn.naive_bayes import MultinomialNB
    from sklearn.model_selection import cross_val_score
    from sklearn import datasets
    iris = datasets.load_iris()
    print(iris)
    gnb = MultinomialNB()
    scores = cross_val_score(gnb, iris.data, iris.target, cv=10,
    scoring='accuracy')
    print("Accuracy:%.3f" % scores.mean())

    2 朴素⻉叶斯的python实现

    # 朴素⻉叶斯分类器训练函数
    def trainNB0(trainMatrix, trainCategory):
     
     # 总⽂件数
     numTrainDocs = len(trainMatrix)
     # 总单词数
     numWords = len(trainMatrix[0])
     # 侮辱性⽂件的出现概率
     pAbusive = sum(trainCategory)/float(numTrainDocs)
     # 构造单词出现次数列表
     # p0Num 正常的统计
     # P1Num 侮辱的统计
     p0Num = np.ones(numWords)
     p1Num = np.ones(numWords)
     
     # 整个数据集单词出现的总数,根据样本/实际调查结果调整分⺟的值
     global p0Denom
     global p1Denom
     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])
     # 类别1,即侮辱性⽂档的
    [log(P(F1|C1)),log(P(F2|C1)),log(P(F3|C1)),log(P(F4|C1)),log(P(F5|C1))....]列表
     p1Vect = np.log(p1Num / p1Denom)
     # 类别0,即正常⽂档的
    [log(P(F1|C0)),log(P(F2|C0)),log(P(F3|C0)),log(P(F4|C0)),log(P(F5|C0))....]列表
     p0Vect = np.log(p0Num / p0Denom)
     return p0Vect, p1Vect, pAbusive



    # 切分⽂本 def textParse(bigString): ''' Desc: 接收⼀个⼤字符串并将其解析为字符串列表 Args: bigString -- ⼤字符串 jieba Returns: 去掉少于 2 个字符的字符串,并将所有字符串转换为⼩写,返回字符串列表 ''' import re # 使⽤正则表达式来切分句⼦,其中分隔符是除单词、数字外的任意字符串 listOfTokens = re.split(r'W*', bigString) return [tok.lower() for tok in listOfTokens if len(tok) > 2]


    def createVocabList(dataSet): """ 获取所有单词的集合 :param dataSet: 数据集 :return: 所有单词的集合(即不含重复元素的单词列表) """ vocabSet = set([]) # create empty set for document in dataSet: # 操作符 | ⽤于求两个集合的并集 vocabSet = vocabSet | set(document) # union of the two sets return list(vocabSet) def setOfWords2Vec(vocabList, inputSet): """ 遍历查看该单词是否出现,出现该单词则将该单词置1 :param vocabList: 所有单词集合列表 :param inputSet: 输⼊数据集 :return: 匹配列表[0,1,0,1...],其中 1与0 表示词汇表中的单词是否出现在输⼊的数据集中 """ # 创建⼀个和词汇表等⻓的向量,并将其元素都设置为0 returnVec = [0] * len(vocabList)# [0,0......] # 遍历⽂档中的所有单词,如果出现了词汇表中的单词,则将输出的⽂档向量中的对应值设为1 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


    #朴素⻉叶斯分类函数 def classifyNB(vec2Classify,p0Vec,p1Vec,pClass1): p1=sum(vec2Classify*p1Vec)+np.log(pClass1) p0=sum(vec2Classify*p0Vec)+np.log(1.0-pClass1) if p1>p0: return 1 else: return 0


    def spamTest(): ''' Desc: 对⻉叶斯垃圾邮件分类器进⾏⾃动化处理。 Args: none Returns: 对测试集中的每封邮件进⾏分类,若邮件分类错误,则错误数加 1,最后返回总的错误百分⽐。 ''' docList = [] classList = [] fullText = [] for i in range(1, 26): # 切分,解析数据,并归类为 1 类别 wordList = textParse(open(r'4.NaiveBayes/email/spam/%d.txt' % i,encoding='ISO-8859-1').read()) docList.append(wordList) classList.append(1) # 切分,解析数据,并归类为 0 类别 wordList = textParse(open(r'4.NaiveBayes/email/ham/%d.txt' % i,encoding='ISO-8859-1').read()) docList.append(wordList) fullText.extend(wordList) classList.append(0) # 创建词汇表 vocabList = createVocabList(docList) trainingSet = list(range(50)) testSet = [] # 随机取 10 个邮件⽤来测试 for i in range(10): # random.uniform(x, y) 随机⽣成⼀个范围为 x ~ y 的实数 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 print ('the errorCount is: ', errorCount) print ('the testSet length is :', len(testSet)) print ('the error rate is :', float(errorCount)/len(testSet))

    import random import numpy as np import math spamTest()
    the errorCount is: 6
    the testSet length is : 10
    the error rate is : 0.6

    3 ⻉叶斯的开发流程

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

    4 朴素⻉叶斯的优缺点

    优点
      朴素⻉叶斯算法假设了数据集属性之间是相互独⽴的,因此算法的逻辑性⼗分简单,并且算法较为稳定,当数据呈现不同的特点时,朴素⻉叶斯的分类性能不会有太⼤的差异。换句话说就是朴素⻉叶斯算法的健壮性⽐较好,对于不同类型的数据集不会呈现出太⼤的差异性。当数据集属性之间的关系相对⽐较独⽴时,朴素⻉叶斯分类算法会有较好的效果。
    缺点
      属性独⽴性的条件同时也是朴素⻉叶斯分类器的不⾜之处。数据集属性的独⽴性在很多情况下是很难满⾜的,因为数据集的属性之间往往都存在着相互关联,如果在分类过程中出现这种问题,会导致分类的效果⼤⼤降低。
  • 相关阅读:
    linux下ssh端口的修改和登录
    linux找回密码
    XAMPP命令之LAMPP
    VirtualBox 复制vdi文件和修改vdi的uuid
    探讨PHP页面跳转几种实现技巧
    CSS盒模型和margin重叠
    8--数组旋转
    9--斐波那契数列
    7--动态规划
    6--树的遍历
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14321873.html
Copyright © 2011-2022 走看看