您的位置:首页 > 编程语言 > Python开发

sklearn:朴素贝叶斯(naïve beyes)

2017-05-27 13:07 190 查看
朴素贝叶斯的原理:

基于朴素贝叶斯公式,比较出后验概率的最大值来进行分类,后验概率的计算是由先验概率与类条件概率的乘积得出,先验概率和类条件概率要通过训练数据集得出,即为朴素贝叶斯分类模型,将其保存为中间结果,测试文档进行分类时调用这个中间结果得出后验概率。

一、基本定义

分类是把一个事物分到某个类别中。一个事物具有很多属性,把它的众多属性看作一个向量,即x=(x1,x2,x3,…,xn),用x这个向量来代表这个事物,x的集合记为X,称为属性集。类别也有很多种,用集合C={c1,c2,…cm}表示。一般X和C的关系是不确定的,可以将X和C看作是随机变量,P(C|X)称为C的后验概率,与之相对的,P(C)称为C的先验概率。

根据贝叶斯公式,后验概率P(C|X)=P(X|C)P(C)/P(X),但在比较不同C值的后验概率时,分母P(X)总是常数,忽略掉,后验概率P(C|X)=P(X|C)P(C),先验概率P(C)可以通过计算训练集中属于每一个类的训练样本所占的比例,对类条件概率P(X|C)的估计,我们只谈论朴素贝叶斯分类器方法,因为朴素贝叶斯假设事物属性之间相互条件独立,P(X|C)=∏P(xi|ci)。

二、模型原理与训练

朴素贝叶斯分类器是一种有监督学习,常见有两种模型,多项式模型(multinomial model)即为词频型和伯努利模型(Bernoulli model)即文档型,还有一种高斯模型。

前二者的计算粒度不一样,多项式模型以单词为粒度,伯努利模型以文件为粒度,因此二者的先验概率和类条件概率的计算方法都不同。计算后验概率时,对于一个文档d,多项式模型中,只有在d中出现过的单词,才会参与后验概率计算,伯努利模型中,没有在d中出现,但是在全局单词表中出现的单词,也会参与计算,不过是作为“反方”参与的。
这里暂不考虑特征抽取、为避免消除测试文档时类条件概率中有为0现象而做的取对数等问题。

(1)高斯模型

有些特征可能是连续型变量,比如说人的身高,物体的长度,这些特征可以转换成离散型的值,比如如果身高在160cm以下,特征值为1;在160cm和170cm之间,特征值为2;在170cm之上,特征值为3。也可以这样转换,将身高转换为3个特征,分别是f1、f2、f3,如果身高是160cm以下,这三个特征的值分别是1、0、0,若身高在170cm之上,这三个特征的值分别是0、0、1。不过这些方式都不够细腻,高斯模型可以解决这个问题。高斯模型假设这些一个特征的所有属于某个类别的观测值符合高斯分布,也就是:
 
from sklearn.naive_bayes import GaussianNB
#高斯贝叶斯
def train_model_GaussianNB():
pass
clf3 = GaussianNB()
clf3.fit(X[499:], y[499:])#训练模型
predict_labels = clf3.predict(X[0:499])
# 预测对了几个?
n = 0
for i in range(len(predict_labels)):
if (predict_labels[i] == y[i]):
n = n + 1
print("高斯贝叶斯:")
# 正确率
print n / 499.0
# 混淆矩阵
confusion_matrix(y[0:499], predict_labels)
return


(2)多项式模型

在多项式模型中,设某文档d=(t1,t2,…,tk),tk是该文档中出现过的单词,允许重复,则先验概率P(c)= 类c下单词总数/整个训练样本的单词总数。类条件概率P(tk|c)=(类c下单词tk在各个文档中出现过的次数之和+1)/(类c下单词总数+|V|)。

其中V是训练样本的单词表(即抽取单词,单词出现多次,只算一个),|V|则表示训练样本包含多少种单词。P(tk|c)可以看作是单词tk在证明d属于类c上提供了多大的证据,而P(c)则可以认为是类别c在整体上占多大比例(有多大可能性)。
from sklearn.naive_bayes import MultinomialNB
#多项式贝叶斯
def train_model_MultinomialNB():
pass
clf = MultinomialNB()
#训练模型
clf.fit(X[499:],y[499:])
#预测训练集
predict_labels = clf.predict(X[0:499])
#预测对了几个?
n = 0
for i in range(len(predict_labels)):
if(predict_labels[i] == y[i]):
n = n + 1
print("多项式贝叶斯:")
#正确率
print n/499.0
#混淆矩阵
confusion_matrix(y[0:499], predict_labels)
return


(3)伯努利模型

P(c)= 类c下文件总数/整个训练样本的文件总数 

P(tk|c)=(类c下包含单词tk的文件数+1)/(类c下包含的文件+2)
from sklearn.naive_bayes import BernoulliNB
#伯努利贝叶斯
def train_model_BernoulliNB():
pass
clf2 = BernoulliNB()
clf2.fit(X[499:], y[499:])
predict_labels = clf2.predict(X[0:499])
# 预测对了几个?
n = 0
for i in range(len(predict_labels)):
if (predict_labels[i] == y[i]):
n = n + 1
print("伯努利贝叶斯:")
# 正确率
print n / 499.0
# 混淆矩阵
confusion_matrix(y[0:499], predict_labels)
return


后记:文本分类是作为离散型数据的。朴素贝叶斯用于很多方面,数据就会有连续和离散的,连续型时可用正态分布,还可用区间,将数据的各属性分成几个区间段进行概率计算,测试时看其属性的值在哪个区间就用哪个条件概率。再有TF、TDIDF,这些只是描述事物属性时的不同计算方法,例如文本分类时,可以用单词在本文档中出现的次数描述一个文档,可以用出现还是没出现即0和1来描述,还可以用单词在本类文档中出现的次数与这个单词在剩余类出现的次数(降低此属性对某类的重要性)相结合来表述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息