在讲这两个概率之前我们通过一个例子,来计算一些结果:
注意:此条件概率的成立,是由于A1,A2相互独立的结果(记忆)
我们先接着往下看,前面是说了贝叶斯公式,却没有说什么是朴素贝叶斯公式,朴素 的意思 就是 特征值之间相互独立的意思;
那么根据相互独立的条件,我们可以将
P(产品经理,超重) = P(产品经理) *P(超重)=2/7 * 3/7 = 6/49
而分子 = P(产品经理,超重|喜欢)*P(喜欢) = P(产品 | 喜欢) * P(超重 | 喜欢)*P(喜欢)
= 1/2 * 1/4 * 4/7
= 1/8 * 4/7
= 4/56
最终P(喜欢 | 产品经理, 超重) = 4/56 / 6/49 = 7/12
7/12,超过了一半,由此可见数据也不是很正确的,一方面,数据是比较少的,另一方面,数据特征不是相互独立的(有关联),所以值也不是很准!
那么这个公式如果应用在文章分类的场景当中,我们可以这样看:
带入贝叶斯公式求:
求第一题:P(C | Chinese, Chinese, Chinese, Tokyo, Japan)
分子: P(Chinese, Chinese, Chinese, Tokyo, Japan | C) * P( C)
分母:P(Chinese, Chinese, Chinese, Tokyo, Japan )
求第二题:P(非C | Chinese, Chinese, Chinese, Tokyo, Japan)
分子: P(Chinese, Chinese, Chinese, Tokyo, Japan | 非C) * P(非C)
分母:P(Chinese, Chinese, Chinese, Tokyo, Japan )
由此可见,分母是一样的,那我们直接求分子即可!
P( C) = 3/4
第一题分子 = P(Chinese | C) ^3 * P(Tokyo| C) * P(Japan| C) * P( C)
怎么求呢?由前面公式可知:
P(Chinese | C) = 5/8
但是 P(Tokyo| C) = 0/8 = 0(样本量过少导致),导致整个概率为0了,这明显是不对,那么怎么避免呢?我们往下看:
那么 P(Tokyo| C) = (0 + 1 ) / ( 8 + 6) = 1/14
同理,P(Japan| C) = ( 0+ 1) / ( 8 + 6 ) = 1/14
那从整体来看,P(Chinese | C) ^3 * P(Tokyo| C) * P(Japan| C) * P( C) , P(Tokyo| C) * P(Japan| C) 都加了拉普拉斯平滑,那么
P(Chinese | C) 也应该加 = (5 + 1) / (8 + 6) = 6 / 14 = 3/7
最终,P(Chinese | C) ^3 * P(Tokyo| C) * P(Japan| C) * P( C) = ( 3 / 7 ) ^ 3 * 1/14 * 1/14 = 27 / 67228
很明显,这个测试集是属于非C的!
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
"""
用朴素贝叶斯算法对新闻进行分类
:return:
"""
# 1)获取数据
news = fetch_20newsgroups(subset="all")
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target)
# 3)特征工程:文本特征抽取-tfidf
transfer = TfidfVectorizer()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)
# 4)朴素贝叶斯算法预估器流程
estimator = MultinomialNB()
estimator.fit(x_train, y_train)
# 5)模型评估
# 方法1:直接比对真实值和预测值
y_predict = estimator.predict(x_test)
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)
# 方法2:计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)
这里的fetch_20newsgroups的数据集要下载:
链接:https://pan.baidu.com/s/1-3xwd3oCSAzx2k7UcejwXg?pwd=hwaq
提取码:hwaq
并按照链接步骤安装即可:安装链接
实际就是将你本机Python安装路径下的:D:\xx\python-3.8.10\Lib\site-packages\sklearn\datasets的_twenty_newsgroups文件按照下方图片修改保存即可使用,注释上面红框框的两行代码,这个下载地址,红框框下并添加一行你的压缩包保存地址,之后保存文件名,就可以在python里面调用数据集了(第一次比较慢,因为要解压):