模型介绍
朴素贝叶斯与前述基于线性假设的模型(线性分类器和支持向量机分类器)不同,朴素贝叶斯分类器的构造基础是贝叶斯理论。抽象一些说,朴素贝叶斯分类器会单独考量每一维度特征被分类的条件概率,进而综合这些概率并对其所在的特征向量做出分类预测。因此,这个模型的基本数学假设是:各个维度上的特征被分类的条件概率之间是相互独立的。
采用概率模型来描述,定义 x=<x1,x2,⋅⋅⋅,xn>为某一 n维特征向量, y∈{c1,c2,⋅⋅⋅ck}为该特征向量 x所有 k种可能的类别,记 P(y=ci∣x)为特征向量 x属于类别 ci的概率。根据式子(9)的
好难,看不懂
贝叶斯原理:
P(y∣x)=P(x)P(x∣y)P(y)(9)
我们的目标是寻找所有 y∈{c1,c2,⋅⋅⋅,ck}中 P(y∣x)最大的,即 yargmaxP(y∣x);并且考虑到 P(x)对于同一样本都是相同的,因此可以忽略不记,所以,
yargmaxP(y∣x)=argymaxP(x∣y)P(y)=yargmaxP(x1,x2,⋯,xn∣y)P(y)(10)
若每一种特可能的取值均为0或者1,在没有任何特殊假设的条件下,计算 P(x1,x2,⋯,xn∣y)需要对 k∗2n个可能的参数进行估计:
P(x1,x2,⋯,xn∣y)=P(x1∣y)P(x2∣x1,y)P(x3∣x1,x2,y)⋯P(xn∣x1,x2,⋯,xn−1,y)(11)
但是由于朴素贝叶斯模型的特征类别条件独立假设, P(xn∣x1,x2,⋅⋅⋅,xn−1,y)=P(xn∣y);若依然每一种特征可能的取值只有2中,那么只需要估计 2kn个参数,即 P(x1=0∣y=c1),P(x1=1∣y=c1),⋅⋅⋅,P(xn=1∣y=ck)。为了估计每个参数的概率,采用如下的公式,并且改用频率比近似计算概率:
P(xn=1∣y=ck)=P(y=ck)P(xn=1,y=ck)=#(y=ck)#(xn=1,y=ck)(12)
编程实践
朴素贝叶斯有着广泛的实际应用环境,特别是在文本分类的任务中,包括互联网新闻的分类、垃圾邮件的筛选等。本次实践使用经典的20类新闻文本作为试验数据。k
#获取数据集
from sklearn.datasets import fetch_20newsgroups
news=fetch_20newsgroups(subset="all")
print(len(news.data))
print(news.data[0])
#分配训练集与测试集
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(news.data,news.target,test_size=0.25,random_state=33)
#提取文本特征向量
from sklearn.feature_extraction.text import CountVectorizer
vec=CountVectorizer()
X_train=vec.fit_transform(X_train)
X_test=vec.transform(X_test)
#模型初始化、模型训练、模型预测
from sklearn.naive_bayes import MultinomialNB
mnb=MultinomialNB()
mnb.fit(X_train,y_train)
y_predict=mnb.predict(X_test)
y_predict
#模型性能评估
from sklearn.metrics import classification_report
print('accuracy',mnb.score(X_test,y_test))
print(classification_report(y_test,y_predict,target_names=news.target_names))
特点分析
朴素贝叶斯模型广泛应用于海量互联网文本分类任务。由于其较强的特征条件独立假设,使得模型预测所需要估计的参数规模从幂指数量级相线性量级减少,极大节约了内存兄啊好和计算时间。但是,也正是受这种强假设的限制,模型训练时无法将各个特征之间的联系考量在内,使得该模型在其他数据特征关联性较强的分类任务上的性能表现不佳。