第八章.贝叶斯分析
贝叶斯主要应用与新闻分类,文本分类,评论分析。
总体信息:当前总体样本符合某种分布,比如0-1分布,二项分布,正态分布。
样本信息:通过抽样得到的部分样本的某种分布
抽样信息=总体信息+样本信息
基于抽样信息进行统计推断的理论和方法称为经典统计学
先验信息:抽样之前,有关推断问题中未知参数的一些信息,通常来自与经验或历史资料。
基于总体信息+样本信息+先验信息进行统计推断的方法和理论,称为贝叶斯统计学。
如果已知P(X|H),求P(H|X):
参数解析:
①.P(H|X)给定观测数据样本X,假设H是成立的概率. [比如X是一份具有特定特征的邮件,H是垃圾邮件,它里面包含很多的单词(特征),然后我们判断这封邮件属于垃圾邮件的概率是多少]
②.P(H|X)是后验概率 [比如一份特定邮件中,是垃圾邮件的概率]
③.P(H)是H的先验概率 [比如总体邮件中垃圾邮件的概率]
④.P(X)是X的先验概率 [比如总体邮件中带有特定特征的邮件概率]
大数定理:
可以通过抽样来计算先验概率。抽样的数量越大,得到的结果越接近于真实的概率分布。
描述
①.P(H):垃圾邮件的先验概率
②.P(X):特定特征的先验概率
③.P(X|H):在垃圾邮件中,包含特定特征(比如“办证”)邮件的概率
④.P(H|X):包含特定特征(比如“办证”)的邮件属于垃圾邮件的概率
有一个特定特征的情况:
①.邮件:总体100,正常70,垃圾30,“办证”’在正常邮件中出现10次,在垃圾邮件中出现25次。
②.假设X为“办证”,H为垃圾邮件。
· P(X|H)=25/30=5/6
· P(H)=30/100=3/10
· P(X)=35/100=7/20
· P(H|X)=5/7
③.包含“办证”这个词的邮件属于垃圾邮件的概率为5/7。
有多个特定特征的情况:
①.在有多个特征的情况下会使得统计量巨大。
②.比如需要计算办证对于垃圾邮件的影响
③.计算办证+理财对于垃圾邮件的影响 计算办证+理财+投资对于垃圾邮件的影响
④.计算办证+理财+投资+资讯对于垃圾邮件的影响
⑤.……
⑥.所有特征需要计算2n-1次,n是特征数
有多个特定特征的情况下,若继续使用上述公式,计算将会变得很复杂,故可以使用朴素贝叶斯。
以垃圾邮件分类为例:
1).特定特征:“代开发票”,“增值税发票”,“正规发票”
2).分词后为向量:(“代开”,“发票”,“增值税”,“发票”,“正规”,“发票”)
3).重复的词语我们视为其多次出现:
4).计算:
以垃圾邮件分类为例
1).特定特征:“代开发票”,“增值税发票”,“正规发票”
2).分词后为向量:(“代开”,“发票”,“增值税”,“发票”,“正规”,“发票”)
3).重复的词语我们视为其出现一次:
4).计算:
Bag-of-words model (BoW model)最早出现在自然语言处理(Natural Language Processing)和信息检索 (Information Retrieval)领域。该模型忽略掉文本的语 法和语序等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的。BoW使用一组无序的 单词(words)来表达一段文字或一个文档。
①.首先给出两个简单的文本文档.
②.基于上述两个文档中出现的单词,构建一个词典:
③.上面的词典中包含10个单词, 每个单词有唯一的索引,那么每个文本我们可以使用一个10维的向量来表示。如下:
·[1, 2, 1, 1, 1, 0, 0, 0, 1, 1]
·[1, 1,1, 1, 0, 1, 1, 1, 0, 0 ]
④.注意:该向量与原来文本中单词出现的顺序没有关系,而是词典中每个单词在 文本中出现的频率。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
from sklearn.naive_bayes import MultinomialNB, BernoulliNB, GaussianNB# 加载数据
iris = load_iris()
x_data = iris.data
y_data = iris.target# 数据切分
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data)# 创建模型
mul_nb = GaussianNB() # 高斯模型
mul_nb.fit(x_train, y_train)# 预测函数
prediction = mul_nb.predict(x_test)print(classification_report(y_test, prediction))
print(confusion_matrix(y_test, prediction))
from sklearn.feature_extraction.text import CountVectorizertexts = ['dog cat fish', 'dog cat cat', 'fish bird', 'bird']
cv = CountVectorizer()
cv_fit = cv.fit_transform(texts)print(cv.get_feature_names_out())
print(cv_fit.toarray())
print(cv_fit.toarray().sum(axis=0))
提取词频(Term Frequency,缩写TF),
假设我们把停用词都过滤掉了,只考虑有意义的词。可能会遇到 这样一个问题,“中国”,“蜜蜂”,“养殖”这三个词的TF一样。 作为关键词,它们的重要性是一样的吗?
用统计学语言表达,就是在词频的基础上,要对每个词分配 一个"重要性"权重。最常见的词(“的”、“是”、“在”)给予 最小的权重,较常见的词(“中国”)给予较小的权重,较少 见的词(“蜜蜂”、“养殖”)给予较大的权重。这个权重叫做 “逆文档频率”(Inverse Document Frequency,缩写为 IDF),它的大小与一个词的常见程度成反比。
· 题干:
以《中国的蜜蜂养殖》为例,假定该文长度为1000个词, “中国”、“蜜蜂”、“养殖"各出现20次,则这三个词的"词频” (TF)都为0.02。然后,搜索Google发现,包含"的"字的网页 共有250亿张,假定这就是中文网页总数。包含"中国"的网页共 有62.3亿张,包含"蜜蜂"的网页为0.484亿张,包含"养殖"的网 页为0.973亿张。则它们的逆文档频率(IDF)和TF-IDF如下:
· 结果:
关键词 | 包含该次的文档数(亿) | TF | IDF | TF_IDF |
---|---|---|---|---|
中国 | 62.3 | 0.02 | 0.603 | 0.0121 |
蜜蜂 | 0.484 | 0.02 | 2.713 | 0.0543 |
养殖 | 0.973 | 0.02 | 2.410 | 0.0482 |
· 代码实现:
from sklearn.feature_extraction.text import TfidfVectorizertext = ['The quick brown fox jumped over the lazy dog.', 'The dog.', 'The fox']# 创建变换函数
Tfdif = TfidfVectorizer()
# 词条化以及创建词汇表
Tfdif.fit(text)# 总结
print(Tfdif.vocabulary_)#词的字典
print(Tfdif.idf_)# 编码文档
vector = Tfdif.transform([text[0]])
# 总结编码文档
print(vector.toarray())
· 结果展示: