9.30

1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注
意同分布取样);
(2)使用训练集训练 BP 神经网络分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选
择;
(4)使用测试集,测试模型的性能,对测试结果进行分析
复制代码
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score, KFold
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score

# 加载iris数据集
iris = load_iris()
X = iris.data
y = iris.target

# 使用留出法划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42, stratify=y)

# 训练BP神经网络模型
bpnn = MLPClassifier(hidden_layer_sizes=(10,), max_iter=1000, random_state=42)
bpnn.fit(X_train, y_train)

# 五折交叉验证评估模型性能
kf = KFold(n_splits=5, shuffle=True, random_state=42)
cv_scores = cross_val_score(bpnn, X_train, y_train, cv=kf, scoring='accuracy')
precision_scores = cross_val_score(bpnn, X_train, y_train, cv=kf, scoring='precision_macro')
recall_scores = cross_val_score(bpnn, X_train, y_train, cv=kf, scoring='recall_macro')
f1_scores = cross_val_score(bpnn, X_train, y_train, cv=kf, scoring='f1_macro')

print("五折交叉验证准确度:", cv_scores.mean())
print("五折交叉验证精度:", precision_scores.mean())
print("五折交叉验证召回率:", recall_scores.mean())
print("五折交叉验证F1值:", f1_scores.mean())

# 使用测试集测试模型性能
y_pred = bpnn.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("测试集准确度:", accuracy)
print("测试集精度:", precision)
print("测试集召回率:", recall)
print("测试集F1值:", f1)

# 测试结果分析
# 比较五折交叉验证和测试集的评估指标
if np.abs(accuracy - cv_scores.mean()) < 0.1:
    print("模型的泛化能力较好,在训练集交叉验证和测试集上的准确度较为接近。")
else:
    print("模型可能存在过拟合或欠拟合问题,训练集交叉验证和测试集上的准确度差异较大。")

# 分析各类别样本的预测情况
from collections import Counter
class_pred_count = Counter(y_pred)
class_true_count = Counter(y_test)
for class_label in range(3):
    class_accuracy = accuracy_score(y_test[y_test == class_label], y_pred[y_test == class_label])
    print(f"类别{class_label}的准确度: {class_accuracy}")
    if class_pred_count[class_label] == 0:
        print(f"类别{class_label}在预测结果中未出现,可能存在对该类别的学习不足问题。")
    elif class_true_count[class_label] == 0:
        print(f"测试集中没有类别{class_label}的样本,可能数据划分存在问题。")
复制代码
在上述代码中:

 

  1. 首先从scikit-learn库中加载iris数据集,并使用train_test_split函数按照1/3的比例留出测试集,同时通过stratify=y保证训练集和测试集的类别分布与原始数据集一致。
  2. 接着使用MLPClassifier类构建一个简单的BP神经网络模型,并在训练集上进行训练。这里设置了隐藏层大小为(10,)和最大迭代次数为1000,你可以根据实际情况调整这些超参数以优化模型性能。
  3. 然后使用KFold进行五折交叉验证,分别计算模型的准确度、精度、召回率和F1值,并输出这些指标的平均值,以此来评估模型在训练集上的性能表现,从而进行模型选择和优化。
  4. 最后使用测试集对训练好的模型进行性能测试,并输出相应的评估指标值。在测试结果分析部分,首先比较了测试集准确度和五折交叉验证准确度的差异,以初步判断模型的泛化能力。然后进一步分析了每个类别样本在测试集中的预测情况,计算了各类别的准确度,并检查是否存在某个类别在预测结果中未出现或测试集中没有该类别的样本等情况,以便更深入地了解模型在不同类别上的表现,从而为模型的改进提供依据。
posted @ 2025-01-14 19:45  孙锺鸣  阅读(11)  评论(0)    收藏  举报