机器学习之朴素贝叶斯+代码实战

目录

一·引言

1.介绍朴素贝叶斯算法的背景和作用

二·基本概念和原理

1.贝叶斯定理以及它在朴素贝叶斯中的应用

(1)贝叶斯定理:

(2)应用

2.朴素贝叶斯假设和条件独立性假设

3.先验概率、似然函数和后验概率的概念

三·朴素贝叶斯分类器

1.朴素贝叶斯分类器的工作原理

2.讨论朴素贝叶斯分类器的优点和局限性

(1)优点:

(2)局限性:

四·朴素贝叶斯文本代码实战

五·总结

1.对朴素贝叶斯算法进行总结和回顾


一·引言

1.介绍朴素贝叶斯算法的背景和作用

朴素贝叶斯算法是一种基于贝叶斯定理和特征条件独立性假设的分类算法。它是由英国数学家托马斯·贝叶斯提出的。该算法常用于文本分类、垃圾邮件过滤、情感分析等领域。

朴素贝叶斯算法的核心思想是通过计算给定特征条件下目标类别的概率来进行分类。它基于特征条件独立性假设,即假设给定一个目标类别时,各个特征之间是相互独立的。这个假设简化了模型的计算,同时也带来了一定的精度损失。

具体来说,朴素贝叶斯算法通过计算每个特征在不同类别下的条件概率,并结合各特征的先验概率,最终得到后验概率最大的类别作为分类结果。算法的关键在于计算条件概率,可以使用频率统计或基于概率密度函数的方法来估计。

朴素贝叶斯算法的优点包括简单高效、对小规模数据表现良好、可处理大量特征。然而,该算法的缺点是过于简化的特征条件独立性假设可能导致分类精度下降。

二·基本概念和原理

1.贝叶斯定理以及它在朴素贝叶斯中的应用

(1)贝叶斯定理:

贝叶斯定理是一种基于概率的数学定理,它描述了在已知一些相关信息的条件下,计算另一事件发生概率的方法。贝叶斯定理由托马斯·贝叶斯提出,是统计学和概率论中重要的理论基础之一。

贝叶斯定理的表达式如下: P(A|B) = \frac{P(B|A) P(A)}{P(B)}

其中,P(A|B) 表示在已知事件 B 发生的情况下,事件 A 发生的概率。P(B|A) 表示在已知事件 A 发生的情况下,事件 B 发生的概率。P(A) 和 P(B) 分别表示事件 A 和事件 B 发生的独立概率。

朴素贝叶斯算法通过计算每个特征在不同类别下的条件概率,并结合各特征的先验概率,最终得到后验概率最大的类别作为分类结果。贝叶斯定理在朴素贝叶斯算法中起到了重要的作用,它提供了通过已有信息计算目标类别概率的方法。

(2)应用

朴素贝叶斯算法的应用范围广泛,特别在文本分类领域表现良好。例如,在垃圾邮件过滤中,可以通过分析邮件中的特征(如关键词、发件人等),并使用朴素贝叶斯算法计算出邮件属于垃圾邮件的概率,从而进行分类。朴素贝叶斯算法还常用于情感分析、文本挖掘、推荐系统等应用场景中,具有较好的效果和实用性。

2.朴素贝叶斯假设和条件独立性假设

要使用贝叶斯算法就需要先做两个假设

朴素贝叶斯假设:这个假设认为特征之间相互独立,即一个特征的值不会影响其他特征的值。在实际应用中,这意味着我们可以假设每个特征对于分类的影响是独立的,从而简化问题的复杂性。

条件独立性假设:这个假设是在类确定的条件下,特征之间是条件独立的。换句话说,当我们知道一个样本属于某个特定类别时,特征在该类别下的条件概率不受其他特征的影响。

两者本质上是描述同一个假设,只是从不同角度出发。朴素贝叶斯假设是整个朴素贝叶斯算法的核心假设,指的是所有特征之间的独立性。而条件独立性假设是朴素贝叶斯假设的一部分,指的是在给定目标类别的情况下,每个特征之间的独立性。

朴素贝叶斯假设是对整个特征集合的假设,假设所有特征都是相互独立的。条件独立性假设则是在给定目标类别的情况下,对每个特征与其他特征之间的独立性进行假设。

3.先验概率、似然函数和后验概率的概念

(1)先验概率(Prior Probability):
先验概率是在考虑任何观测数据之前,根据以往的经验或先前的知识对事件发生概率进行的主观估计。它表示对事件在没有观测数据影响的情况下的概率分布。先验概率一般是根据领域知识、历史数据或专家判断得出的,可以用来描述事件在观测之前的不确定性。

(2)似然函数(Likelihood Function):
似然函数是在给定已观测数据的情况下,对模型参数进行估计的函数。它描述了在不同的参数取值下,观测数据出现的可能性。似然函数根据观测数据来评估参数的可能取值,而不是根据先验概率来评估。似然函数用于根据数据来更新对模型参数的认识。

(3)后验概率(Posterior Probability):
后验概率是在考虑了观测数据之后,对事件发生概率进行的估计。它是根据贝叶斯定理计算得出的,结合了先验概率和似然函数。后验概率表示在观测数据的条件下,对事件发生概率的更新和修正。它是在考虑了观测数据之后的概率分布,提供了对事件发生概率的更准确估计。它是先验概率和似然函数的乘积,通过贝叶斯公式来计算。贝叶斯公式见上

三·朴素贝叶斯分类器

1.朴素贝叶斯分类器的工作原理

(1)收集训练数据集:
首先,需要收集一组标记好的训练样本,每个样本包含一组特征和对应的目标类别。

示例: 

刮北风

闷热

多云

天气预报有雨

真下雨?

第一天

0

第二天

1

第三天

1

第四天

0

第五天

1

第六天

0

第七天

0

(2)特征独立性假设:
朴素贝叶斯分类器假设所有特征之间相互独立,即给定目标类别的情况下,每个特征与其他特征无关。

以下以刮北风为例子(本文这里使用频率统计)

(3)计算先验概率:
根据训练数据集,计算每个类别在整个数据集中出现的概率,即先验概率。先验概率可以通过简单地计算每个类别样本数量与总样本数量之比得到。

真下雨P(C_{1})=\frac{3}{7}

不下雨P(C_{2})=\frac{4}{7}

刮北风P(A_{1})=\frac{2}{7}

不刮北风P(A_{2})=\frac{5}{7}

闷热P(B_{1})=\frac{5}{7}

。。。。。。。。。

(4)计算条件概率:
对于每个特征,计算在每个类别下的条件概率,即给定类别的情况下,特征出现的概率。常用的方法是使用频率计数或者平滑技术(如拉普拉斯平滑)来估计概率。

P(A_1|C_1)=\frac{1}{3}

P(B_1|C_1)=1

(5)预测过程:
接收一个新的未标记样本,包含一组特征。
根据贝叶斯定理和条件独立性假设,计算给定特征的情况下,属于每个类别的后验概率。后验概率可以通过先验概率和条件概率的乘积得到。
选择后验概率最大的类别作为预测结果。

问题1:刮北风时,下雨的概率是多少?

刮北风时,下雨P(C_1|A_1) = \frac{P(A_1|C_1) P(C_1)}{P(A_1)}=\frac{1}{2}

因此可以计算得出刮北风时,下雨的概率为0.5,同理分别可以算出闷热、多云、天气预报时,下雨的概率是多少,比较概率,即可得出什么情况下下雨的概率最大。

问题2:刮北风和闷热时,下雨的概率是多少?

根据朴素贝叶斯条件独立性的假设可知,"刮北风"和"闷热"这两个特征是独立的,因此

刮北风和闷热时,下雨

P(C_1|A_1\times B_1) = \frac{P(A_1\times B_1|C_1) P(C_1)}{P(A_1\times B_1)} = \frac{P(A_1|C_1)P(B_1|C_1) P(C_1)}{P(A_1)P(B_1)}

                              =\frac{7}{10}

其他条件同理

2.讨论朴素贝叶斯分类器的优点和局限性

(1)优点:

简单高效:朴素贝叶斯分类器具有简单的原理和易于实现的算法。它在处理大规模数据时具有高效性能。

适用于多类别问题:朴素贝叶斯分类器可以有效地处理多类别分类问题,并且需要较少的训练样本。

对小规模数据集表现良好:尽管朴素贝叶斯分类器在处理大规模数据集时表现良好,但它对小规模数据集同样适用,并能够产生较好的分类结果。

对缺失数据鲁棒性强:朴素贝叶斯分类器可以有效地处理缺失数据问题,即使在训练数据中存在缺失值,也能够进行分类。

(2)局限性:

特征独立性假设可能不成立:朴素贝叶斯分类器假设所有特征之间相互独立,但在实际问题中,特征之间可能存在相关性,这会对分类结果产生影响。

对输入数据的分布假设要求高:朴素贝叶斯分类器假设输入数据符合指定的概率分布(如高斯分布),如果实际数据分布与假设不符,分类效果可能下降。

对于稀疏数据,可能会产生过拟合问题:当训练数据非常稀疏时,朴素贝叶斯分类器可能会产生过拟合问题,导致分类效果下降。

无法处理顺序信息:朴素贝叶斯分类器忽略了特征之间的顺序信息,只关注特征的存在与否,因此在处理需要考虑顺序信息的问题时,表现可能不理想。

四·朴素贝叶斯文本代码实战

基于上面那个数据表

from collections import defaultdict

# 训练数据
data = [
    ["否", "是", "否", "是", 0],
    ["是", "是", "是", "否", 1],
    ["否", "是", "是", "否", 1],
    ["否", "否", "否", "是", 0],
    ["否", "是", "是", "否", 1],
    ["否", "是", "否", "是", 0],
    ["是", "否", "否", "是", 0]
]

# 统计各项出现的次数
counts = defaultdict(lambda: defaultdict(int))
total_samples = len(data)

for day in data:
    for i, feature in enumerate(day[:-1]):
        counts[i][feature] += 1
    counts["rain"][day[-1]] += 1

# 计算先验概率
prior_prob = {}
for feature, count in counts["rain"].items():
    prior_prob[feature] = count / total_samples

# 计算条件概率
conditional_prob = {}
for feature, values in counts.items():
    if feature != "rain":
        conditional_prob[feature] = {}
        for value, count in values.items():
            for rain, rain_count in counts["rain"].items():
                conditional_prob[feature][(value, rain)] = count / rain_count

# 计算后验概率
posterior_prob = {}
for feature, values in conditional_prob.items():
    posterior_prob[feature] = {}
    for (value, rain), prob in values.items():
        posterior_prob[feature][(value, rain)] = prob * prior_prob[rain]

# 输出先验概率
print("先验概率:")
for feature, prob in prior_prob.items():
    print(f"P({feature}) = {prob}")

# 输出条件概率
print("\n条件概率:")
for feature, values in conditional_prob.items():
    for (value, rain), prob in values.items():
        print(f"P({feature} = {value} | rain = {rain}) = {prob}")

# 输出后验概率
print("\n后验概率:")
for feature, values in posterior_prob.items():
    for (value, rain), prob in values.items():
        print(f"P(rain = {rain} | {feature} = {value}) = {prob}")

# 计算刮北风、闷热、多云、天气预报有雨时下雨的概率
wind = "否"
hot = "是"
cloudy = "是"
forecast_rain = "是"
probability_rain = 1

for feature, values in posterior_prob.items():
    probability_rain *= values[(wind, "1")]
    probability_rain *= values[(hot, "0")]
    probability_rain *= values[(cloudy, "1")]
    probability_rain *= values[(forecast_rain, "1")]

print(f"\n刮北风、闷热、多云、天气预报有雨时下雨的概率:P(rain = 1 | 刮北风 = 否, 闷热 = 是, 多云 = 是, 天气预报有雨 = 是) = {probability_rain}")

结果:

先验概率:
P(0) = 0.5714285714285714
P(1) = 0.42857142857142855

条件概率:
P(0 = 否 | rain = 0) = 1.25
P(0 = 否 | rain = 1) = 1.6666666666666667
P(0 = 是 | rain = 0) = 0.5
P(0 = 是 | rain = 1) = 0.6666666666666666
P(1 = 是 | rain = 0) = 1.25
P(1 = 是 | rain = 1) = 1.6666666666666667
P(1 = 否 | rain = 0) = 0.5
P(1 = 否 | rain = 1) = 0.6666666666666666
P(2 = 否 | rain = 0) = 1.0
P(2 = 否 | rain = 1) = 1.3333333333333333
P(2 = 是 | rain = 0) = 0.75
P(2 = 是 | rain = 1) = 1.0
P(3 = 是 | rain = 0) = 1.0
P(3 = 是 | rain = 1) = 1.3333333333333333
P(3 = 否 | rain = 0) = 0.75
P(3 = 否 | rain = 1) = 1.0

后验概率:
P(rain = 0 | 0 = 否) = 0.7142857142857142
P(rain = 1 | 0 = 否) = 0.7142857142857143
P(rain = 0 | 0 = 是) = 0.2857142857142857
P(rain = 1 | 0 = 是) = 0.2857142857142857
P(rain = 0 | 1 = 是) = 0.7142857142857142
P(rain = 1 | 1 = 是) = 0.7142857142857143
P(rain = 0 | 1 = 否) = 0.2857142857142857
P(rain = 1 | 1 = 否) = 0.2857142857142857
P(rain = 0 | 2 = 否) = 0.5714285714285714
P(rain = 1 | 2 = 否) = 0.5714285714285714
P(rain = 0 | 2 = 是) = 0.42857142857142855
P(rain = 1 | 2 = 是) = 0.42857142857142855
P(rain = 0 | 3 = 是) = 0.5714285714285714
P(rain = 1 | 3 = 是) = 0.5714285714285714
P(rain = 0 | 3 = 否) = 0.42857142857142855
P(rain = 1 | 3 = 否) = 0.42857142857142855

五·总结

1.对朴素贝叶斯算法进行总结和回顾

emmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm憋不出来了

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值