场景
朴素贝叶斯分类器是一种基于贝叶斯定理的简单概率分类器,广泛应用于各种机器学习场景。朴素贝叶斯分类器利用贝叶斯定理来预测一个数据点的类别。贝叶斯定理提供了一种计算条件概率的方法,即在已知某些信息的情况下,事件发生的概率。“朴素”一词源于该算法对特征之间相互独立的假设。在现实世界中,这种假设可能并不总是成立,但朴素贝叶斯在实践中仍然表现良好。对于给定的训练数据集,算法首先基于类别计算特征的概率分布。然后,使用这些概率来预测新数据点的类别。
适用场景和用途
·文本分类:例如垃圾邮件识别、新闻文章分类。朴素贝叶斯特别适用于处理文本数据,因为它能够处理大量的特征(如单词)。
·情感分析:在社交媒体分析、产品评论等领域中识别正面或负面情感。
·推荐系统:基于用户的兴趣和偏好预测用户可能喜欢的产品或服务。
·医疗诊断:基于症状预测疾病。
·天气预测:例如根据历史天气数据预测下雨概率。
案例
假设我们有两个类别: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,第二个我们自己根据公式来写一个简单的分类器,比对一下效果。
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 modelif __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)] = 1else: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.0p1Denom = 2.0for 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)
结束
朴素贝叶斯分类器基本使用和原理结束