机器学习算法(八):基于BP神经网络的预测

1.前言:算法简介和应用

1.1.算法简介

BP(Back Propagation)网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hide layer)和输出层(output layer)。在模拟过程中收集系统所产生的误差,通过误差反传,然后调整权值大小,通过该不断迭代更新,最后使得模型趋于整体最优化(这是一个循环,我们在训练神经网络的时候是要不断的去重复这个过程的)。

BP神经网络具有以下优点:

  1. 非线性映射能力:BP神经网络实质上实现了一个从输入到输出的映射功能,数学理论证明三层的神经网络就能够以任意精度逼近任何非线性连续函数。这使得其特别适合于求解内部机制复杂的问题,即BP神经网络具有较强的非线性映射能力。

  2. 自学习和自适应能力:BP神经网络在训练时,能够通过学习自动提取输入、输出数据间的“合理规则”,并自适应地将学习内容记忆于网络的权值中。即BP神经网络具有高度自学习和自适应的能力。

  3. 泛化能力:所谓泛化能力是指在设计模式分类器时,即要考虑网络在保证对所需分类对象进行正确分类,还要关心网络在经过训练后,能否对未见过的模式或有噪声污染的模式,进行正确的分类。也即BP神经网络具有将学习成果应用于新知识的能力。

BP神经网络具有以下缺点点:

  1. 局部极小化问题:从数学角度看,传统的 BP神经网络为一种局部搜索的优化方法,它要解决的是一个复杂非线性化问题,网络的权值是通过沿局部改善的方向逐渐进行调整的,这样会使算法陷入局部极值,权值收敛到局部极小点,从而导致网络训练失败。加上BP神经网络对初始网络权重非常敏感,以不同的权重初始化网络,其往往会收敛于不同的局部极小,这也是每次训练得到不同结果的根本原因。

  2. BP 神经网络算法的收敛速度慢:由于BP神经网络算法本质上为梯度下降法,它所要优化的目标函数是非常复杂的,因此,必然会出现“锯齿形现象”,这使得BP算法低效;又由于优化的目标函数很复杂,它必然会在神经元输出接近0或1的情况下,出现一些平坦区,在这些区域内,权值误差改变很小,使训练过程几乎停顿;BP神经网络模型中,为了使网络执行BP算法,不能使用传统的一维搜索法求每次迭代的步长,而必须把步长的更新规则预先赋予网络,这种方法也会引起算法低效。以上种种,导致了BP神经网络算法收敛速度慢的现象。

  3. BP 神经网络结构选择不一:BP神经网络结构的选择至今尚无一种统一而完整的理论指导,一般只能由经验选定。网络结构选择过大,训练中效率不高,可能出现过拟合现象,造成网络性能低,容错性下降,若选择过小,则又会造成网络可能不收敛。而网络的结构直接影响网络的逼近能力及推广性质。因此,应用中如何选择合适的网络结构是一个重要的问题。

1.2.算法应用

BP反映了生物神经系统处理外界事物的基本过程,是在模拟人脑神经组织的基础上发展起来的计算系统,是由大量处理单元通过广泛互联而构成的网络体系,它具有生物神经系统的基本特征,在一定程度上反映了人脑功能的若干反映,是对生物系统的某种模拟,具有大规模并行、分布式处理、自组织、自学习等优点,被广泛应用于语音分析、图像识别、数字水印、计算机视觉等很多领域,取得了许多突出的成果。最近由于人工神经网络的快速发展,它已经成为模式识别的强有力的工具。神经网络的运用展开了新的领域,解决其它模式识别不能解决的问题,其分类功能特别适合于模式识别与分类的应用。

2.学习目标

  • 掌握BP算法基本原理
  • 掌握利用BP进行代码实战

3.代码流程

Part 1 Demo实践

  • Step1:库函数导入
  • Step2:模型训练
  • Step3:模型参数查看
  • Step4:数据和模型可视化
  • Step5:模型预测

Part 2 基于BP神经网络的乳腺癌分类实践

  • Step1:库函数导入
  • Step2:数据读取/载入
  • Step3:数据信息简单查看与可视化
  • Step4:利用BP神经网络在乳腺癌数据上进行训练和预测

4.代码实战

Part 1 Demo实践

  • Step1:库函数导入
# 基础数组运算库导入
import numpy as np
# 画图库导入
import matplotlib.pyplot as plt
# 导入三维显示工具
from mpl_toolkits.mplot3d import Axes3D
# 导入BP模型
from sklearn.neural_network import MLPClassifier
# 导入demo数据制作方法
from sklearn.datasets.samples_generator import make_classification
from sklearn.metrics import classification_report, confusion_matrix
import seaborn as sns
import warnings
from sklearn.exceptions import ConvergenceWarning
  • Step2:模型训练
# 制作五个类别的数据,每个类别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)
  • Step3:模型参数查看
# 查看 BP 模型的参数
print(BP)

MLPClassifier(activation=‘relu’, alpha=0.001, batch_size=‘auto’, beta_1=0.9,
beta_2=0.999, early_stopping=False, epsilon=1e-08,
hidden_layer_sizes=(32, 32), learning_rate=‘constant’,
learning_rate_init=0.001, max_fun=15000, max_iter=500,
momentum=0.9, n_iter_no_change=10, nesterovs_momentum=True,
power_t=0.5, random_state=1, shuffle=True, solver=‘sgd’,
tol=0.0001, validation_fraction=0.1, verbose=False,
warm_start=False)

  • Step4:数据和模型可视化
# 进行模型预测
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()

预测准确率: 0.9950
真实类别: [0 4 2 2 3 2 3 0 1 0]
预测类别: [0 4 2 2 3 2 3 0 1 0]
precision recall f1-score support
0 0.99 0.99 0.99 199
1 1.00 0.99 0.99 203
2 1.00 1.00 1.00 200
3 0.99 1.00 1.00 199
4 0.99 0.99 0.99 199
micro avg 0.99 0.99 0.99 1000
macro avg 1.00 1.00 1.00 1000
weighted avg 1.00 0.99 1.00 1000

  • Step5:模型预测
# 进行新的测试数据测试
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))

[[-1. 0.1 0.1]] 类别是: [4]
[[-1. 0.1 0.1]] 类别概率分别是: [[0.08392403 0.19140765 0.17623 0.16521955 0.38321877]]
[[ -1.2 10. -91. ]] 类别是: [1]
[[ -1.2 10. -91. ]] 类别概率分别是: [[4.22867161e-30 1.00000000e+00 9.48205308e-51 4.59510397e-57
7.15598948e-17]]
[[-12. -0.1 -0.1]] 类别是: [4]
[[-12. -0.1 -0.1]] 类别概率分别是: [[1.48613908e-06 6.02731928e-05 3.19466411e-05 3.15741660e-05
9.99874720e-01]]
[[100. -90.1 -9.1]] 类别是: [2]
[[100. -90.1 -9.1]] 类别概率分别是: [[6.15694474e-02 2.72634384e-66 9.38430553e-01 4.62929790e-66
1.06956308e-49]]

Part 2 基于BP神经网络的乳腺癌分类实践

  • Step1:库函数导入
# 导入乳腺癌数据集
from sklearn.datasets import load_breast_cancer
# 导入BP模型
from sklearn.neural_network import MLPClassifier
# 导入训练集分割方法
from sklearn.model_selection import train_test_split
# 导入预测指标计算函数和混淆矩阵计算函数
from sklearn.metrics import classification_report, confusion_matrix
# 导入绘图包
import seaborn as sns
import matplotlib
  • Step2:数据读取/载入
# 导入乳腺癌数据集
cancer = load_breast_cancer()
  • Step3:数据信息简单查看与可视化
# 查看数据集信息
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)#测试集

breast_cancer数据集的长度为: 6
breast_cancer数据集的类型为: <class ‘sklearn.utils.Bunch’>
cancer_data数据维度为: (569, 30)
cancer_target标签维度为: (569,)

  • Step4:利用BP在乳腺癌数据上进行训练和预测
# 建立 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)

MLPClassifier(activation=‘relu’, alpha=0.001, batch_size=‘auto’, beta_1=0.9,
beta_2=0.999, early_stopping=False, epsilon=1e-08,
hidden_layer_sizes=(64, 32, 32), learning_rate=‘constant’,
learning_rate_init=0.001, max_iter=1000, momentum=0.9,
n_iter_no_change=10, nesterovs_momentum=True, power_t=0.5,
random_state=1, shuffle=True, solver=‘adam’, tol=0.0001,
validation_fraction=0.1, verbose=False, warm_start=False)

# 进行模型预测
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)

预测准确率: 0.9474
测试集的真实标签:
[1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 0 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0
1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 0 1 1 0 0 1 1 1 0 0 1 1 0 0 1 0
1 1 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0
1 1 0]
测试集的预测标签:
[1 0 0 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1 1 1 1 0
1 0 1 1 0 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 0 1 1 1 0 0 1 1 1 0 0 1 1 0 0 1 1
1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 0 0 1 1 1 0 1 1 0
1 1 0]

# 进行预测结果指标统计 统计每一类别的预测准确率、召回率、F1分数
print(classification_report(cancer_target_test, predict_test_labels))

precision recall f1-score support
0 1.00 0.86 0.92 43
1 0.92 1.00 0.96 71
micro avg 0.95 0.95 0.95 114
macro avg 0.96 0.93 0.94 114
weighted avg 0.95 0.95 0.95 114

# 计算混淆矩阵
confusion_mat = confusion_matrix(cancer_target_test, predict_test_labels)
# 打混淆矩阵
print(confusion_mat)

[[37 6]
[ 0 71]]

# 将混淆矩阵以热力图的防线显示
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()

5. 算法重要知识点

BP神经网络模型要点在于数据的前向传播和误差反向传播,来对参数进行更新,使得损失最小化。 误差反向传播算法简称反向传播算法(即BP算法)。使用反向传播算法的多层感知器又称为BP神经网络。BP算法是一个迭代算法,它的基本思想为:
(1)先计算每一层的状态和激活值,直到最后一层(即信号是前向传播的);
(2)计算每一层的误差,误差的计算过程是从最后一层向前推进的(这就是反向传播算法名字的由来);
(3)更新参数(目标是误差变小)。迭代前面两个步骤,直到满足停止准则(比如相邻两次迭代的误差的差别很小)。
在这个过程,函数的导数链式法则求导很重要,需要手动推导BP神经网络模型的梯度反向传播过程,熟练掌握链式法则进行求导,对参数进行更新。

机器学习算法(八):基于BP神经网络的预测(乳腺癌分类实践)相关推荐

  1. 机器学习应用篇(八)——基于BP神经网络的预测

    机器学习应用篇(八)--基于BP神经网络的预测 文章目录 机器学习应用篇(八)--基于BP神经网络的预测 一.Introduction 1 BP神经网络的优点 2 BP神经网络的缺点 二.实现过程 1 ...

  2. 量子遗传算法优化BP神经网络的预测和分类,多输入单输出,多输 入多输出

    量子遗传算法优化BP神经网络的预测和分类,多输入单输出,多输 入多输出 93499615192034876最爱matlab

  3. 机器学习之基于BP神经网络的预测

    BP神经网络具有以下优点: 1) 非线性映射能力:BP神经网络实质上实现了一个从输入到输出的映射功能,数学理论证明三层的神经网络就能够以任意精度逼近任何非线性连续函数.这使得其特别适合于求解内部机制复 ...

  4. 基于BP神经网络飞机颠簸预测

    背景介绍 飞机在飞行过程中遇到扰动气流或者受到方向.大小不同的气流冲击导致的左右摇晃.前后颠簸.上下抛掷以及局部震颤等想象统称为颠簸.中度以上颠簸会使飞机仪表指示失常,操纵困难:特别严重时会破坏飞机结 ...

  5. 基于BP神经网络实现气凝胶加气混凝土抗压强度预测(附代码)

    目录 前言 1. 背景 1.1 什么是加气混凝土 1.2 传统AAC抗压强度测试方法 1.3 为什么选择BP神经网络 2. MATLAB算法实现 2.1 训练集数据编辑 2.2 数据导入与整理 2.3 ...

  6. MATLAB实现基于BP神经网络的图像压缩

    神经网络建模 BP神经网络用于压缩的原理如下: BP网络至少包含一个隐含层,这里只采用一个隐含层,因此整体构成了一个三层的网络.把一组输入模式通过少量的隐含层单元映射到一组输出模式,并使输出模式尽可能 ...

  7. 基于粒子群优化BP神经网络的预测 采用PSO算法优化bp网络实现预测

    基于粒子群优化BP神经网络的预测 采用PSO算法优化bp网络实现预测,源码注释详细,matlab实现,直接运行即可. ID:72100632211160748韩雅涵122

  8. 【智能算法】基于双隐含层BP神经网络的预测

    目录 基于双隐含层BP神经网络的预测 基于双隐含层BP神经网络的预测 %% 该代码为基于双隐含层BP神经网络的预测 clc clear%% 训练数据预测数据提取及归一化 %下载输入输出数据 load ...

  9. gadecod matlab,【预测模型】基于遗传算法优化BP神经网络房价预测matlab源码

    一.简介 1 遗传算法概述 遗传算法(Genetic Algorithm,GA)是进化计算的一部分,是模拟达尔文的遗传选择和自然淘汰的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法 ...

  10. 基于bp神经网络的pid算法,神经网络pid控制器设计

    基于BP神经网络的PID控制器设计 参考一下刘金琨的<先进PID控制>这本书. 例子:被控对象yout(k)=a(k)yout(k-1)/(1+yout(k-1)^2)+u(k_1)其中a ...

最新文章

  1. python基础(迭代器,生成器,装饰器)
  2. 多返回值函数的编写方法
  3. Alpha冲刺随笔集
  4. WebRTC各种资料集合(WebRtc入门必看)
  5. packETH发包工具使用教程
  6. 前端学习(2185):tabberitem和路由结果
  7. websevice中runtime modeler error: Wrapper class com.ws.jaxws.Add is not found问题的解决办法
  8. Packet Tracer 思科模拟器入门教程 实验报告1
  9. 多传感器融合理论及其应用——2
  10. 矩阵的转置例题MATLAB,MATLAB特殊矩阵以及矩阵转置
  11. IE9下的怪异现象求解
  12. 香港中文大学推荐大学期间书单 87本你读过哪些?
  13. IT项目经理前景及优劣势分析
  14. 你玩的英雄在比赛中发挥如何呢?
  15. docker搭建searx_Searx – 尊重隐私的开源搜索引擎
  16. Linux--增加用户、添加用户组
  17. python3 scrapy爬虫_Python3 Scrapy爬虫框架(Scrapy/scrapy-redis)
  18. speedoffice(Excel)怎么做扇形图
  19. The Recent Ten Years
  20. matlab 实验四 数据处理与多项式计算

热门文章

  1. Android中字体文件位置
  2. visio2007序列号
  3. 如何将音乐上传到YouTube音乐
  4. windos读写ext3工具_Windows读写Ext3文件系统
  5. LabVIEW编程LabVIEW开发Memmert oven温箱例程与相关资料
  6. C# 对象与JSON串互相转换(转)
  7. 2021年PMP考试最新通关宝典
  8. 【JavaScript】去除空格
  9. Smart View for Office
  10. 学画画怎么画三点透视图