12.5

实验五:BP 神经网络算法实现与测试

 

一、实验目的

深入理解 BP 神经网络的算法原理,能够使用 Python 语言实现 BP 神经网络的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。

 

二、实验内容

(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注意同分布取样);

(2)使用训练集训练 BP 神经网络分类算法;

(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选择;

(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验五的部分。

三、算法步骤、代码、及结果

   1. 算法伪代码

// 导入所需的库

import numpy, sklearn, sklearn.metrics

 

// 加载iris数据集并分割为训练集和测试集

load_iris_data()

split_data_into_train_test()

 

// 创建BP神经网络模型

create_mlp_model()

 

// 训练模型

train_model_with_training_data()

 

// 使用五折交叉验证评估模型

evaluate_model_with_cross_validation()

 

// 使用测试集测试模型性能

test_model_with_test_data()

 

// 打印性能指标

print_performance_metrics()

   2. 算法主要代码

完整源代码\调用库方法(函数参数说明)

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.neural_network import MLPClassifier

from sklearn.metrics import accuracy_score, classification_report

 

def train_and_evaluate_model(X, y, test_size=1/3, random_state=42):

    """

    使用多层感知器(MLP)分类器对鸢尾花数据集进行训练和评估。

 

    参数:

    X (array-like): 特征矩阵。

    y (array-like): 目标向量。

    test_size (float, 可选): 测试集占总数据集的比例,默认为1/3

    random_state (int, 可选): 控制数据集随机划分的随机数种子,默认为42

 

    返回:

    None

    """

    # 使用留出法留出1/3的样本作为测试集

    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)

 

    # 创建MLP分类器实例

    mlp = MLPClassifier(hidden_layer_sizes=(10), max_iter=1000, alpha=0.01,

                  solver='sgd', verbose=0, random_state=random_state, learning_rate_init=0.01, power_t=0.5)

 

    # 训练模型

    mlp.fit(X_train, y_train)

 

    # 训练结果

    y_train_pred = mlp.predict(X_train)

    print("训练集准确度:", accuracy_score(y_train, y_train_pred))

    print("训练集分类报告:\n", classification_report(y_train, y_train_pred))

 

    # 测试结果

    y_test_pred = mlp.predict(X_test)

    print("测试集准确度:", accuracy_score(y_test, y_test_pred))

    print("测试集分类报告:\n", classification_report(y_test, y_test_pred))

 

# 加载iris数据集

iris = load_iris()

X, y = iris.data, iris.target

 

# 调用函数训练并评估模型

train_and_evaluate_model(X, y)

 

 

   3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1

 

 

 

四、实验结果分析

1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1

 

 

 

2. 对比分析

训练集分类报告分析:

类别0的精确度(precision)、召回率(recall)和F1分数(f1-score)都达到了1.00,说明模型对这个类别的预测非常准确。

类别1的召回率稍低,为0.94,但精确度和F1分数仍然很高,接近1.00

类别2的精确度为0.94,召回率为1.00F1分数为0.97,略低于类别01,但仍然表现良好。

测试集分类报告分析:

类别0的表现与训练集一致,精确度、召回率和F1分数都为1.00

类别1的召回率略有下降至0.93,但精确度和F1分数仍然很高。

类别2的表现与训练集相似,精确度为0.94,召回率为1.00F1分数为0.97

总体表现:

模型在两个数据集上的准确度都为0.9,说明整体预测准确率很高。

宏平均(macro avg)和加权平均(weighted avg)的精确度、召回率和F1分数在两个数据集上都非常接近,这表明模型在各个类别上的表现较为均衡。

结论:

模型在训练集和测试集上的表现相似,说明模型具有良好的泛化能力,没有过拟合训练数据。

对于类别1,召回率略低于其他类别,可能需要进一步优化以提高对这一类别的识别能力。

可以考虑使用更多的数据、调整模型参数或尝试不同的模型结构来进一步提升模型性能。

posted @ 2024-12-18 18:01  七安。  阅读(14)  评论(0编辑  收藏  举报