机器学习实验四

朴素贝叶斯算法

算法概述

朴素贝叶斯算法的基础是贝叶斯原理,其假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。

    基于贝叶斯原理,朴素贝叶斯的分类原理大体不变。收集并整理带有类别标签的训练数据集,将数据特征进行提取和量化。计算出先验概率和后验概率带入贝叶斯公式来预测新样本。

数据集:
在这里插入图片描述
测试集:
在这里插入图片描述

1.计算先验概率

先验概率是指在没有任何特征信息的情况下,样本属于某一类别的概率。

数据集中总共有 17 个样本,其中 “好瓜” 有 8 个,“坏瓜” 有 9 个。

设 好瓜 表示样本是好瓜的先验概率,坏瓜 表示样本是坏瓜的先验概率。
计算先验概率 P(c)P(c)P(c)首先,我们统计训练集中“好瓜”和“坏瓜”的总体比例。总样本数 N=17N = 17N=17。好瓜(是):共 8 个样本(编号 1-8)。P(好瓜)=817≈0.471P(\text{好瓜}) = \frac{8}{17} \approx 0.471P(好瓜)=1780.471坏瓜(否):共 9 个样本(编号 9-17)。P(坏瓜)=917≈0.529P(\text{坏瓜}) = \frac{9}{17} \approx 0.529P(坏瓜)=1790.529

  1. 计算条件概率(似然度) P(x∣c)
    我们需要针对“测1”样本的每一个特征,分别计算在“好瓜”和“坏瓜”条件下的概率。 测试样本特征: 青绿、蜷缩、浊响、清晰、凹陷、硬滑、密度0.697、含糖率0.460。

A. 离散属性计算
直接统计在各类别中出现的次数:

| 特征 | P(特征∣好瓜) (分母为8) | P(特征∣坏瓜) (分母为9) | | :— | :— | :— | | 色泽=青绿 | 3/8 (编号1,4,6) = 0.375 | 3/9 (编号10,13,17) ≈ 0.333 | | 根蒂=蜷缩 | 5/8 (编号1-5) = 0.625 | 3/9 (编号12,16,17) ≈ 0.333 | | 敲声=浊响 | 6/8 (编号1,3,5-8) = 0.750 | 4/9 (编号12,13,15,16) ≈ 0.444 | | 纹理=清晰 | 7/8 (编号1-6,8) = 0.875 | 2/9 (编号10,15) ≈ 0.222 | | 脐部=凹陷 | 5/8 (编号1-5) = 0.625 | 2/9 (编号13,14) ≈ 0.222 | | 触感=硬滑 | 6/8 (编号1-5,8) = 0.750 | 6/9 (编号9,11,12,14,16,17) ≈ 0.667 |

B. 连续属性计算 (密度 & 含糖率)
对于连续属性,我们需要先计算每个类别的均值 (μ) 和 标准差 (σ),然后代入高斯概率密度公式:

p(x∣c)=12πσe−(x−μ)22σ2p(x|c) = \frac{1}{\sqrt{2\pi}\sigma} e^{-\frac{(x-\mu)^2}{2\sigma^2}}p(xc)=2πσ1e2σ2(xμ)2

  1. 密度 (测试值 0.697):

好瓜集:均值 μ≈0.574, 标准差 σ≈0.129

P(密度=0.697∣好瓜)≈1.959
坏瓜集:均值 μ≈0.496, 标准差 σ≈0.195

P(密度=0.697∣坏瓜)≈1.203
2. 含糖率 (测试值 0.460):

好瓜集:均值 μ≈0.279, 标准差 σ≈0.101

P(含糖=0.460∣好瓜)≈0.788
坏瓜集:均值 μ≈0.154, 标准差 σ≈0.108 注意:坏瓜平均含糖很低,0.460 离均值太远,所以概率会极低。

P(含糖=0.460∣坏瓜)≈0.066

3. 计算后验概率

根据朴素贝叶斯公式:后验概率 = 先验概率 × 所有特征条件概率的乘积。

A. 它是好瓜的概率值 (Score Yes)
P(好瓜∣测1)

∝P(好瓜)×P(青绿∣好)×⋯×P(含糖0.460∣好)
=0.471×0.375×0.625×0.750×0.875×0.625×0.750×1.959×0.788
≈0.063

B. 它是坏瓜的概率值 (Score No)
P(坏瓜∣测1)

∝P(坏瓜)×P(青绿∣坏)×⋯×P(含糖0.460∣坏)
=0.529×0.333×0.333×0.444×0.222×0.222×0.667×1.203×0.066
≈6.8×10
−5
(即 0.000068)

4.得到分类结果

比较后验概率 好瓜 和 坏瓜 的大小:
因为 0.053>0.00002,即 好瓜坏瓜,所以判断测试样本为 “好瓜”。

代码实现

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

pd.set_option('display.width', 120)
pd.set_option('display.max_columns', None)

# 读取数据
train_path = 'data.txt'
test_path = 'test.txt'

train_df = pd.read_csv(train_path)
test_df = pd.read_csv(test_path)

print('训练集形状:', train_df.shape)
print('测试集形状:', test_df.shape)
train_df.head()

# 准备特征与标签
label_col = '好瓜'
feature_cols = [c for c in train_df.columns if c != label_col and c != '编号']

X = train_df[feature_cols]
y = train_df[label_col]

# 划分训练/验证集用于评估
X_train, X_val, y_train, y_val = train_test_split(
    X, y, test_size=0.3, random_state=42, stratify=y
)

# 区分类别型和数值型列
categorical_cols = ['色泽', '根蒂', '敲声', '纹理', '脐部', '触感']
numeric_cols = ['密度', '含糖率']

preprocess = ColumnTransformer(
    transformers=[
        # 使用 sparse_output 替代 sparse 参数
        ('cat', OneHotEncoder(handle_unknown='ignore', sparse_output=False), categorical_cols),
        ('num', 'passthrough', numeric_cols)
    ]
)

model = GaussianNB()

pipe = Pipeline([
    ('prep', preprocess),
    ('clf', model)
])

pipe
# 训练并在验证集评估
pipe.fit(X_train, y_train)

val_pred = pipe.predict(X_val)

print('验证集准确率:', accuracy_score(y_val, val_pred))
print('\n分类报告:\n', classification_report(y_val, val_pred))
print('混淆矩阵:\n', confusion_matrix(y_val, val_pred))

# 使用全部训练集重新训练,并对测试集预测
pipe_full = pipe.fit(X, y)

test_features = test_df[feature_cols]
test_pred = pipe_full.predict(test_features)

result = test_df.copy()
result['预测好瓜'] = test_pred

result

代码结果在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

更多推荐