2024.11.26
机器学习实验五
实验五:BP神经网络算法实现与测试
一、实验目的
深入理解BP神经网络的算法原理,能够使用Python语言实现BP神经网络的训练与测 试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练BP神经网络分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验五的部分。
三、算法步骤、代码、及结果
1. 算法伪代码
1. 加载数据集
- 使用 sklearn 提供的鸢尾花数据集。
2. 数据划分
- 使用 `train_test_split` 将数据集划分为训练集和测试集,确保测试集占 1/3,且类别分布一致。
3. 训练 BP 神经网络
- 初始化一个多层感知机(MLP)模型,设置两个隐藏层,分别有 10 和 5 个神经元。
- 使用 ReLU 激活函数,Adam 优化算法,最大迭代次数设置为 2000,训练 BP 神经网络模型。
4. 五折交叉验证
- 使用 `cross_validate` 对模型进行五折交叉验证,计算并输出每一折的准确率、精度、召回率、F1 值等指标。
5. 测试集评估
- 使用测试集预测,计算准确率、精度、召回率、F1 值。
- 输出分类报告,显示每个类的精度、召回率、F1 值以及支持数。
6. 输出结果
- 输出交叉验证结果。
- 输出测试集性能和分类报告。
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_validate
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score,
f1_score, classification_report
# Step 1: 加载数据并划分训练集与测试集
iris = datasets.load_iris()
X, y = iris.data, iris.target
# 保证类别分布一致的划分
X_train, X_test, y_train, y_test =
train_test_split(
X, y, test_size=1/3, random_state=42,
stratify=y
)
# Step 2: 训练 BP 神经网络
bp_model = MLPClassifier(
hidden_layer_sizes=(10, 5), # 两层隐藏层,分别含 10 和 5 个神经元
activation='relu',
# 激活函数,默认为 ReLU
solver='adam',
# 优化算法,默认为 Adam
max_iter=2000,
# 最大迭代次数,默认 200,设置为 1000 提高训练稳定性
random_state=42
# 随机种子,确保实验可复现
)
bp_model.fit(X_train, y_train)
# Step 3: 五折交叉验证
scoring_metrics = ['accuracy',
'precision_macro', 'recall_macro', 'f1_macro']
cv_results = cross_validate(bp_model, X_train, y_train, cv=5,
scoring=scoring_metrics)
print("五折交叉验证结果:")
for metric in scoring_metrics:
print(f"{metric}:
{cv_results['test_' + metric].mean():.4f}")
# Step 4: 测试集评估
y_pred = bp_model.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("\n测试集性能:")
print(f"Accuracy: {accuracy:.4f}")
print(f"Precision: {precision:.4f}")
print(f"Recall: {recall:.4f}")
print(f"F1 Score: {f1:.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred, target_names=iris.target_names))
1 datasets.load_iris(): 加载鸢尾花数据集,包含 150 个样本,4 个特征。
2 train_test_split(): 将数据集划分为训练集和测试集,确保类别分布一致。
3 MLPClassifier(): 初始化 BP 神经网络模型,设置隐藏层神经元数、激活函数、优化算法、最大迭代次数等参数。
4 cross_validate(): 执行五折交叉验证,评估模型的多种指标(准确率、精度、召回率、F1 值等)。
5 accuracy_score(), precision_score(), recall_score(), f1_score(): 分别计算准确率、精度、召回率和 F1 值。
6 classification_report(): 输出分类报告,显示每个类别的详细分类指标(精度、召回率、F1 值等)。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
准确率(Accuracy):训练集和测试集的准确率都较高,特别是在测试集上表现出色,达到了 98% 以上,说明模型能够很好地进行分类。
精度(Precision):精度表现较为均衡,尤其是对 Versicolor 类的预测精度接近 1,表明模型在该类别的分类能力较强。
召回率(Recall):召回率也很高,几乎所有类别的召回率都接近 1,显示出模型能够有效识别各类别的样本,尤其是对 Setosa 类的召回率达到 1。
F1 值:F1 值在所有类别中都接近 1,表明模型在精度和召回率之间达到了很好的平衡。