1 简介
假定:样本属性独立性假定
比如一篇文章w=(词1,词2,词3,...)
我们要看这篇文章属于科技还是娱乐
需要计算p(科技|w)和p(娱乐|w),哪个概率大,我们就把这篇文章分到哪一类
p(科技|w)=p(科技|词1,词2,词3,...)=p(词1,词2,词3,...|科技)p(科技)/p(词1,词2,词3,...)
p(娱乐|w)=p(娱乐|词1,词2,词3,...)=p(词1,词2,词3,...|娱乐)p(娱乐)/p(词1,词2,词3,...)
可以看到分母都是一样的,所以考虑分子大小即可。
2 优缺点
(一)优点
1、不需要调参
2、有稳定的分类效率
3、对缺失数据不太敏感,算法比较简单,常用于文本分类,分类准确性高,速度快
(二)缺点
1、假设条件:样本属性独立性的假定,所以样本属性有关联时效果不好
2、在训练集中进行统计词工作,会对结果造成干扰
3 实例-对新闻进行分类
首先导入模块
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
朴素贝叶斯算法:
def NB():
news=fetch_20newsgroups()
x=news.data
y=news.target
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.25)
tfidf = TfidfVectorizer()
x_train = tfidf.fit_transform(x_train)
x_test = tfidf.transform(x_train)
nb=MultinomialNB(alph=1.0)
nb.fit(x_train,y_train)
y_predict=nb.predict(x_test)
print('预测文章类别为:', y_predict)
score=nb.score(x_test,y_test)
print('准确率为:',score)
#混合矩阵
print('每个类别的精准性和召回率',classification_report(y_test,y_predict,target_names=news.target_names))
if __name__='__main__':
NB()
输出:
预测文章类别为: [ 7 14 17 ... 10 14 5]
准确率为: 0.8404074702886248
每个类别的精确率和召回率: precision recall f1-score support
alt.atheism 0.85 0.73 0.79 214
comp.graphics 0.86 0.73 0.79 252
comp.os.ms-windows.misc 0.87 0.81 0.84 266
comp.sys.ibm.pc.hardware 0.81 0.81 0.81 267
comp.sys.mac.hardware 0.83 0.87 0.85 223
comp.windows.x 0.91 0.86 0.88 260
misc.forsale 0.94 0.68 0.79 251
rec.autos 0.85 0.95 0.90 226
rec.motorcycles 0.95 0.96 0.95 256
rec.sport.baseball 0.98 0.92 0.95 281
rec.sport.hockey 0.89 0.96 0.93 226
sci.crypt 0.78 0.99 0.87 256
sci.electronics 0.89 0.78 0.83 251
sci.med 0.94 0.90 0.92 227
sci.space 0.81 0.93 0.87 220
soc.religion.christian 0.56 0.98 0.71 248
talk.politics.guns 0.75 0.98 0.85 223
talk.politics.mideast 0.88 0.99 0.93 209
talk.politics.misc 0.99 0.56 0.72 194
talk.religion.misc 0.97 0.19 0.31 162
avg / total 0.86 0.84 0.83 4712