乐趣区

关于算法:机器学习算法八基于BP神经网络的乳腺癌的分类预测

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

本我的项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc

1. 算法简介和利用

1.1 算法简介

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

BP 神经网络模型要点在于数据的前向流传和误差反向流传,来对参数进行更新,使得损失最小化。误差反向流传算法简称反向流传算法(即 BP 算法)。应用反向流传算法的多层感知器又称为 BP 神经网络。BP 算法是一个迭代算法,它的根本思维为:

(1)先计算每一层的状态和激活值,直到最初一层(即信号是前向流传的);
(2)计算每一层的误差,误差的计算过程是从最初一层向前推动的(这就是反向流传算法名字的由来);
(3)更新参数(指标是误差变小)。迭代后面两个步骤,直到满足进行准则(比方相邻两次迭代的误差的差异很小)。

在这个过程,函数的导数链式法则求导很重要,须要手动推导 BP 神经网络模型的梯度反向流传过程,熟练掌握链式法则进行求导,对参数进行更新。

1.2. 算法利用

BP 反映了生物神经系统解决外界事物的根本过程,是在模仿人脑神经组织的根底上倒退起来的计算零碎,是由大量处理单元通过宽泛互联而形成的网络体系,它具备生物神经系统的基本特征,在肯定水平上反映了人脑性能的若干反映,是对生物零碎的某种模仿,具备大规模并行、分布式解决、自组织、自学习等长处,被广泛应用于语音剖析、图像识别、数字水印、计算机视觉等很多畛域,获得了许多突出的成绩。最近因为人工神经网络的疾速倒退,它曾经成为模式识别的强有力的工具。神经网络的使用开展了新的畛域,解决其它模式识别不能解决的问题,其分类性能特地适宜于模式识别与分类的利用。

2. 相干流程

  • 把握 BP 算法基本原理
  • 把握利用 BP 进行代码实战
  • Part 1 Demo 实际

    • Step1: 库函数导入
    • Step2: 模型训练
    • Step3: 模型参数查看
    • Step4: 数据和模型可视化
    • Step5: 模型预测
  • Part 2 基于 BP 神经网络的乳腺癌分类实际

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

3. 代码实战

3.1 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 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')
Text(0.5,0.92,'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(alpha=0.001, hidden_layer_sizes=(32, 32), max_iter=500,
              random_state=1, solver='sgd')

  • 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.98      0.99      0.99       198
           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       200

    accuracy                           0.99      1000
   macro avg       0.99      1.00      0.99      1000
weighted avg       1.00      0.99      1.00      1000



/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/sklearn/utils/validation.py:72: FutureWarning: Pass labels=[0, 1, 2, 3] as keyword args. From version 1.0 (renaming of 0.25) passing these as positional arguments will result in an error
  "will result in an error", FutureWarning)



  • 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.08380116 0.1912275  0.17608601 0.16488309 0.38400224]]
[[-1.2  10.  -91.]] 类别是:  [1]
[[-1.2  10.  -91.]] 类别概率别离是:  [[3.37231505e-30 1.00000000e+00 4.24566351e-51 1.92771500e-57
  5.16916174e-17]]
[[-12.   -0.1  -0.1]] 类别是:  [4]
[[-12.   -0.1  -0.1]] 类别概率别离是:  [[1.42696980e-06 5.86057194e-05 2.99819240e-05 3.03896335e-05
  9.99879596e-01]]
[[100.  -90.1  -9.1]] 类别是:  [2]
[[100.  -90.1  -9.1]] 类别概率别离是:  [[2.45024178e-02 8.44965777e-67 9.75497582e-01 1.41511057e-66
  4.23516105e-50]]

3.2 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 数据集的长度为:7
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(alpha=0.001, hidden_layer_sizes=(64, 32, 32), max_iter=1000,
              random_state=1)



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

    accuracy                           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()

4. 总结

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 神经网络构造的抉择至今尚无一种对立而残缺的理论指导,个别只能由教训选定。网络结构抉择过大,训练中效率不高,可能呈现过拟合景象,造成网络性能低,容错性降落,若抉择过小,则又会造成网络可能不收敛。而网络的构造间接影响网络的迫近能力及推广性质。因而,利用中如何抉择适合的网络结构是一个重要的问题。

本我的项目链接:https://www.heywhale.com/home/column/64141d6b1c8c8b518ba97dcc

参考链接:https://tianchi.aliyun.com/course/278/3425


自己最近打算整合 ML、DRL、NLP 等相干畛域的体系化我的项目课程,不便入门同学疾速把握相干常识。申明:局部我的项目为网络经典我的项目不便大家疾速学习,后续会一直削减实战环节(较量、论文、事实利用等)。

  • 对于机器学习这块布局为:根底入门机器学习算法 —> 简略我的项目实战 —> 数据建模较量 —–> 相干事实中利用场景问题解决。一条路线帮忙大家学习,疾速实战。
  • 对于深度强化学习这块布局为:根底单智能算法教学(gym 环境为主)—-> 支流多智能算法教学(gym 环境为主)—-> 单智能多智能题实战(论文复现偏业务如:无人机优化调度、电力资源调度等我的项目利用)
  • 自然语言解决相干布局:除了单点算法技术外,次要围绕常识图谱构建进行:信息抽取相干技术(含智能标注)—> 常识交融 —-> 常识推理 —-> 图谱利用

上述对于你把握后的期许:

  1. 对于 ML,心愿你后续能够乱杀数学建模相干较量(加入就获奖保底,top 还是难的须要钻研)
  2. 能够理论解决事实中一些优化调度问题,而非停留在 gym 环境下的一些游戏 demo 玩玩。(更深层次可能须要本人钻研了,难度还是很大的)
  3. 把握可常识图谱全流程构建其中各个重要环节算法,蕴含图数据库相干常识。

这三块畛域耦合状况比拟大,后续会通过比方:搜寻举荐零碎整个我的项目进行耦合,各项算法都会耦合在其中。举例:常识图谱就会用到(图算法、NLP、ML 相干算法),搜寻举荐零碎(除了该畛域召回粗排精排重排混排等算法外,还有强化学习、常识图谱等耦合在其中)。饼画的有点大,前面缓缓实现。

退出移动版