概率定义为一件事情发生的可能性
概率分为联合概率和条件概率
联合概率:包含多个条件,且所有条件同时成立的概率
记作:P(A,B)
P(A,B)=P(A)P(B)
条件概率:就是事件A在另外一个事件B已经发生的条件概率
记作:P(A|B)
特性:P(A1,A2|B)=P(A1|B)P(A2|B)
注意:此条件概率的成立,是由于A1,A2相互独立的结果
下面靠一个案例演示:
样本数 | 职业 | 体型 | 女神是否喜欢 |
1 | 程序员 | 超重 | 不喜欢 |
2 | 产品 | 匀称 | 喜欢 |
3 | 程序员 | 匀称 | 喜欢 |
4 | 程序员 | 超重 | 喜欢 |
5 | 美工 | 匀称 | 不喜欢 |
6 | 美工 | 超重 | 不喜欢 |
7 | 产品 | 匀称 | 喜欢 |
- 女神喜欢的概率: 4/7
- 职业是程序员并且体型匀称的概率? P(程序员,匀称)=3/7*4/7=12/49
- 在女神喜欢的条件下,职业是程序员的概率 2/4=1/2
- 在女神喜欢的条件下,职业是产品,体重是超重的概率? P(产品,超重|喜欢)=P(产品|喜欢)P(超重|喜欢)=1/2*1/4=1/8
贝叶斯公式
P(C|W)=P(W|C)P(C)/P(W)
注意:w为给定文档的特征值(频数统计,预测文档提供),c为文档类别
公式分为三个部分:
- P(C):每个文档类别的概率(某文档类别数/总文档数量)
- P(W|C):给定类别下特征(被预测文档中出现的词)的概率
下面用一个例子来说明贝叶斯公式的概念
训练集统计结果(指定统计词频):
特征\统计 | 科技(30篇) | 娱乐(60篇) | 汇总(90篇) |
商场 | 9 | 51 | 60 |
影院 | 8 | 56 | 64 |
支付宝 | 20 | 15 | 35 |
云计算 | 63 | 0 | 63 |
汇总(求和) | 100 | 121 | 221 |
现有一篇被预测文档;出现了影院,支付宝,云计算,计算属于科技、娱乐的类别概率?
P(科技|影院,支付宝,云计算)=P(影院,支付宝,云计算|科技)P(科技)=(8/100)(20/100)(63/100)(30/90)=0.00456109
P(娱乐|影院,支付宝,云计算)=P(影院,支付宝,云计算|娱乐)P(娱乐)=(56/121)(15/121)(0/121)(60/90)=0
思考:属于某个类别为0,合适吗?
解决方法:拉普拉斯平滑系数
P(F1|C)=Ni+a/N+am
a为指定的系数一般为1,m为训练文档中统计出的特征词个数
P(科技|影院,支付宝,云计算)=P(影院,支付宝,云计算|科技)P(科技)=(8/100+1*4)(20/100+1*4)(63/100+1*4)(30/90)
P(娱乐|影院,支付宝,云计算)=P(影院,支付宝,云计算|娱乐)P(娱乐)=(56/121+1*4)(15/121+1*4)(0/121+1*4)(60/90)
sklearn朴素贝叶斯实现API
sklearn.naive_bayes.MultinomialNB(alpha=1.0)
- 朴素贝叶斯分类
- alpha:拉普拉斯平滑系数
算法实例:
- sklearn20类新闻分类
- 20个新闻组数据集包含20个主题的18000个新闻组帖子
流程:
- 加载20类新闻数据,并进行分割
- 生成文章特征词
- 朴素贝叶斯estimator流程进行预估
代码实现:
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import TfidfVectorizer
def naciebayes():
"""
朴素贝叶斯
:return:
"""
news=fetch_20newsgroups(subset='all')
#进行数据分割
x_train,x_test,y_train,y_test=train_test_split(news.data,news.target,test_size=2)
#对数据分割
tf=TfidfVectorizer()
#以训练集当中的词的列表进行每篇文章重要性统计['a','b','c','d']
x_train=tf.fit_transform(x_train)
x_test= tf.transform(x_test)
#朴素贝叶斯算法的预测
mlt=MultinomialNB(alpha=1.0)
print(x_train)
mlt.fit(x_train,y_train)
y_predict=mlt.predict(x_test)
print("预测的文章类型为:",y_predict)
#得出准确率
print("准确率为:",mlt.score(x_test,y_test))
mlt.predict(x_test)
return None
if __name__=="__main":
naciebayes()
运行结果如下:
训练集误差大,结果肯定不好
优点:
- 朴素贝叶斯模型发源于古典数学理论,有稳定的分类效率
- 对缺失数据不太敏感,算法也比较简单,常用于文本分类。
- 分类准确度高,速度快。
缺点:
由于使用了样本属性独立性的假设,所有如果样本属性有关联时其效果不好