数据挖掘-实验-朴素贝叶斯

  1. 1. 花的分类
  2. 2. 敏感词检测

花的分类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
from sklearn import tree
import matplotlib.pyplot as plt

from sklearn.datasets import load_iris

#将数据的属性和类别分别赋值给X和y
X,y=load_iris(return_X_y=True)
#每个数据的属性(X)是 花萼长度,花萼宽度,花瓣长度,花瓣宽度
#比如5.1, 3.5, 1.4, 0.2,意思就是这朵花的花萼长度是5.1,花萼宽度是3.5, 花瓣长度是1.4, 花瓣宽度是0.2
#数据的类别(y)有三个值,分别代表
#0: Setosa(山鸢尾),
#1: Versicolour(杂色鸢尾),
#2: Virginica(维吉尼亚鸢尾)

#print(X[:10])
#print(y)

#利用算法构建模型
clf=tree.DecisionTreeClassifier(criterion="entropy")
#训练模型
clf=clf.fit(X,y)

#生成决策树的图
fig,ax=plt.subplots(figsize=(10,10))
tree.plot_tree(clf.fit(X,y),ax=ax)
plt.show()

#分类
new_flower=[5.4,3.2,3.1,1.6]
print("flower is :",clf.predict([new_flower]))
#如果最后打印出来的是0,那么它的类别是Setosa(山鸢尾),
#如果最后打印出来的是1,那么它的类别是Versicolour(杂色鸢尾),
#如果最后打印出来的是2,那么它的类别是Virginica(维吉尼亚鸢尾).

敏感词检测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#导入包并定义数据集
import numpy as np
from functools import reduce

# 定义数据集
def loadDataSet():
postingList=[
['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'],
# 这其实是对一句话的分词,这句话是"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代表侮辱性词汇,0代表正常词汇
return postingList,classVec #返回实验样本切分的词条和类别标签向量


#创建词汇表并根据vocabList词汇表,将inputSet向量化,向量的每个元素为1或0

#创建vocabList词汇表
def createVocabList(dataSet):
vocabSet = set([]) #创建一个空的不重复列表
for document in dataSet:
vocabSet = vocabSet | set(document) #取并集
return list(vocabSet)

# 根据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 #返回文档向量


#定义朴素贝叶斯分类器训练函数

# 利用朴素贝叶斯分类器训练函数
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 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

#定义运行朴素贝叶斯分类器的函数


# 运行朴素贝叶斯分类器
def testingNB():
listOPosts,listClasses = loadDataSet() #创建实验样本
myVocabList = createVocabList(listOPosts) #创建词汇表
trainMat=[]
for postinDoc in listOPosts:
trainMat.append(setOfWords2Vec(myVocabList, postinDoc)) #将实验样本向量化
p0V,p1V,pAb = trainNB0(np.array(trainMat),np.array(listClasses)) #训练朴素贝叶斯分类器
testEntry = ['love', 'my', 'dalmation'] #测试样本1
thisDoc = np.array(setOfWords2Vec(myVocabList, testEntry)) #测试样本向量化
if classifyNB(thisDoc,p0V,p1V,pAb):
print(testEntry,'属于侮辱类') #执行分类并打印分类结果
else:
print(testEntry,'属于非侮辱类') #执行分类并打印分类结果
testEntry = ['stupid', 'garbage'] #测试样本2

thisDoc = np.array(setOfWords2Vec(myVocabList, testEntry)) #测试样本向量化
if classifyNB(thisDoc,p0V,p1V,pAb):
print(testEntry,'属于侮辱类') #执行分类并打印分类结果
else:
print(testEntry,'属于非侮辱类')

#添加main函数

if __name__ == '__main__':
testingNB()

#ps:尝试更改testEntry里面的单词,比如加个"good", "wonderful""之类的词,然后运行看这套模型的分类效果。 不过需要注意的是,如果要测试"good",就需要前面postingList里面加上带有good的句子/列表,这么做的原因是因为要给模型训练数据,让它知道good是正常词