24.12.10

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

一、实验目的

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

二、实验内容

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

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

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

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

 

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

   1. 算法伪代码

1. 加载 iris 数据集

   Dataset ← Load iris dataset

 

2. 划分数据集为训练集和测试集

   (X_train, X_test, y_train, y_test) ← TrainTestSplit(Dataset, test_size=1/3, stratify=y, random_state=42)

 

3. 初始化 BP 神经网络模型

   BP_Model ← MLPClassifier(hidden_layer_sizes=(100), max_iter=200, solver='adam', random_state=42)

 

4. 训练 BP 神经网络模型

   BP_Model.fit(X_train, y_train)

 

5. 五折交叉验证

   For each fold in 5-fold cross-validation:

       - 训练子集 ← 训练数据中的 4 份

       - 验证子集 ← 训练数据中的 1 份

       - 训练模型 BP_Model

       - 验证模型,记录预测结果

   End For

 

   计算五折交叉验证的性能指标:

       Accuracy_cv ← Calculate accuracy from cross-validation predictions

       Precision_cv ← Calculate precision from cross-validation predictions

       Recall_cv ← Calculate recall from cross-validation predictions

       F1_cv ← Calculate F1-score from cross-validation predictions

 

6. 使用测试集评估模型性能

   y_test_pred ← BP_Model.predict(X_test)

 

   计算测试集的性能指标:

       Accuracy_test ← Calculate accuracy from y_test and y_test_pred

       Precision_test ← Calculate precision from y_test and y_test_pred

       Recall_test ← Calculate recall from y_test and y_test_pred

       F1_test ← Calculate F1-score from y_test and y_test_pred

 

7. 输出结果

   输出五折交叉验证结果 (Accuracy_cv, Precision_cv, Recall_cv, F1_cv)

   输出测试集性能结果 (Accuracy_test, Precision_test, Recall_test, F1_test)

   2. 算法主要代码

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

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split, cross_val_score, cross_val_predict

from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, classification_report

from sklearn.neural_network import MLPClassifier

 

# (1) 加载 iris 数据集并划分训练集和测试集

data = load_iris()

X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.33, stratify=data.target, random_state=42)

 

# (2) 使用训练集训练 BP 神经网络

# 初始化 MLPClassifier(BP 神经网络)模型

bp_model = MLPClassifier(hidden_layer_sizes=(100,), max_iter=200, solver='adam', random_state=42)

 

# 模型训练

bp_model.fit(X_train, y_train)

 

# (3) 五折交叉验证评估模型性能

# 使用 cross_val_predict 来获取每一折的预测结果,并计算多项评估指标

y_train_pred = cross_val_predict(bp_model, X_train, y_train, cv=5)

 

# 计算交叉验证评估指标

cv_accuracy = accuracy_score(y_train, y_train_pred)

cv_precision = precision_score(y_train, y_train_pred, average='weighted')

cv_recall = recall_score(y_train, y_train_pred, average='weighted')

cv_f1 = f1_score(y_train, y_train_pred, average='weighted')

 

print("五折交叉验证结果:")

print(f"准确度:{cv_accuracy:.4f}")

print(f"精度:{cv_precision:.4f}")

print(f"召回率:{cv_recall:.4f}")

print(f"F1值:{cv_f1:.4f}")

 

# (4) 使用测试集评估模型性能

y_test_pred = bp_model.predict(X_test)

 

# 计算测试集评估指标

test_accuracy = accuracy_score(y_test, y_test_pred)

test_precision = precision_score(y_test, y_test_pred, average='weighted')

test_recall = recall_score(y_test, y_test_pred, average='weighted')

test_f1 = f1_score(y_test, y_test_pred, average='weighted')

 

print("\n测试集性能:")

print(f"准确度:{test_accuracy:.4f}")

print(f"精度:{test_precision:.4f}")

print(f"召回率:{test_recall:.4f}")

print(f"F1值:{test_f1:.4f}")

 

 

1. MLPClassifier 类

MLPClassifier 是用于多层感知器(BP 神经网络)分类的模型,常用于解决分类问题。

主要参数及其说明

• hidden_layer_sizes

o 作用:指定隐藏层的神经元数量及层数。

o 类型:元组,例如 (100,) 表示一个隐藏层,包含 100 个神经元;(100, 50) 表示两层,第一层 100 个神经元,第二层 50 个神经元。

o 默认值:(100,)。

• activation

o 作用:指定激活函数类型。

o 可选值:

      'identity':恒等函数。

      'logistic':Sigmoid 函数。

      'tanh':双曲正切函数。

      'relu':整流线性单元函数(默认值)。

o 默认值:'relu'。

• solver

o 作用:指定优化算法。

o 可选值:

      'lbfgs':准牛顿法,适用于小数据集。

      'sgd':随机梯度下降。

      'adam':自适应矩估计(默认值)。

o 默认值:'adam'。

• alpha

o 作用:L2 正则化参数,用于防止过拟合。

o 类型:浮点数。

o 默认值:0.0001。

• batch_size

o 作用:用于随机梯度下降的 minibatch 的大小。

o 类型:整数或 'auto'(使用样本数)。

o 默认值:'auto'。

• learning_rate

o 作用:控制学习率的更新方式。

o 可选值:

      'constant':学习率保持不变。

      'invscaling':随迭代次数调整。

      'adaptive':当损失不再下降时,调整学习率。

o 默认值:'constant'。

• learning_rate_init

o 作用:初始学习率,用于 sgd 或 adam 优化算法。

o 类型:浮点数。

o 默认值:0.001。

• max_iter

o 作用:最大迭代次数。

o 类型:整数。

o 默认值:200。

• random_state

o 作用:控制随机数生成,用于模型初始化和数据打乱。

o 类型:整数或 None。

o 默认值:None。

• tol

o 作用:优化算法的容忍度(停止标准)。

o 类型:浮点数。

o 默认值:1e-4。

• verbose

o 作用:是否输出训练过程的信息。

o 类型:布尔值。

o 默认值:False。

________________________________________

2. train_test_split 函数

用于划分训练集和测试集。

主要参数及其说明

• test_size

o 作用:测试集占总数据集的比例。

o 类型:浮点数或整数。

o 默认值:None(使用 train_size)。

• train_size

o 作用:训练集占总数据集的比例。

o 类型:浮点数或整数。

o 默认值:None。

• stratify

o 作用:按比例分层采样,确保训练集和测试集中类别分布一致。

o 类型:数组或 None。

o 默认值:None。

• random_state

o 作用:随机种子,保证划分结果可复现。

o 类型:整数或 None。

o 默认值:None。

________________________________________

3. cross_val_score 函数

用于进行交叉验证评估。

主要参数及其说明

• estimator

o 作用:模型对象。

o 类型:任何 scikit-learn 模型。

• X 和 y

o 作用:训练数据和目标值。

• cv

o 作用:交叉验证的折数。

o 类型:整数或交叉验证生成器。

o 默认值:None(使用 5 折)。

• scoring

o 作用:指定评估指标。

o 类型:字符串或可调用对象。

o 默认值:None(使用默认评分)。

 

 

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

 

 

 

四、实验结果分析

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

 

 

 

2. 对比分析

表现对比: 测试集上的性能指标(准确度、精度、召回率、F1 值)均比五折交叉验证结果略高,说明模型在测试集上表现更加优秀。

泛化能力: 五折交叉验证的结果已经表明模型在训练集上有较好的性能,而测试集的优异表现进一步验证了模型的泛化能力,能够处理新数据而不出现明显的过拟合。

可能的原因:

数据分布一致性:训练集和测试集具有相似的数据分布,因此测试集性能略高。

样本数量:iris 数据集样本量较小,模型可能对数据特征较好地拟合,从而在测试集上表现良好。

 

posted on 2024-12-10 17:47  Daniel350  阅读(6)  评论(0编辑  收藏  举报