朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器,广泛应用于各种机器学习场景。朴素贝叶斯分类器利用贝叶斯定理来预测一个数据点的类别。贝叶斯定理提供了一种计算条件概率的方法,即在已知某些信息的情况下,事件发生的概率。“朴素”一词源于该算法对特征之间相互独立的假设。在现实世界中,这种假设可能并不总是成立,但朴素贝叶斯在实践中仍然表现良好。对于给定的训练数据集,算法首先基于类别计算特征的概率分布。然后,使用这些概率来预测新数据点的类别。
·文本分类:例如垃圾邮件识别、新闻文章分类。朴素贝叶斯特别适用于处理文本数据,因为它能够处理大量的特征(如单词)。
·情感分析:在社交媒体分析、产品评论等领域中识别正面或负面情感。
·推荐系统:基于用户的兴趣和偏好预测用户可能喜欢的产品或服务。
·医疗诊断:基于症状预测疾病。
·天气预测:例如根据历史天气数据预测下雨概率。
假设我们有两个类别:0 和 1。类别 0 可以代表“负面评论”,类别 1 可以代表“正面评论”。
准备数据集:
# 示例数据集
data = [
"This product is great",
"I am very happy with this purchase",
"Terrible, I hate it",
"Worst experience ever",
"I love this product",
"Not what I expected",
"Highly recommended",
"Very disappointed",
"Will buy it again",
"Do not recommend"
]
# 对应的类别标签
labels = [1, 1, 0, 0, 1, 0, 1, 0, 1, 0]
这里我们通过两种方式,第一种是python提供好的一个API,第二个我们自己根据公式来写一个简单的分类器,比对一下效果。
def python_test(data,labels,vectorizer):
# 将数据集转化为向量
X = vectorizer.fit_transform(data)
# 划分数据集和训练集
X_train, X_test, y_train, y_test = train_test_split(X, labels, test_size=0.2, random_state=42)
# 创建并训练朴素贝叶斯模型
model = MultinomialNB()
model.fit(X_train, y_train)
return model
if __name__ == '__main__':
vectorizer = CountVectorizer()
data,labels = loadData()
model = python_test(data,labels,vectorizer)
test_data = ["Really happy with this product", "It was a bad purchase"]
test_X = vectorizer.transform(test_data)
predictions = model.predict(test_X)
print(predictions)
结果是[0,1]
在这里我们可以看到是把数据先转成向量,然后划分数据集和训练集,然后训练这些数据,最后给出结果,就其原理,实际上是,将词拆开之后,对每一个词计算概率,然后对给出的这个词,看看它的概率是好评大,还是差评大。我们可以写一下这个过程。
# 加载数据集
def loadDataSet():
postingList = [['you', 'are', 'a', 'pig'],
['you', 'are', 'a', 'smart', 'boy']]
classVec = [1, 0] # 1代表侮辱性文档,0代表非侮辱性文档
return postingList, classVec
这里我们有两个数据集,1代表侮辱性文档,0代表非侮辱性的文档。
def createVocabList(dataSet):
vocabSet = set([])
for document in dataSet:
vocabSet = vocabSet | set(document)
return list(vocabSet)
这里我们创建了词汇表 将所有的单词都放入这个词汇表中去了
def setOfWords2Vec(vocabList, inputSet):
returnVec = [0] * len(vocabList)
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 trainNB0(trainMatrix, trainCategory):
numTrainDocs = len(trainMatrix)
numWords = len(trainMatrix[0])
pAbusive = sum(trainCategory) / float(numTrainDocs)
p0Num = ones(numWords)
p1Num = ones(numWords)
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])
p1Vect = log(p1Num / p1Denom)
p0Vect = log(p0Num / p0Denom)
return p0Vect, p1Vect, pAbusive
这里事实上就是计算 好坏文档的概率,然后再计算 每一个词在好文档,坏文档中出现的概率
传入一个新文档,对文档进行分类。
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
return 1 if p1 > p0 else 0
其实就是比较概率谁大而已
if __name__ == '__main__':
# 加载数据 postingList是总文档,classVec是类别表示是否是侮辱性文档
postingList, classVec = loadDataSet()
# 简历独立的词汇表
print(postingList)
print(classVec)
list = createVocabList(postingList)
print(list)
trainMatrix= []
for posting in postingList:
trainMatrix.append(setOfWords2Vec(list,posting))
print(trainMatrix)
p0Vect,p1Vect,pAbusive = trainNB0(trainMatrix,classVec)
print(p0Vect)
testEntry = ['FUCK','LOVE']
thisDoc = array(setOfWords2Vec(list, testEntry))
result = classifyNB(thisDoc, p0Vect, p1Vect, pAbusive)
print(result)
朴素贝叶斯分类器基本使用和原理结束