完成机器学习实验五,以下为实验内容:
实验五:BP 神经网络算法实现与测试
一、实验目的
深入理解支持向量机(SVM)的算法原理,能够使用 Python 语言实现支持向量机的训 练与测试,并且使用五折交叉验证算法进行模型训练与评估。
二、实验内容
(1)从 scikit-learn 库中加载 iris 数据集,使用留出法留出 1/3 的样本作为测试集(注 意同分布取样);
(2)使用训练集训练支持向量机—SMO 分类算法;
(3)使用五折交叉验证对模型性能(准确度、精度、召回率和 F1 值)进行评估和选 择;
(4)使用测试集,测试模型的性能,对测试结果进行分析,完成实验报告中实验四的 部分。
三、算法步骤、代码、及结果
1. 算法伪代码
1. 导入必要的库
- 导入加载数据集的函数
- 导入数据划分的函数
- 导入多层感知器分类器
- 导入性能评估函数
2. 加载iris数据集
- 调用函数加载iris数据集,获取特征集X和标签集y
3. 数据划分
- 使用train_test_split函数将数据集X和y划分为训练集和测试集
- 测试集大小设置为1/3,随机种子设置为42
4. 初始化MLPClassifier
- 创建MLPClassifier实例mlp
- 设置隐藏层大小为100,最大迭代次数为1000,L2正则化系数为0.0001
- 设置优化器为sgd,随机种子为1,初始学习率为0.1
5. 训练模型
- 使用训练集X_train和y_train训练mlp模型
6. 交叉验证评估模型性能
- 使用cross_val_score函数对训练集进行5折交叉验证,并计算准确率
- 打印交叉验证分数和平均准确率
7. 测试模型
- 使用训练好的模型mlp对测试集X_test进行预测,得到预测结果y_pred
8. 计算测试集上的性能指标
- 使用accuracy_score函数计算测试集的准确率
- 使用precision_score函数计算测试集的精度(查准率),设置平均方法为'macro'
- 使用recall_score函数计算测试集的召回率(查全率),设置平均方法为'macro'
- 使用f1_score函数计算测试集的F1值,设置平均方法为'macro'
9. 计算训练集上的性能指标
- 使用训练好的模型mlp对训练集X_train进行预测,得到预测结果y_train_pred
- 使用accuracy_score函数计算训练集的准确率
- 使用precision_score函数计算训练集的精度(查准率),设置平均方法为'macro'
- 使用recall_score函数计算训练集的召回率(查全率),设置平均方法为'macro'
- 使用f1_score函数计算训练集的F1值,设置平均方法为'macro'
10. 打印训练结果和测试结果
- 打印训练集的准确率、精度、召回率和F1值
- 打印测试集的准确率、精度、召回率和F1值
2. 算法主要代码
完整源代码\调用库方法(函数参数说明)
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neural_network import MLPClassifier
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 数据划分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=1/3, random_state=42)
# 训练BP神经网络
mlp = MLPClassifier(hidden_layer_sizes=(100,), max_iter=1000, alpha=1e-4,
solver='sgd', verbose=10, random_state=1,
learning_rate_init=.1)
# 训练模型
mlp.fit(X_train, y_train)
# 交叉验证评估模型性能
scores = cross_val_score(mlp, X_train, y_train, cv=5, scoring='accuracy')
print(f'Cross-validation scores (5-fold): {scores}')
print(f'Average cross-validation accuracy: {scores.mean():.4f}')
# 测试模型
y_pred = mlp.predict(X_test)
# 计算测试集上的性能指标
accuracy_test = accuracy_score(y_test, y_pred)
precision_test = precision_score(y_test, y_pred, average='macro')
recall_test = recall_score(y_test, y_pred, average='macro')
f1_test = f1_score(y_test, y_pred, average='macro')
# 计算训练集上的性能指标
y_train_pred = mlp.predict(X_train)
accuracy_train = accuracy_score(y_train, y_train_pred)
precision_train = precision_score(y_train, y_train_pred, average='macro')
recall_train = recall_score(y_train, y_train_pred, average='macro')
f1_train = f1_score(y_train, y_train_pred, average='macro')
# 打印训练结果和测试结果
print('\nTraining Results:')
print(f'Training Accuracy (准确率): {accuracy_train:.4f}')
print(f'Training Precision (查准率): {precision_train:.4f}')
print(f'Training Recall (查全率): {recall_train:.4f}')
print(f'Training F1 Score: {f1_train:.4f}')
print('\nTest Results:')
print(f'Test Accuracy (准确率): {accuracy_test:.4f}')
print(f'Test Precision (查准率): {precision_test:.4f}')
print(f'Test Recall (查全率): {recall_test:.4f}')
print(f'Test F1 Score: {f1_test:.4f}')
1. load_iris()
说明:加载鸢尾花(iris)数据集。
参数:无。
返回值:返回一个包含鸢尾花数据集的特征集(X)和标签集(y)的对象。
2. train_test_split(X, y, test_size=1/3, random_state=42)
说明:将数据集X和y划分为训练集和测试集。
参数:
X:特征集。
y:标签集。
test_size:测试集的比例,默认为0.25(即25%)。
random_state:随机数生成器的种子,默认为None。设置相同的种子可以确保每次划分的结果相同。
返回值:返回训练集的特征集(X_train)、测试集的特征集(X_test)、训练集的标签集(y_train)和测试集的标签集(y_test)。
3. MLPClassifier(hidden_layer_sizes=(100,), max_iter=1000, alpha=1e-4, solver='sgd', verbose=10, random_state=1, learning_rate_init=.1)
说明:创建多层感知器(MLP)分类器实例。
参数:
hidden_layer_sizes:隐藏层的大小,以元组的形式给出,默认为(100,)。
max_iter:最大迭代次数,默认为200。
alpha:L2正则化项的系数,默认为0.0001。
solver:优化算法,默认为‘adam’。其他选项包括‘sgd’、‘lbfgs’等。
verbose:控制日志显示的详细程度,默认为0。大于0时,会在控制台输出训练进度。
random_state:随机数生成器的种子,默认为None。设置相同的种子可以确保结果的可重复性。
learning_rate_init:初始学习率,默认为0.001。
返回值:返回一个MLPClassifier实例。
4. fit(X_train, y_train)
说明:训练模型。
参数:
X_train:训练集的特征集。
y_train:训练集的标签集。
返回值:返回训练好的模型。
5. cross_val_score(estimator, X_train, y_train, cv=5, scoring='accuracy')
说明:进行交叉验证,并计算指定的评分指标。
参数:
estimator:评估的模型。
X_train:训练集的特征集。
y_train:训练集的标签集。
cv:交叉验证的折数,默认为5。
scoring:评分指标,默认为‘accuracy’。其他选项包括‘precision’、‘recall’、‘f1’等。
返回值:返回一个数组,包含每次交叉验证的评分。
6. predict(X_test)
说明:对测试集进行预测。
参数:
X_test:测试集的特征集。
返回值:返回预测的标签集。
7. accuracy_score(y_true, y_pred)
说明:计算准确率。
参数:
y_true:真实的标签集。
y_pred:预测的标签集。
返回值:返回准确率的值。
8. precision_score(y_true, y_pred, average='macro')
说明:计算精度(查准率)。
参数:
y_true:真实的标签集。
y_pred:预测的标签集。
average:计算平均值的方法,默认为‘macro’。其他选项包括‘micro’、‘weighted’等。
返回值:返回精度的值。
9. recall_score(y_true, y_pred, average='macro')
说明:计算召回率(查全率)。
参数:
y_true:真实的标签集。
y_pred:预测的标签集。
average:计算平均值的方法,默认为‘macro’。其他选项包括‘micro’、‘weighted’等。
返回值:返回召回率的值。
10. f1_score(y_true, y_pred, average='macro')
说明:计算F1值。
参数:
y_true:真实的标签集。
y_pred:预测的标签集。
average:计算平均值的方法,默认为‘macro’。其他选项包括‘micro’、‘weighted’等。
返回值:返回F1值的值。
3. 训练结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
四、实验结果分析
1. 测试结果截图(包括:准确率、精度(查准率)、召回率(查全率)、F1)
2. 对比分析
准确率(Accuracy):
训练准确率:0.9000(90%)
测试准确率:0.9200(92%)
分析:测试准确率略高于训练准确率,表明模型在测试集上的表现略好于训练集。这是一个好的迹象,说明模型具有一定的泛化能力,没有明显的过拟合现象。
精度(Precision):
训练精度:0.9242(92.42%)
测试精度:0.9333(93.33%)
分析:测试精度略高于训练精度,这进一步表明模型在测试集上的表现较好,能够更准确地识别类别。
召回率(Recall):
训练召回率:0.9048(90.48%)
测试召回率:0.9111(91.11%)
分析:测试召回率略高于训练召回率,说明模型在测试集上能够较好地识别出更多的正类样本。
F1值(F1 Score):
训练F1值:0.9017
测试F1值:0.9117
分析:测试F1值略高于训练F1值,这表明模型在测试集上综合了精度和召回率的表现更好,是一个积极的信号。
交叉验证性能:
交叉验证准确率:[1.0, 0.95, 0.85, 1.0, 1.0]
平均交叉验证准确率:0.9600(96%)
标签:score,训练,日报,pred,12.26,train,测试,test From: https://www.cnblogs.com/lijianlongCode13/p/18671509