算法伪代码

BEGIN  

    // (1) 加载Iris数据集并留出1/3样本作为测试集  

    加载 iris 数据集  

    设置 X = iris 特征  

    设置 y = iris 标签  

    使用 留出法 拆分 (X, y) 进入 (X_train, y_train) (X_test, y_test),测试集占1/3,随机种子设为 42,按 y 进行分层  

 

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

    初始化 mlp MLPClassifier,隐藏层大小 = (100,),最大迭代次数 = 1000,学习率衰减 = 1e-4,求解器 = 'sgd',随机种子 = 42,容忍度 = 1e-4  

    拟合 mlp (X_train, y_train)  

 

    // (3) 使用五折交叉验证评估模型性能  

    初始化 skf StratifiedKFoldn_splits = 5,洗牌 = True,随机种子 = 42  

    scores = 使用交叉验证计算 (mlp, X_train, y_train, skf, 评分标准 = '准确率')  

    precision = 使用交叉验证计算 (mlp, X_train, y_train, skf, 评分标准 = '精确率_')  

    recall = 使用交叉验证计算 (mlp, X_train, y_train, skf, 评分标准 = '召回率_')  

    f1 = 使用交叉验证计算 (mlp, X_train, y_train, skf, 评分标准 = 'F1_')  

 

    // 打印交叉验证结果  

    打印 "交叉验证准确度: " + 平均值(scores)  

    打印 "交叉验证精确度: " + 平均值(precision)  

    打印 "交叉验证召回率: " + 平均值(recall)  

    打印 "交叉验证F1: " + 平均值(f1)  

 

    // (4) 使用测试集测试模型性能  

    y_pred = 预测(mlp, X_test)  

    accuracy = 计算准确率(y_test, y_pred)  

    precision = 计算精确率(y_test, y_pred, 平均值 = '')  

    recall = 计算召回率(y_test, y_pred, 平均值 = '')  

    f1 = 计算F1(y_test, y_pred, 平均值 = '')  

 

    // 打印测试结果  

    打印 "测试集准确度: " + accuracy  

    打印 "测试集精确度: " + precision  

    打印 "测试集召回率: " + recall  

    打印 "测试集F1: " + f1  

END

   2. 算法主要代码

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

from sklearn import datasets

from sklearn.model_selection import train_test_split, cross_val_score, StratifiedKFold

from sklearn.neural_network import MLPClassifier

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

import numpy as np

 

# 1)加载iris数据集,并留出1/3作为测试集

iris = datasets.load_iris()

X = iris.data

y = iris.target

 

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

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)

 

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

mlp = MLPClassifier(hidden_layer_sizes=(100,), max_iter=1000, alpha=1e-4,

solver='sgd', verbose=10, random_state=42, tol=1e-4)

mlp.fit(X_train, y_train)

 

# 3)使用五折交叉验证对模型性能进行评估

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

scores = cross_val_score(mlp, X_train, y_train, cv=skf, scoring='accuracy')

precision = cross_val_score(mlp, X_train, y_train, cv=skf, scoring='precision_macro')

recall = cross_val_score(mlp, X_train, y_train, cv=skf, scoring='recall_macro')

f1 = cross_val_score(mlp, X_train, y_train, cv=skf, scoring='f1_macro')

 

# 打印交叉验证结果

print("交叉验证准确度: {:.3f}".format(np.mean(scores)))

print("交叉验证精确度: {:.3f}".format(np.mean(precision)))

print("交叉验证召回率: {:.3f}".format(np.mean(recall)))

print("交叉验证F1: {:.3f}".format(np.mean(f1)))

 

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

y_pred = mlp.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("测试集准确度: {:.3f}".format(accuracy))

print("测试集精确度: {:.3f}".format(precision))

print("测试集召回率: {:.3f}".format(recall))

print("测试集F1: {:.3f}".format(f1))

 

 

 

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

 

 

四、实验结果分析

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

 

 

2. 对比分析

交叉验证结果分析:

交叉验证的准确率、精确率、召回率和F1值均为0.973,表现良好,说明在训练数据的不同折叠中,模型能够很好地适应数据,具备了较强的训练能力和稳定性。

测试集结果分析:

测试集的所有性能指标均为1.000,这说明模型能够完美地分类测试数据,没有出现错误预测。这种情况表明模型不仅在训练上表现良好,也能很好地泛化到新的、未见过的数据上。

过拟合与泛化能力:

 

在本实验中,模型没有出现过拟合的迹象。理想的1.000可能意味着该数据集的复杂性较低,或可能存在一定的“数据泄露”,即模型在某种程度上已看到了一部分测试集信息。在大多数实际应用场景中,完全的1.000是不常见的,因此,进一步的测试可能需要使用更复杂、更真实的样本数据。

评价指标的实用性:

准确度 (Accuracy):表明整体分类的正确性。

精确度 (Precision):尤其是在正类样本较少的场合非常重要,表现出正确分类的可靠性。

召回率 (Recall):反映模型检测到正类样本的能力,经常用于关注漏检的场合。

F1值:作为精确率和召回率的调和平均值,F1值在实际任务中常用于平衡精确率和召回率,尤其在类别不平衡时更为重要。

posted on 2025-01-06 15:22    阅读(10)  评论(0)    收藏  举报