机器学习B:实验六:朴素贝叶斯算法实现与测试
一、实验目的
深入理解朴素贝叶斯的算法原理,能够使用 Python 语言实现朴素贝叶斯的训练与测试,
并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练朴素贝叶斯分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验六的
部分。
三、算法步骤、代码、及结果
1. 算法伪代码
输入:训练数据集 D,测试数据集 T
输出:训练好的朴素贝叶斯模型
1. 对于 D 中的每一个类别 C do
a. 计算每个特征在类别 C 中的条件概率
b. 计算每个特征的先验概率
2. 对于 D 中的每一个样本 S 和其特征 F do
a. 计算样本 S 属于每个类别 C 的后验概率
b. 将样本 S 分配给具有最高后验概率的类别
3. 使用步骤 1 和 2 的结果在测试集 T 上进行测试
4. 计算性能指标(准确率、精度、召回率、F1值)
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 使用留出法留出1/3的样本作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=1)
# 创建朴素贝叶斯模型
gnb = GaussianNB()
# 训练模型
gnb.fit(X_train, y_train)
# 使用五折交叉验证评估模型性能
scores = cross_val_score(gnb, X_train, y_train, cv=5, scoring='accuracy')
print(f"五折交叉验证准确率平均值: {scores.mean()}")
# 在测试集上测试模型性能
y_pred = gnb.predict(X_test)
# 计算性能指标
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred, average='macro')
recall = recall_score(y_test, y_pred, average='macro')
f1 = f1_score(y_test, y_pred, average='macro')
# 输出性能指标结果
print(f"测试集准确率: {accuracy:.4f}")
print(f"测试集查准率(精度): {precision:.4f}")
print(f"测试集查全率(召回率): {recall:.4f}")
print(f"测试集F1值: {f1:.4f}")
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
算法原理理解:
朴素贝叶斯算法的核心在于贝叶斯定理的应用,通过计算给定输入特征下每个类别的概率,选择概率最高的类别作为预测结果。它依赖于属性独立性的假设和合适的先验假设。
模型性能:
在实验中,我们使用了五折交叉验证来评估模型的性能,包括准确度、精度、召回率和F1值。这些指标帮助我们全面评估模型的效果。
优缺点分析:
优点:
朴素贝叶斯模型简单高效,对小规模数据表现良好,适合增量式训练,尤其是数据量超出内存时,可以一批批地去增量训练。
对缺失数据不太敏感,算法简单,常用于文本分类。
缺点:
特征独立性假设在实际应用中往往不成立,这可能会影响分类的准确性。
需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
对输入数据的表达形式敏感。
模型选择:
在实际应用中,应根据数据的特征和分布来选择最合适的模型。例如,高斯朴素贝叶斯适合处理连续特征的数据集,而多项式朴素贝叶斯和伯努利朴素贝叶斯更适用于处理离散特征。
实验结论:
通过这次实验,我深入理解了朴素贝叶斯的算法原理,并能够使用Python语言实现朴素贝叶斯的训练与测试,同时也学会了如何使用五折交叉验证算法进行模型训练与评估。这些经验将有助于我们在未来的机器学习项目中更好地应用和优化朴素贝叶斯算法。