12.4

实验五: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)。这表明模型对不同类别的预测能力存在差异,可能需要进一步调整以优化这些类别的识别。

posted @   灬倾夏  阅读(36)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示