Python机器学习应用之基于BP神经网络的预测篇详解

Python机器学习应⽤之基于BP神经⽹络的预测篇详解
⽬录
⼀、Introduction
1 BP神经⽹络的优点
2 BP神经⽹络的缺点
⼆、实现过程
1 Demo
2 基于BP神经⽹络的乳腺癌分类预测
三、Keys
⼀、Introduction
1 BP神经⽹络的优点
⾮线性映射能⼒:BP神经⽹络实质上实现了⼀个从输⼊到输出的映射功能,数学理论证明三层的神经⽹络就能够以任意精度逼近任何⾮线性连续函数。这使得其特别适合于求解内部机制复杂的问题,即BP神经⽹络具有较强的⾮线性映射能⼒。
⾃学习和⾃适应能⼒:BP神经⽹络在训练时,能够通过学习⾃动提取输⼊、输出数据间的“合理规则”,并⾃适应地将学习内容记忆于⽹络的权值中。即BP神经⽹络具有⾼度⾃学习和⾃适应的能⼒。
泛化能⼒:所谓泛化能⼒是指在设计模式分类器时,即要考虑⽹络在保证对所需分类对象进⾏正确分类,还要关⼼⽹络在经过训练后,能否对未见过的模式或有噪声污染的模式,进⾏正确的分类。也即BP神经⽹络具有将学习成果应⽤于新知识的能⼒。
2 BP神经⽹络的缺点
局部极⼩化问题:从数学⾓度看,传统的 BP神经⽹络为⼀种局部搜索的优化⽅法,它要解决的是⼀个复杂⾮线性化问题,⽹络的权值是通过沿局部改善的⽅向逐渐进⾏调整的,这样会使算法陷⼊局部极值,权值收敛到局部极⼩点,从⽽导致⽹络训练失败。加上BP神经⽹络对初始⽹络权重⾮常敏感,以不同的权重初始化⽹络,其往往会收敛于不同的局部极⼩,这也是每次训练得到不同结果的根本原因
BP 神经⽹络算法的收敛速度慢:由于BP神经⽹络算法本质上为梯度下降法,它所要优化的⽬标函数
是⾮常复杂的,因此,必然会出现“锯齿形现象”,这使得BP算法低效;⼜由于优化的⽬标函数很复杂,它必然会在神经元输出接近0或1的情况下,出现⼀些平坦区,在这些区域内,权值误差改变很⼩,使训练过程⼏乎停顿;BP神经⽹络模型中,为了使⽹络执⾏BP算法,不能使⽤传统的⼀维搜索法求每次迭代的步长,⽽必须把步长的更新规则预先赋予⽹络,这种⽅法也会引起算法低效。以上种种,导致了BP神经⽹络算法收敛速度慢的现象。
BP 神经⽹络结构选择不⼀:BP神经⽹络结构的选择⾄今尚⽆⼀种统⼀⽽完整的理论指导,⼀般只能由经验选定。⽹络结构选择过⼤,训练中效率不⾼,可能出现过拟合现象,造成⽹络性能低,容错性下降,若选择过⼩,则⼜会造成⽹络可能不收敛。⽽⽹络的结构直接影响⽹络的逼近能⼒及推⼴性质。因此,应⽤中如何选择合适的⽹络结构是⼀个重要的问题。
⼆、实现过程
1 Demo
#%% 基础数组运算库导⼊
import numpy as np
# 画图库导⼊
import matplotlib.pyplot as plt
# 导⼊三维显⽰⼯具
from mpl_toolkits.mplot3d import Axes3D
# 导⼊BP模型
ural_network import MLPClassifier
# 导⼊demo数据制作⽅法
from sklearn.datasets import make_classification
ics import classification_report, confusion_matrix
import seaborn as sns
import warnings
ptions import ConvergenceWarning
#%%模型训练
# 制作五个类别的数据,每个类别1000个样本
train_samples, train_labels = make_classification(n_samples=1000, n_features=3,
n_redundant=0,n_classes=5, n_informative=3,
n_clusters_per_class=1,class_sep=3, random_state=10)
# 将五个类别的数据进⾏三维显⽰
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=20, azim=20)
ax.scatter(train_samples[:, 0], train_samples[:, 1], train_samples[:, 2], marker='o', c=train_labels)
plt.title('Demo Data Map')
#%% 建⽴ BP 模型, 采⽤sgd优化器,relu⾮线性映射函数
BP = MLPClassifier(solver='sgd',activation = 'relu',max_iter = 500,alpha = 1e-3,
hidden_layer_sizes = (32,32),random_state = 1)
# 进⾏模型训练
with warnings.catch_warnings():
warnings.filterwarnings("ignore", category=ConvergenceWarning,
module="sklearn")
BP.fit(train_samples, train_labels)
# 查看 BP 模型的参数
print(BP)
#%% 进⾏模型预测
predict_labels = BP.predict(train_samples)
# 显⽰预测的散点图
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=20, azim=20)
ax.scatter(train_samples[:, 0], train_samples[:, 1], train_samples[:, 2], marker='o', c=predict_labels) plt.title('Demo Data Predict Map with BP Model')
# 显⽰预测分数
print("预测准确率: {:.4f}".format(BP.score(train_samples, train_labels)))
# 可视化预测数据
print("真实类别:", train_labels[:10])
print("预测类别:", predict_labels[:10])
# 准确率等报表
print(classification_report(train_labels, predict_labels))
# 计算混淆矩阵
classes = [0, 1, 2, 3]
cofusion_mat = confusion_matrix(train_labels, predict_labels, classes)
sns.set()
figur, ax = plt.subplots()
# 画热⼒图
sns.heatmap(cofusion_mat, cmap="YlGnBu_r", annot=True, ax=ax)
ax.set_title('confusion matrix')  # 标题
ax.set_xticklabels([''] + classes, minor=True)
ax.set_yticklabels([''] + classes, minor=True)
ax.set_xlabel('predict')  # x轴
ax.set_ylabel('true')  # y轴
plt.show()
#%%# 进⾏新的测试数据测试
test_sample = np.array([[-1, 0.1, 0.1]])
print(f"{test_sample} 类别是: ", BP.predict(test_sample))
print(f"{test_sample} 类别概率分别是: ", BP.predict_proba(test_sample))
test_sample = np.array([[-1.2, 10, -91]])
print(f"{test_sample} 类别是: ", BP.predict(test_sample))
print(f"{test_sample} 类别概率分别是: ", BP.predict_proba(test_sample))
test_sample = np.array([[-12, -0.1, -0.1]])
print(f"{test_sample} 类别是: ", BP.predict(test_sample))
print(f"{test_sample} 类别概率分别是: ", BP.predict_proba(test_sample))
test_sample = np.array([[100, -90.1, -9.1]])
print(f"{test_sample} 类别是: ", BP.predict(test_sample))
print(f"{test_sample} 类别概率分别是: ", BP.predict_proba(test_sample))
2 基于BP神经⽹络的乳腺癌分类预测神经网络预测
#%%基于BP神经⽹络的乳腺癌分类
#基本库导⼊
# 导⼊乳腺癌数据集
from sklearn.datasets import load_breast_cancer
# 导⼊BP模型
ural_network import MLPClassifier
# 导⼊训练集分割⽅法
del_selection import train_test_split
# 导⼊预测指标计算函数和混淆矩阵计算函数
ics import classification_report, confusion_matrix
# 导⼊绘图包
import seaborn as sns
import matplotlib.pyplot as plt
# 导⼊三维显⽰⼯具
from mpl_toolkits.mplot3d import Axes3D
# 导⼊乳腺癌数据集
cancer = load_breast_cancer()
# 查看数据集信息
print('breast_cancer数据集的长度为:',len(cancer))
print('breast_cancer数据集的类型为:',type(cancer))
# 分割数据为训练集和测试集
cancer_data = cancer['data']
print('cancer_data数据维度为:',cancer_data.shape)
cancer_target = cancer['target']
print('cancer_target标签维度为:',cancer_target.shape)
cancer_names = cancer['feature_names']
cancer_desc = cancer['DESCR']
#分为训练集与测试集
cancer_data_train,cancer_data_test = train_test_split(cancer_data,test_size=0.2,random_state=42)#训练集
cancer_target_train,cancer_target_test = train_test_split(cancer_target,test_size=0.2,random_state=42)#测试集
#%%# 建⽴ BP 模型, 采⽤Adam优化器,relu⾮线性映射函数
BP = MLPClassifier(solver='adam',activation = 'relu',max_iter = 1000,alpha = 1e-3,hidden_layer_sizes = (64,32, 32),random_state = 1) # 进⾏模型训练
BP.fit(cancer_data_train, cancer_target_train)
#%% 进⾏模型预测
predict_train_labels = BP.predict(cancer_data_train)
# 可视化真实数据
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=20, azim=20)
ax.scatter(cancer_data_train[:, 0], cancer_data_train[:, 1], cancer_data_train[:, 2], marker='o', c=cancer_target_train) plt.title('True Label Map')
plt.show()
# 可视化预测数据
fig = plt.figure()
ax = Axes3D(fig, rect=[0, 0, 1, 1], elev=20, azim=20)
ax.scatter(cancer_data_train[:, 0], cancer_data_train[:, 1], cancer_data_train[:, 2], marker='o', c=predict_train_labels) plt.title('Cancer with BP Model')
plt.show()
#%% 显⽰预测分数
print("预测准确率: {:.4f}".format(BP.score(cancer_data_test, cancer_target_test)))
# 进⾏测试集数据的类别预测
predict_test_labels = BP.predict(cancer_data_test)
print("测试集的真实标签:\n", cancer_target_test)
print("测试集的预测标签:\n", predict_test_labels)
#%% 进⾏预测结果指标统计统计每⼀类别的预测准确率、召回率、F1分数
print(classification_report(cancer_target_test, predict_test_labels))
#%% 计算混淆矩阵
confusion_mat = confusion_matrix(cancer_target_test, predict_test_labels)
# 打印混淆矩阵
print(confusion_mat)
# 将混淆矩阵以热⼒图的⽅式显⽰
sns.set()
figure, ax = plt.subplots()
# 画热⼒图
sns.heatmap(confusion_mat, cmap="YlGnBu_r", annot=True, ax=ax)
# 标题
ax.set_title('confusion matrix')
# x轴为预测类别
ax.set_xlabel('predict')
# y轴实际类别
ax.set_ylabel('true')
plt.show()
注:之前还做过基于BP神经⽹络的⼈⼝普查数据预测,有需要的猿友私信
三、Keys
BP神经⽹络的要点在于前向传播和误差反向传播,来对参数进⾏更新,使得损失最⼩化。
它是⼀个迭代算法,基本思想是:
先计算每⼀层的状态和激活值,直到最后⼀层(即信号是前向传播的);
计算每⼀层的误差,误差的计算过程是从最后⼀层向前推进的(反向传播);
更新参数(⽬标是误差变⼩)。迭代前⾯两个步骤,直到满⾜停⽌准则(⽐如相邻两次迭代的误差的差别很⼩)。
886~~~
到此这篇关于Python机器学习应⽤之基于BP神经⽹络的预测篇详解的⽂章就介绍到这了,更多相关Python BP神经⽹络内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

本文发布于:2024-09-23 00:32:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/1/361717.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:神经   预测   数据   训练   算法   类别
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议