机器学习——朴素贝叶斯 实验四

目录

4-1 朴素贝叶斯概述

4-1-1.朴素贝叶斯属于生成式模型

4-1-1-1生成式模型

4-1-2.贝叶斯定理

4-2 代码实现

4-2-1实现步骤

1.导入数据集

2.计算先验概率

3.计算条件概率

4.输入测试数据集 

5.计算后验概率并输出预测结果 

4-3 实验结果分析

4-3-1实验中遇到的问题

4-3-2 朴素贝叶斯的优缺点


4-1 朴素贝叶斯概述

4-1-1.朴素贝叶斯属于生成式模型


4-1-1-1生成式模型


生成式模型的生成方法是通过数据学习得到联合概率分布P(Y,X),也就是求出条件概率P(X|Y)和先验概率P(Y)来作为预测模型的预测基础。在西瓜书中便是让模型学习好瓜具有什么属性,然后根据这些属性来判断什么是好瓜。

4-1-2.贝叶斯定理


贝叶斯公式:

P(A|B)=\frac{P(B|A)P(A)}{P(B)}

该公式描述的是随机事件A和B在其中某事件发生的情况下发生的概率,其中分子描述的是事件A、B都发生的联合概率,分母描述的是事件A发生的全概率。

4-2 代码实现

4-2-1实现步骤

1.导入数据集

本次实验数据使用的为上课老师所讲的数据

#读取数据
x=[
    ['青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑'],
    ['乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑'],
    ['乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑'],
    ['青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑'],
    ['浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑'],
    ['青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘'],
    ['乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘'],
    ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑'],
    ['乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑'],
    ['青绿', '硬挺', '清脆', '清晰', '平坦', '软粘'],
    ['浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑'],
    ['浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘'],
    ['青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑'],
    ['浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑'],
    ['乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘'],
    ['浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑'],
    ['青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑']
]
y=['是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否', '否']

# 逐行输出特征值和结果
for i in range(len(x)):
    print("编号:", i+1)
    print("特征:", x[i])
    print("是否是好瓜:", y[i])

输出结果检查数据集是否正确

2.计算先验概率

先统计数据集中的数据计算先验概率

根据以前的知识和经验得出的c类样本出现的概率,与现在无关

即每一列不同特征占本列特征种数的占比P(c)

#计算先验概率
# 将数据转换为DataFrame
df = pd.DataFrame(x, columns=['色泽', '根蒂', '敲声', '纹理', '脐部', '触感'])
df['好瓜'] = y

# 计算每个特征的先验概率
prior_probabilities = {}
for column in df.columns[:-1]:  # 不包括最后一列标签列
    feature_counts = df[column].value_counts()
    prior_probabilities[column] = feature_counts / len(df)

# 计算标签列的先验概率
label_counts = df['好瓜'].value_counts()
prior_probabilities['好瓜'] = label_counts / len(df['好瓜'])

# 输出每个特征和标签列的先验概率
print("每个特征和标签列的先验概率:")
for feature, probabilities in prior_probabilities.items():
    print(f"{feature}的先验概率:")
    print(probabilities)

每个特征的先验概率

3.计算条件概率

即已知属于c类的样本中发生x的概率P(x|c)

# 计算条件概率
conditional_probabilities = {}
for column in df.columns[:-1]:  # 不包括最后一列标签列
    for feature_value in df[column].unique():
        # 计算条件概率 P(特征值|类别='是')
        prob = len(df[(df[column] == feature_value) & (df['好瓜'] == '是')]) / len(df[df['好瓜'] == '是'])
        key = f"{column}={feature_value}|好瓜=是"
        conditional_probabilities[key] = prob

# 输出每个特征值对应'是'类别的条件概率
print("每个特征值对应'是'类别的条件概率:")
for key, prob in conditional_probabilities.items():
    print(f"{key}的条件概率为: {prob}")

每个特征对应的条件概率

4.输入测试数据集 

# 输入测试集样本数量
num_samples = int(input("请输入测试集样本数量: "))

# 输入测试集
print('请依次输入测试集中每个样本的特征值:')
test_data = []
features = df.columns[:-1]  # 特征名称列表
for _ in range(num_samples):
    sample = []
    for feature in features:
        test = input(f"请输入 {feature} 的值: ")
        sample.append(test)
    test_data.append(sample)

5.计算后验概率并输出预测结果 

后验概率即P(c|x)

即相对于先验概率而言,表示x 属于c类的概率

#计算后验概率
posterior_probabilities = []
for sample in test_data:
    posterior_yes = 1  # 初始化“是”类别的后验概率
    posterior_no = 1   # 初始化“否”类别的后验概率
for i, feature_value in enumerate(sample):
# 对于每个特征,查找对应的条件概率
    key_yes = f"{features[i]}={feature_value}|好瓜=是"
    key_no = f"{features[i]}={feature_value}|好瓜=否"
# 如果条件概率不存在(即该特征值在训练集中未出现),则将概率设为一个较小的值,如0.001
    if key_yes not in conditional_probabilities:
        conditional_prob_yes = 0.001
    else:
        conditional_prob_yes = conditional_probabilities[key_yes]
    if key_no not in conditional_probabilities:
        conditional_prob_no = 0.001
    else:
        conditional_prob_no = conditional_probabilities[key_no]
posterior_yes *= conditional_prob_yes
posterior_no *= conditional_prob_no
# 将先验概率乘以条件概率
posterior_yes *= prior_probabilities['好瓜']['是']
posterior_no *= prior_probabilities['好瓜']['否']
# 归一化后验概率
total_posterior = posterior_yes + posterior_no
posterior_yes /= total_posterior
posterior_no /= total_posterior
posterior_probabilities.append((posterior_yes, posterior_no))

#输出预测结果
for i, (post_yes, post_no) in enumerate(posterior_probabilities):
    if post_yes > post_no:
        print(f"样本 {i+1} 的预测类别为: 是")
    else:
        print(f"样本 {i+1} 的预测类别为: 否")

 测试结果输出

 

4-3 实验结果分析

4-3-1实验中遇到的问题

          数据导入时,我先是用文件进行导入出现了无法解析的字符导致数据集导入失败,所以我改用直接输入数据集来完成实验,计算先验概率也遇到了问题在先验概率字典 prior_probabilities 中找不到键为 '好瓜' 的条目,我发现是我在计算的时候我们应该计算的是类别 '是''否' 的先验概率,而不是特征的先验概率,所以导致错误。

4-3-2 朴素贝叶斯的优缺点

优点:

  1. 简单有效:朴素贝叶斯算法易于实现和理解,不需要大量的参数调整。即使在数据量较小的情况下,也可以表现出良好的性能。

  2. 适用于高维数据:朴素贝叶斯算法在高维数据集上表现出色,即使特征之间存在一定的相关性,也能够给出合理的结果。

  3. 处理缺失值和噪声:由于朴素贝叶斯算法对缺失值和噪声具有鲁棒性,因此在处理缺失值或者有噪声的数据时表现良好。

  4. 适用于大规模数据集:由于朴素贝叶斯算法的计算复杂度较低,因此在大规模数据集上训练速度较快。

  5. 能够处理多分类问题:朴素贝叶斯算法天然支持多分类问题,可以直接应用于多分类任务。

缺点:

  1. 假设特征独立性:朴素贝叶斯算法假设特征之间相互独立,这在实际数据中并不总是成立,特别是当特征之间存在一定的相关性时,朴素贝叶斯可能会产生不准确的结果。

  2. 对输入数据的分布假设较强:朴素贝叶斯算法假设输入数据的分布形式,例如高斯朴素贝叶斯假设特征服从高斯分布,这在某些情况下可能会限制算法的适用性。

  3. 类别变量的处理:朴素贝叶斯算法通常假设特征是连续的,对于类别型变量的处理可能需要额外的技巧,例如使用虚拟变量转换。

  4. 对于文本分类等任务,表现可能不佳:虽然朴素贝叶斯在文本分类等任务中表现良好,但是它对于特征之间的关联性的忽略可能导致在某些情况下表现不佳,尤其是当特征之间存在复杂的关系时。

  5. 需要大量的训练数据:尽管朴素贝叶斯算法在小规模数据集上表现良好,但是在某些情况下,如果训练数据量不足,可能会导致模型过拟合或者欠拟合。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值