09.朴素贝叶斯

恭喜你能坚持看到这一小节的内容!!
按照惯例,在开始基础知识之前,把这些知识点串起来,如果希望先学习一下基础知识,建议先到后面去看看~

小帅:最近在帮他的女神“参谋”一个男生。他跑来问我:“听说那男生是个程序员,体型有点超重,还爱穿格子衬衫——你根据这些信息快速判断一下,我女神会喜欢他这类型吗?”
这不就是典型的概率判断问题,而解决这类问题的利器,就叫“朴素贝叶斯”。咱们来一步步拆解你这个“顾问”工作。
首先,你得有历史数据,对吧?比如,咱们知道女神过去接触过77个男生,其中44个是她明确表示过好感的,33个是无感或反感的。
第一步,先理解“条件概率”。 你想知道的是,在“女神喜欢”的这个圈子里,程序员的比例有多高?咱们一数,44个她喜欢的人里,有22个是程序员。所以,单看“职业”这一条,P(程序员 | 喜欢) = 22/44 = 0.5。这个“|”竖线就读作“在…条件下”,条件概率就是先把范围缩小到某个特定情况里再算比例。
但你的问题更复杂,是多个条件组合在一起。 你想知道的是“在他是程序员‘且’超重‘且’爱穿格子衫的条件下,女神喜欢他的概率”。这就要用到“联合概率”了,就是把几个条件同时发生的概率凑在一起。
直接算这种组合概率很麻烦,数据少的时候根本算不出来。这时候,“朴素贝叶斯”的“朴素”二字就闪亮登场了。它做了一个非常大胆、甚至有点“天真”的假设:它认为“是不是程序员”、“体型超不超重”、“爱不爱穿格子衫”这几件事之间是完全没有关系的,是相互独立的。
这个假设在现实中当然不完全正确(比如大家可能会觉得程序员和爱穿格子衫有点关联),但正是这个“朴素”的假设,让计算变得无比简单。既然它们独立,那么联合概率就可以拆开成一个个单独概率的乘积。这就好办多了,我们不用去找“既是程序员又超重又爱穿格子衫”的稀有物种,只需要分别统计“程序员在喜欢中的比例”、“超重在喜欢中的比例”、“格子衫在喜欢中的比例”,然后把它们乘起来就行。
接下来是核心的“贝叶斯公式”。 咱们之前的思路是“因为女神喜欢,所以可能是程序员”(由因推果)。但你现在需要的是逆向思维——“因为他具备程序员、超重、格子衫这些特征,所以推测女神可能喜欢他”(由果推因)。贝叶斯公式就是干这个的,它能把我们习惯的思维方向给倒过来。公式会综合考虑:
1)如果女神喜欢,这个人具备这些特征的可能性有多大?
2)女神喜欢任何一个人的基础概率是多少?
3)普通人里具备这些特征的比例又是多少?最后得出一个综合的后验概率。
这里还有个细节问题。 假如我们发现,历史数据里女神喜欢的人中,没有一个养蜥蜴的。那么按照普通算法,P(养蜥蜴 | 喜欢) = 0,一旦新来的这个男生恰好养蜥蜴,整个公式乘下来结果就是0,直接判“死刑”了。这显然不合理,万一女神只是还没遇到养蜥蜴的真爱呢?为了解决这种“零概率”问题,我们引入了“拉普拉斯平滑”,相当于给每个计数都加上一个很小的保护值,确保即使某个特征没出现过,概率也不会是零,给未知情况留点余地。
最后,这个方法的实际应用比你当恋爱顾问可广多了。比如网上那些能自动判断一条商品评论是“好评”还是“差评”的系统,底层逻辑就是这个“朴素贝叶斯”。计算机会把评论拆成一个个词,然后看这些词在已知的好评里出现得多,还是在差评里出现得多。比如“烂透了”这个词在差评里肯定更常见,如果一条新评论里包含它,系统就会更倾向于判断这是差评。它就像一个经验老道的客服,虽然不懂深奥的语法,但凭关键词的“出镜率”就能猜个八九不离十。
所以你看,从帮你分析女神喜好,到判断网上的一条评论,背后的核心思想都是一样的,就是利用已知的概率去巧妙地推算未知的情况。
代码要自己写喔,知识点串起来就行啦~

一、朴素贝叶斯介绍

学习目标

  1. 复习常见概率的计算方法

  2. 掌握贝叶斯公式的原理和应用

  3. 理解朴素贝叶斯的基本概念

  4. 了解拉普拉斯平滑系数的作用

二、概率基础

条件概率

定义: 表示事件A在另外一个事件B已经发生条件下的发生概率,记作P(A|B)

示例: 在女神喜欢的条件下,职业是程序员的概率?

  1. 女神喜欢条件下,有2、3、4、7共4个样本

  2. 4个样本中,有程序员3、4共2个样本

  3. 则P(程序员|喜欢) = 2/4 = 0.5

联合概率

定义: 表示多个条件同时成立的概率,P(AB) = P(A) × P(B|A)

特征条件独立性假设: P(AB) = P(A) × P(B)

示例: 职业是程序员并且体型匀称的概率?

  1. 数据集中共有7个样本

  2. 职业是程序员有1、3、4共3个样本,概率为:3/7

  3. 职业是程序员且体型匀称有3共1个样本,概率为:1/3

  4. 则联合概率为:3/7 × 1/3 = 1/7

联合概率 + 条件概率

示例: 在女神喜欢的条件下,职业是程序员、体重超重的概率?P(AB|C) = P(A|C) × P(B|AC)

  1. 女神喜欢条件下,有2、3、4、7共4个样本

  2. 其中职业是程序员有3、4共2个样本,概率为:2/4=0.5

  3. 程序员样本中体型超重的有4共1个样本,概率为:1/2=0.5

  4. 则P(程序员,超重|喜欢) = 0.5 × 0.5 = 0.25

三、贝叶斯公式

公式理解

  • P( C ):C出现的概率(先验概率)

  • P(W|C):C条件下W出现的概率(条件概率)

  • P(W):W出现的概率(证据)

  • P(C|W):W条件下C出现的概率(后验概率)

计算示例

已知:

  • P(C|W) = P(喜欢|程序员,超重)

  • P(W|C) = P(程序员,超重|喜欢)

  • P( C ) = P(喜欢) = 4/7

  • P(W) = P(程序员,超重)

计算步骤:

  1. 估计先验概率P©:P(喜欢) = 4/7

  2. 计算条件概率P(W|C):P(程序员,超重|喜欢) = 1/4

  3. 计算后验概率分子:P(程序员,超重|喜欢) × P(喜欢) = 4/7 × 1/4 = 1/7

  4. 计算证据P(W):P(程序员,超重) = P(程序员) × P(超重|程序员) = 3/7 × 2/3 = 2/7

  5. 最终后验概率:P(喜欢|程序员,超重) = (1/7) ÷ (2/7) = 0.5

四、朴素贝叶斯

核心思想

在贝叶斯基础上增加特征条件独立假设,即特征之间互为独立,从而简化联合概率计算。

简化计算

  • P(程序员,超重|喜欢) = P(程序员|喜欢) × P(超重|喜欢)

  • P(程序员,超重) = P(程序员) × P(超重)

五、拉普拉斯平滑系数

作用

解决因训练样本不足导致的概率计算为0的问题。

公式

在概率计算中,分子加上α,分母加上α×m,其中:

  • α:拉普拉斯平滑系数,通常设为1

  • Nᵢ:F1中符合条件C的样本数量

  • N:条件C下所有样本的总数

  • m:所有独立样本的总数

六、情感分析案例

学习目标

  1. 掌握朴素贝叶斯的API使用

  2. 能够应用朴素贝叶斯实现商品评论情感分析

API介绍

sklearn.naive_bayes.MultinomialNB(alpha=1.0)
  • 功能:朴素贝叶斯分类

  • 参数:alpha - 拉普拉斯平滑系数

实践:商品评论情感分析

步骤分析
  1. 数据获取

  2. 数据预处理

    • 提取内容列

    • 设定评判标准(好评/差评)

    • 选择停用词

    • 文本分词处理

    • 词频统计

    • 划分训练集和测试集

  3. 模型训练

  4. 模型评估

代码实现

如果需要数据源,留言获取哈~

sklearn.naive_bayes.MultinomialNB(alpha=1.0)

# 1. 数据获取
data = pd.read_csv("./data/书籍评价.csv", encoding="gbk")

# 2. 数据预处理
# 2.1 提取内容列
content = data["内容"]

# 2.2 设定评判标准(1好评;0差评)
data.loc[data['评价'] == "好评", "评论标号"] = 1
data.loc[data['评价'] == '差评', '评论标号'] = 0
good_or_bad = data['评价'].values

# 2.3 加载停用词
stopwords = []
with open('./data/stopwords.txt', 'r', encoding='utf-8') as f:
    for line in f.readlines():
        stopwords.append(line.strip())
stopwords = list(set(stopwords))  # 去重

# 2.4 文本分词处理
comment_list = []
for text in content:
    seg_list = jieba.cut(text, cut_all=False)
    seg_str = ','.join(seg_list)
    comment_list.append(seg_str)

# 2.5 词频统计
con = CountVectorizer(stop_words=stopwords)
X = con.fit_transform(comment_list)
feature_names = con.get_feature_names()

# 2.6 划分训练集和测试集
x_train = X.toarray()[:10, :]
y_train = good_or_bad[:10]
x_test = X.toarray()[10:, :]
y_test = good_or_bad[10:]

# 3. 模型训练
model = MultinomialNB(alpha=1)
model.fit(x_train, y_train)
y_pred = model.predict(x_test)

# 4. 模型评估
accuracy = model.score(x_test, y_test)
print(f"预测值:{y_pred}")
print(f"真实值:{y_test}")
print(f"准确率:{accuracy}")

七、总结

朴素贝叶斯是一种基于贝叶斯定理和特征条件独立假设的分类算法,具有以下特点:

  • 实现简单,学习效率高

  • 对小规模数据表现良好,适合多分类任务

  • 对缺失数据不敏感

  • 广泛应用于文本分类、情感分析等领域

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Peter_Monster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值