机器学习之朴素贝叶斯分类——基于Scikit-Learn

《Python数据科学手册》笔记

一、朴素贝叶斯分类原理

在贝叶斯分类中,我们希望确定一个具有某些特征的样本属于某类标签的概率,通常记为P(L|特征)。贝叶斯公式为:

假设要确定两种标签,定义为L1,L2,通过两个标签的后验概率比值

其中P(L1)和P(L2)易知,故只需要求出P(特征|Li)即可,即要知道每类数据中各特征的概率分布。而这个概率分布很难确知,通常是用一些常见的分布做简单的假设。正是由于只做了“简单”的假设,故称之为“朴素”贝叶斯。当假设每个标签的数据都服从简单的高斯分布时,该朴素贝叶斯分类器就是高斯朴素贝叶斯;当假设特征是由一个简单多项式分布生成的,该朴素贝叶斯分类器就是多项式朴素贝叶斯。

接下来就以高斯朴素贝叶斯和多项式朴素贝叶斯为例,调用Scikit-Learn中的相应模块进行分类演示。

二、高斯朴素贝叶斯

假设数据服从高斯分布,且变量线性无关。那么只要找出每个标签的所有样本点均值和标准差,再定义一个高斯分布,就可以拟合模型了。

#生成一些训练数据
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
X,y = make_blobs(100,2,centers=2,random_state=2,cluster_std=1.5)
#用高斯朴素贝叶斯模型进行训练
from sklearn.naive_bayes import GaussianNB
model = GaussianNB()
model.fit(X,y)
#生成一些新数据来预测标签
rng = np.random.RandomState(0)
Xnew = [-6,-14]+[14,18]*rng.rand(2000,2)
ynew = model.predict(Xnew)
#画图
plt.scatter(X[:,0],X[:,1],c=y,s=50,cmap='RdBu')
lim = plt.axis()
plt.scatter(Xnew[:,0],Xnew[:,1],c=ynew,s=20,cmap='RdBu',alpha=0.1)
plt.axis(lim)

结果为:

扫描二维码关注公众号,回复: 5430933 查看本文章

其中,深色点为训练数据,半透明点为测试数据。半透明点的蓝色和红色分别表示模型预测划分出的两个类别,可以在分类结果中看到一条稍显弯曲的边界(半透明红蓝相间处),通常,高斯朴素贝叶斯的边界是二次方曲线

由于分类的最终效果只能依赖于一开始的模型假设,因此高斯朴素贝叶斯经常得不到好的结果,但在特征较多的时候,也不失为一种有用的方法。还有一种常用的假设是多项式朴素贝叶斯。

三、多项式朴素贝叶斯

多项式朴素贝叶斯假设特征由一个简单多项式分布生成,非常适用于描述出现次数或者出现次数比例的特征,例如文本分类,其特征都是指待分类文本的单词出现次数或者频次。

以四类新闻为例:

categories = ['talk.religion.misc','soc.religion.christian','sci.space','comp.graphics']
train = fetch_20newsgroups(subset='train',categories=categories)
test = fetch_20newsgroups(subset='test',categories=categories)
#创建一个管道,将TF-IDF向量化方法与多项式朴素贝叶斯分类器组合在一起
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
model = make_pipeline(TfidfVectorizer(),MultinomialNB())
#训练模型,预测标签
model.fit(train.data,train.target)
labels = model.predict(test.data)
#用混淆矩阵统计测试数据的真实标签与预测标签的结果
from sklearn.metrics import confusion_matrix
mat = confusion_matrix(test.target,labels)
sns.heatmap(mat.T,square=True,annot=True,fmt='d',cbar=False,xticklabels=train.target_names,yticklabels=train.target_names)
plt.xlabel('true label')
plt.ylabel('predicted label')

运行结果为:

该矩阵为混淆矩阵,可以显示每类数据预测正确与错误的数量。横向各类为正确的标签,纵向各类为模型预测出的类别,对角线上的值即为预测正确的数据量,非对角线上的值为预测错误的数据量。例如最后一列的‘187’即为真实标签为talk religion.misc"却被模型预测为soc.religion.christian"类的数据量。

四、朴素贝叶斯的应用场景

①训练和预测的速度非常快

②直接使用概率预测

③通常很容易解释

④可调参数非常少

不过朴素贝叶斯分类器对数据有严格的假设,因此它的训练效果通常比复杂模型的差

另外介绍一下一般分类器的生成算法

①通过标签分割训练数据

②为每个集合拟合一个KDE来获得数据的生成模型,用任意x观测值和y标签计算出似然估计P(x|y)

根据训练集中每一类的样本数量,计算每一类的先验概率P(y)

④对于一个未知的点x,每一类的后验概率 P(x|y) 正比于 P(x|y)*  P(y)

猜你喜欢

转载自blog.csdn.net/elma_tww/article/details/88038012
今日推荐