数据挖掘实践(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 朴素⻉叶斯的优缺点

优点
  朴素⻉叶斯算法假设了数据集属性之间是相互独⽴的,因此算法的逻辑性⼗分简单,并且算法较为稳定,当数据呈现不同的特点时,朴素⻉叶斯的分类性能不会有太⼤的差异。换句话说就是朴素⻉叶斯算法的健壮性⽐较好,对于不同类型的数据集不会呈现出太⼤的差异性。当数据集属性之间的关系相对⽐较独⽴时,朴素⻉叶斯分类算法会有较好的效果。
缺点
  属性独⽴性的条件同时也是朴素⻉叶斯分类器的不⾜之处。数据集属性的独⽴性在很多情况下是很难满⾜的,因为数据集的属性之间往往都存在着相互关联,如果在分类过程中出现这种问题,会导致分类的效果⼤⼤降低。
原文地址:https://www.cnblogs.com/qiu-hua/p/14321873.html