11.5
实验六:朴素贝叶斯算法实现与测试
一、实验目的
深入理解朴素贝叶斯的算法原理,能够使用 Python 语言实现朴素贝叶斯的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练朴素贝叶斯分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验六的
部分。
三、算法步骤、代码、及结果
1. 算法伪代码
输入: 训练数据集 D = {x_1, x_2, ..., x_n},每个数据点 x_i 的特征为 x_i = (x_i1, x_i2, ..., x_im),对应的标签为 y_i
测试数据集 T = {t_1, t_2, ..., t_m},每个测试数据点 t_i 的特征为 t_i = (t_i1, t_i2, ..., t_im)
输出: 每个测试数据点 t_i 的预测标签 y_pred
步骤:
1. 计算训练数据集 D 中各个类别的先验概率:
对于每一个类别 c ∈ {C1, C2, ..., Ck}:
P(c) = count( y = c ) / n # 其中 count( y = c ) 是类别 c 在训练数据中的数量,n 是训练数据集的大小
2. 对于每一个类别 c,计算每个特征条件概率 P(x_i | c):
对于每一个特征 x_i (x_i ∈ {x_1, x_2, ..., x_m}),计算:
P(x_i | c) = count(x_i = xi | y = c) / count(y = c)
其中 count(x_i = xi | y = c) 表示在类别 c 下特征 x_i 为 xi 的数据点数量
3. 对于每一个测试数据 t_i = (t_i1, t_i2, ..., t_im),计算每个类别 c 的后验概率 P(c | t_i):
根据贝叶斯定理,P(c | t_i) 与 P(t_i | c) * P(c) 成正比:
P(c | t_i) ∝ P(c) * P(t_i1 | c) * P(t_i2 | c) * ... * P(t_im | c)
4. 对每个类别 c,计算其对应的后验概率:
P(c | t_i) = P(c) * ∏ ( P(t_ij | c) ) # 其中 t_ij 是测试数据 t_i 中的第 j 个特征
5. 选择具有最大后验概率的类别作为预测标签:
y_pred = argmax(P(c | t_i)) # 选择使 P(c | t_i) 最大的类别 c
6. 重复步骤 3 至步骤 5 对所有测试数据点进行分类。
返回:所有测试数据的预测标签 y_pred
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold from sklearn.naive_bayes import GaussianNB from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score # 1. 加载 Iris 数据集 iris = load_iris() X = iris.data y = iris.target # 2. 使用留出法留出1/3的样本作为测试集,2/3为训练集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42, stratify=y) # 3. 创建朴素贝叶斯分类器实例 nb_classifier = GaussianNB() # 4. 在训练集上训练模型 nb_classifier.fit(X_train, y_train) # 5. 使用五折交叉验证评估模型性能 cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42) # 计算交叉验证的准确率、精度、召回率和 F1 值 accuracy = cross_val_score(nb_classifier, X, y, cv=cv, scoring='accuracy') precision = cross_val_score(nb_classifier, X, y, cv=cv, scoring='precision_weighted') recall = cross_val_score(nb_classifier, X, y, cv=cv, scoring='recall_weighted') f1 = cross_val_score(nb_classifier, X, y, cv=cv, scoring='f1_weighted') # 输出交叉验证评估结果 print(f'Cross-Validation Accuracy: {accuracy.mean():.4f} ± {accuracy.std():.4f}') print(f'Cross-Validation Precision: {precision.mean():.4f} ± {precision.std():.4f}') print(f'Cross-Validation Recall: {recall.mean():.4f} ± {recall.std():.4f}') print(f'Cross-Validation F1-Score: {f1.mean():.4f} ± {f1.std():.4f}') # 6. 在测试集上进行预测 y_pred = nb_classifier.predict(X_test) # 计算准确度、精度、召回率和 F1 值 accuracy_test = accuracy_score(y_test, y_pred) precision_test = precision_score(y_test, y_pred, average='weighted') recall_test = recall_score(y_test, y_pred, average='weighted') f1_test = f1_score(y_test, y_pred, average='weighted') # 输出测试集上的评估结果 print(f'Test Accuracy: {accuracy_test:.4f}') print(f'Test Precision: {precision_test:.4f}') print(f'Test Recall: {recall_test:.4f}') print(f'Test F1-Score: {f1_test:.4f}')
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!