概率基础
- 联合概率
事件A,B同时发生的概率,称为事件A,B的联合概率 - 事件独立性
- 事件A,B满足
则事件A,B相互独立。 - A,B相互独立与A,B互不相容是两个概念
- A,B相互独立,条件概率满足
- 条件概率及乘法公式
- 事件A发生条件下事假B发生的概率,称为事件B的条件概率
- 若A1,A2相互独立,则
- 乘法公式
- 样本空间的划分
设S为试验E的样本空间,B1,B2,…,Bn为E的一组事件,若
称B1,B2,…,Bn为样本空间S的一个划分。 - 全概率公式
试验E的样本空间为S,A为E的事件,B1,B2,…,Bn为S的一个划分,则事件A的全概率公式为:
- 贝叶斯公式
试验E的样本空间为S,A为E的事件,B1,B2,…,Bn为S的一个划分,称
为贝叶斯公式。
朴素贝叶斯文本分类
-
假设前提
特征词之间相互独立 -
文档分类贝叶斯公式
C:文本类别,W:文本特征(特征是文本中包含的词,可采用重要性度量获取前k个词作为特征,特征的值为词出现的次数)
P( C ):每个文本类别的概率(某文本类别的词数/总文本词数)
P(W|C):给定类别条件下文本特征的概率
每个特征词在给定类别条件下概率的计算方法:
Ni:特征词F1在C类别文档中出现的总次数
N:C类别文档中所有词出现的总次数 -
实例
特征词 科技 娱乐 汇总 商场 9 51 60 影院 8 56 64 支付宝 20 15 35 云计算 63 0 63 汇总 100 121 221
- 预测出现“影院”、“支付宝”、“云计算”三个特征词的文档属于科技、娱乐类的概率
设F1:影院,F2:支付宝,F3:云计算,则W = F1,F2,F3
基于特征词之间相互独立的假设
由于对于同一文档特征词相同因此P(W)相同,根据上述公式对于求文档类别的概率,P(W)可视为常数,真正影响实际概率大小的为分子,因此在计算概率时可不做除以P(W)的处理。 - 预测属于科技类的概率:设类别为Cs,则其概率可近似为
- 预测属于娱乐类的概率:由于在娱乐类中特征词"云计算"并未出现,根据上述公式可知预测娱乐类的概率为0,这是不符合常理的,我们不能因为某文档未出现某词而判定文档属于某个类别的概率为0,为解决该问题我们引入了拉普拉斯平滑系数。
- 拉普拉斯平滑系数(解决因某词不在文档中而导致的概率为0问题)
引入拉普拉斯系数后,每个特征词在给定类别条件下概率的计算方法:
α : 拉 普 拉 斯 平 滑 系 数 、 m : 特 征 词 个 数 \alpha:拉普拉斯平滑系数 、 m:特征词个数 α:拉普拉斯平滑系数、m:特征词个数
由此可避免概率为0的情况。
- sklearn模块使用
"""以20类新闻数据集为例""" from sklearn.datasets import fetch_20newsgroups from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.navie_bayes import MultinomialNB from sklearn.metrics import classification_report def naviebayes(): """朴素贝叶斯进行文本分类""" 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) print(tf.get_feature_names()) x_test = tf.transform(x_test) # 进行朴素贝叶斯算法的预测 mlt = MultinomialNB(alpha=1.0) print(x_train.toarray()) 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