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

 

 

posted @   奶油冰激凌  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示