朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率。
对缺失数据不太敏感,算法也比较简单,常用于文本分类。
分类准确度高,速度快。
朴素贝叶斯的模型是基于条件概率和联合概率为基础的。 求分类时,有个前提要求是 条件是独立的。
公式如下:
朴素贝叶斯算法学习心得
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 代表的是拉普拉斯平滑系数.
可以通过网格搜索,交叉验证,进行调参.
朴素贝叶斯算法学习心得

分类:

技术点:

相关文章: