python分类分析--朴素贝叶斯算法原理与文本分类分析案例

一、朴素贝叶斯算法原理

1、联合概率、条件概率与相互独立

·联合概率:包含多个条件,且所有事件同时成立的概率

。记作:P(A,B)
。例如:P(程序员,体型匀称),P(程序员,超重,喜欢)

·条件概率:就是事件A在另外一个事件B已经发生条件下的发生概率

。记作:P(A|B)
。例如:P(程序员|男生),P(程序员,体重标准|女性)

·相互独立:如果P(A,B)=P(A)P(B),则称事件A与事件B相互独立。

2、贝叶斯公式:P(C|W) = [ P(W|C)*P© ] / P(W)

注:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别

转化一下:P(Y|X1,X2,…) = [ P(X1,X2,…|Y)*P(Y) ] / P(X1,X2,…)

简单理解一下:在已知特征信息X1,X2,...的条件下,事件Y发生的概率,
等于在事件Y发生的条件下这些特征信息的联合概率(所有特征信息都成立的概率),
乘以在这个样本中事件Y发生的概率,再去除以在整个样本中这些特征信息的联合概率。

3、朴素贝叶斯算法原理

朴素 + 贝叶斯

朴素: 假设特征信息X1,X2,…之间是相互独立的。即P(X1,X2,…)=P(X1) * P(X2)*…

贝叶斯:P(Y|X1,X2,…) = [ P(X1,X2,…|Y)*P(Y) ] / P(X1,X2,…)

朴素贝叶斯:P(Y|X1,X2,…)=P(X1,X2,…|Y)* P(Y) / P(X1,X2,…) = P(X1|Y)* P(X2|Y)…P(Xn|Y) * P(Y) / P(X1)P(X2)…P(Xn)

简单理解一下:在已知相互独立的特征信息X1,X2,...的条件下,事件Y发生的概率,
等于在时间Y发生的条件下每个独立特征信息发生的概率乘积,
乘以在这个样本中事件Y发生的概率,
再去除以在整个样本中这些特征信息的联合概率(这些特征信息发生的概率乘积)。

应用场景:如文本分类(关键词之间是相互独立的),垃圾邮件的分类,信用评估,钓鱼网站检测等等

优缺点:优点对缺失值不敏感。缺点特征变量(特征值,特征信息)间需要相互独立。

4、防止计算出的分类概率为0

不管是贝叶斯公式还是朴素贝叶斯公式,我们发现都是概率的乘法和除法,所以一旦有某个概率为0,就会导致结果概率为0的错误结果。

所以在实际的算法中我们需要引入拉普拉斯平滑系数,解决这一问题。

拉普拉斯平滑系数 :p(Fi|C)=(Ni+alpha)/(N+alpha*m)

alpha是指定的系数一般是1,m是训练文档中统计出来的特征词的个数。

5、案例说明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4wu9yUxC-1582454196426)(attachment:image.png)]

6、pyhon的朴素贝叶斯API

sklearn.naive_bayes.MultinomialNB(alpha=1.0) #朴素贝叶斯分类

ealpha:拉普拉斯平滑系数

7、算法代码实现

# 1 获取数据----对新闻分类
from sklearn.datasets import fetch_20newsgroups  
news=fetch_20newsgroups(data_home=r'E:\fetch_20newsgroups',subset='all')  #将数据下载到本地

# 2 数据处理(略),查验数据
# display(news.data[0])  #返回特征值(自变量)列表,每个元素是一篇新闻
print(len(news.data))  #查看有多数篇新闻
# display(news.target) #返回目标值(因变量)数组,用数字表示的每篇新闻的分类
# display(news.target_names) #返回目标值数字对应的解释
18846
#3 数据集的划分
from sklearn.model_selection import train_test_split

#语法:x_train,x_test,y_train,y_test = sklearn.model_selection.train_test_split(x,y,test_size=,random_state=)
#解释:训练的特征值(自变量),测试的特征值,训练的目标值,测试的目标值= 划分函数(x特征值,y目标值,test_size=测试集比例,随机种子)

#datasets.base.Bunch(继承自字典)类
x_train,x_test,y_train,y_test = train_test_split(news.data,news.target,test_size=0.25,random_state=11)
print(len(x_train),len(x_test),len(y_train),len(y_test))
14134 4712 14134 4712
# 4 特征工程 -- 文本特征抽取
import pandas as pd
import numpy as np
from  sklearn.feature_extraction.text import TfidfVectorizer
import jieba  #(jieba 分词,安装:pip install jieba)

#数据
#x_train,x_test

#分词 --英文文档不需要分词操作
# cut_data=[]
# for s in data:
#     cut_s=jieba.cut(s)
#     l_cut_s=' '.join(list(cut_s))
#     cut_data.append(l_cut_s)
# print(cut_data)

#TF-IDF
transfer = TfidfVectorizer() #实例化一个文本处理转换器类
x_train = transfer.fit_transform(x_train) #调用fit_transform() ,先转化训练集
#print(x_train)  #非零值的坐标  值
#print(transfer.get_feature_names())
#print(x_train.toarray())
x_test = transfer.transform(x_test) #调用transform() ,再转化测试集
#print(x_test)  #非零值的坐标  值
#print(transfer.get_feature_names())
#print(x_test.toarray())
# 5 朴素贝叶斯预估器流程
    #语法:sklearn.naive_bayes.MultinomiaNB(alpha=1.0) #朴素贝叶斯分类
    #  模型调优(略)
from sklearn.naive_bayes import MultinomialNB  #朴素贝叶斯
from sklearn.model_selection import GridSearchCV    #网格搜索和交叉验证

#estimator = MultinomialNB(alpha=1.0) #实例化一个转换器类,不进行模型调优的时候用

#加入模型选择与调优,网格搜索和交叉验证
estimator = MultinomialNB()
#准备参数
param_dict = {"alpha":[1,2,3]} #ealpha:拉普拉斯平滑系数值设定的可能取值
estimator = GridSearchCV(estimator,param_grid=param_dict,cv=4) #cv=4是4折交叉验证(实际中经常用10)

#执行预估器,训练模型
estimator.fit(x_train,y_train)
GridSearchCV(cv=4, error_score='raise',
       estimator=MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True),
       fit_params=None, iid=True, n_jobs=1,
       param_grid={'alpha': [1, 2, 3]}, pre_dispatch='2*n_jobs',
       refit=True, return_train_score='warn', scoring=None, verbose=0)
# 6 模型评估
#方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)  #计算预测值
print(y_predict)
y_test == y_predict  #比对真实值和预测值,相同的返回True
#方法2:直接计算准确率
accuracy=estimator.score(x_test,y_test)
print(accuracy)

# 3、查看网格搜索和交叉验证返回结果
# 最佳参数:best_params_
print("最佳参数k:",estimator.best_params_)
# 验证集的最佳结果:best_score_
print("验证集的最佳结果准确率:",estimator.best_score_)
# 最佳估计器:best_estimator_
print("最佳估计器",estimator.best_estimator_)
# 交叉验证结果:cv_results_
#print(estimator.cv_results_)  #比较长这里就不输出了
[11  2 13 ... 18  1  5]
0.8520797962648556
最佳参数k: {'alpha': 1}
验证集的最佳结果准确率: 0.8340172633366351
最佳估计器 MultinomialNB(alpha=1, class_prior=None, fit_prior=True)
  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值