朴素贝叶斯算法学习心得
朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
对缺失数据不太敏感,算法也比较简单,常用于文本分类。
分类准确度高,速度快。
朴素贝叶斯的模型是基于条件概率和联合概率为基础的。 求分类时,有个前提要求是 条件是独立的。
公式如下:
w 为给定文档的特征值.
文档中的特征有很多(word1,word2,word3…) p(w)=p(word1)*p(word2)*p(word2…).这个值是固定的
c为文档的类别
p(w|c) 意思是在C类别文档中,出现w特征值的概率即:
p(w|c)=p(word1|c)*p(word2|c)*p(word2|c)
p(word1|c)=该词在c类别中出现的次数 除以 c类别下所有词出现的次数之和.
p© :某个文档类别词数 除以 总文档词数
当然,假设某个词在某文档中出现的次数为0,统计出来的某类别概率为0,这个是不科学的。 为解决这个问题添加了拉普拉斯平滑系数.
案例:
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
def naviebayes():
'''
朴素贝叶斯进行文本分类
:return: none
'''
news=fetch_20newsgroups(subset='all')
#进行数据分割
x_train,x_test,y_train,y_test=train_test_split(news.data,news.target,test_size=0.25)
#对数据集进行特征处理
tf =TfidfVectorizer()
#以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
x_train=tf.fit_transform(x_train)
# test=x_train[1].toarray() #转换成列表查看
# with open('a.txt','w') as f:
# for i in test[0]:
# f.write(str(i))
x_test =tf.transform(x_test)
#进行朴素贝叶斯算法统计
mlt=MultinomialNB(alpha=1.0)
mlt.fit(x_train,y_train)
y_predict=mlt.predict(x_test)
print('预测的文章类别为:',y_predict)
#得出准确率
print('准确率为',mlt.score(x_test,y_test))
print('每个类别的精确率和召回率:',classification_report(y_test,y_predict,target_names=news.target_names))
return None
if __name__ == '__main__':
naviebayes()
这里面有个超参数 alpha 代表的是拉普拉斯平滑系数.
可以通过网格搜索,交叉验证,进行调参.