实验五:BP 神经网络算法实现与测试
一、实验目的
深入理解 BP 神经网络的算法原理,能够使用 Python 语言实现 BP 神经网络的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);
(2)使用训练集训练 BP 神经网络分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验五的部分
三、算法步骤、代码、及结果
1. 算法伪代码
1. 导入所需库。
2. 加载并标准化Iris数据集。
3. 划分训练集和测试集。
4. 初始化并训练MLP神经网络。
5. 进行交叉验证并输出结果。
6. 在测试集上评估模型并输出分类报告。
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.preprocessing import StandardScaler
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import classification_report, make_scorer, accuracy_score, precision_score, recall_score, f1_score
# 加载Iris数据集
iris = load_iris()
X, y = iris.data, iris.target
# 标准化特征值
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 按照70%训练集,30%测试集的比例分割数据集,确保类别分布均匀(stratify)
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.33, random_state=42, stratify=y)
# 创建并训练BP神经网络模型,增加迭代次数并启用早停法
mlp = MLPClassifier(
hidden_layer_sizes=(10,),
max_iter=2000, # 增加迭代次数
random_state=42,
early_stopping=True, # 启用早停法
validation_fraction=0.2, # 设置验证集比例
n_iter_no_change=50, # 设置早停条件,连续50次迭代无改善则停止
learning_rate_init=0.001 # 可选:调整初始学习率
)
mlp.fit(X_train, y_train)
# 定义评分函数
scoring = {
'准确率': make_scorer(accuracy_score),
'宏平均精度': make_scorer(precision_score, average='macro'),
'宏平均召回率': make_scorer(recall_score, average='macro'),
'宏平均F1分数': make_scorer(f1_score, average='macro')
}
# 使用五折交叉验证评估模型性能
cv_results = {}
for metric, scorer in scoring.items():
cv_scores = cross_val_score(mlp, X_train, y_train, cv=5, scoring=scorer)
cv_results[metric] = cv_scores
print(f"交叉验证 {metric} 分数: {cv_scores}")
print(f"平均交叉验证 {metric} 分数: {cv_scores.mean()}")
# 使用测试集评估模型性能
y_pred = mlp.predict(X_test)
report = classification_report(y_test, y_pred, target_names=iris.target_names)
# 打印分类报告
print("分类报告:\n", report)
# 打印五折交叉验证的平均得分
print("\n交叉验证总结:")
for metric, scores in cv_results.items():
print(f"平均交叉验证 {metric} 分数: {scores.mean()}")
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
训练结果 (基于五折交叉验证)
准确率:平均0.69
宏平均精度:平均0.693
宏平均召回率:平均0.694
宏平均F1分数:平均0.678
测试结果
准确率:0.82
宏平均精度:0.83
宏平均召回率:0.82
宏平均F1分数:0.82
对比分析
性能提升:
模型在测试集上的表现明显优于交叉验证的结果。例如,测试集上的准确率为0.82,而交叉验证的平均准确率为0.69。
泛化能力:
测试结果表明模型具有较好的泛化能力,能够在未见过的数据上取得不错的性能。这可能是由于数据集较小,导致交叉验证时某些折叠的数据分布不够理想。
过拟合/欠拟合:
尽管测试结果优于交叉验证结果,但考虑到交叉验证中某些折叠的表现非常差(如第一个折叠的准确率仅为0.1),可能存在一定的数据分割问题或模型对某些特定数据点过于敏感。然而,整体来看,模型并未显示出明显的过拟合迹象,因为测试集的表现依然良好。
分类报告细节:
在测试集中,setosa类别(准确率0.86,召回率0.75)和versicolor类别(准确率0.70,召回率0.82)的性能稍逊于virginica类别(准确率0.94,召回率0.88)。这表明模型对不同类别的预测能力存在差异,可能需要进一步调整以优化这些类别的识别。
标签:交叉,验证,准确率,score,测试,12.4,cv From: https://www.cnblogs.com/0608lin/p/18585843