基于飞桨的简单神经网络搭建—以心脏病的预测为例


本文以心脏病预测为例,介绍基于飞桨搭建简单神经网络的过程。先说明项目背景与数据集,含年龄、性别等特征及是否发病标签。接着处理数据,包括检查缺失值、统计量、相关性,进行独热编码和归一化。随后搭建神经网络,设置超参数,经6轮训练,训练集正确率0.845,测试集0.84,最后展示预测结果,为深度学习入门者提供参考。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

基于飞桨的简单神经网络搭建-以心脏病的预测为例

一、项目背景介绍

随着对机器学习的学习,对更进一步的深度学习产生了浓厚的兴趣,并尝试使用了一些开发套件进行深度学习的尝试,但由于使用的是现成的套件,对神经网络的原理以及过程并不能详细的了解。为了更进一步的学习,笔者尝试手动搭建一个简单的神经网络并训练使用。

二、数据集介绍

本文以心脏病发展分析和预测数据集为例,搭建神经网络对心脏病的发作进行预测。

  • 数据集来源:数据集链接;
  • 特征含义:
    • age 年龄
    • sex 性别 1=male,0=female
    • cp 胸痛类型(4种) 值1:典型心绞痛,值2:非典型心绞痛,值3:非心绞痛,值4:无症状
    • trbps 静息血压(毫米汞柱)
    • chol 通过 BMI 传感器获取的以 mg/dl 为单位的胆甾醇
    • fbs (空腹血糖 > 120 mg/dl)(1 = 真;0 = 假)
    • restecg 静息心电图结果 值0:正常 值1:ST-T 波异常(T 波倒置和/或 ST 段抬高或压低 > 0.05 mV)
      值2:根据埃斯蒂斯标准显示可能或明确的左心室肥厚
    • thalach 达到的最大心率
    • exng 运动诱发的心绞痛(1=yes;0=no)
    • oldpeak 相对于休息的运动引起的ST值(ST值与心电图上的位置有关)
    • slp 运动高峰ST段的坡度 Value 1: upsloping向上倾斜, Value 2: flat持平, Value 3: downsloping向下倾斜
    • caa 主血管数量 (0-3)
    • thall 一种叫做地中海贫血的血液疾病(3 =正常;6 =固定缺陷;7 =可逆转缺陷)
    • output 是否会发作(0=no,1=yes)'''
  • 数据集展示
In [1]
#解压数据集至work文件夹!unzip '/home/aistudio/data/data99207/心脏病发作分析和预测数据集.zip' -d work/ -yimport pandas as pd
data = pd.read_csv('./work/heart.csv')#数据展现data.head()
       
Archive:  /home/aistudio/data/data99207/心脏病发作分析和预测数据集.zip
caution: filename not matched:  -y
       
   age  sex  cp  trtbps  chol  fbs  restecg  thalachh  exng  oldpeak  slp  \
0   63    1   3     145   233    1        0       150     0      2.3    0   
1   37    1   2     130   250    0        1       187     0      3.5    0   
2   41    0   1     130   204    0        0       172     0      1.4    2   
3   56    1   1     120   236    0        1       178     0      0.8    2   
4   57    0   0     120   354    0        1       163     1      0.6    2   

   caa  thall  output  
0    0      1       1  
1    0      2       1  
2    0      2       1  
3    0      2       1  
4    0      2       1
               

三、模型介绍

本文旨在学习手写搭建神经网络的完整过程,所以仅使用了一个简单的神经网络,当需要使用更为复杂的网络时,仅需对网络的定义进行调整。
这里简单介绍一下神经网络的原理,神经网络由众多神经元构成。它可以接受来自其他神经元的输入或者是外部的数据,然后计算一个输出。神经元的计算过程如图所示: 当众多神经元排列连接,构成了神经网络中的层,层与层相互连接构成了最为简单的神经网络,如图所示: 当然只有前向的传播计算是不够的,各个神经元之间需要用损失函数来计算训练结果与实际的误差,再通过优化器(即各种梯度下降的方法)来更新权值,这就是反向传播的过程。这个过程会不断的重复,直到误差低于我们设定好的要求。这时一整个神经网络的计算就完成了。 下图展示了一个MLP的反向传播的过程:        

四、 数据处理

在训练各种模型时,对数据的处理与探索是非常重要的一环,直接影响的模型的训练速度和精度,所以笔者单独列出对数据的处理过程进行展示

  • 数据集缺失情况检查

我们实际应用的数据常常会碰到缺失与异常的情况,所以对数据集进行缺失与异常的检查并进一步处理是必要的。
本文由于数据是完整的,并没有展示对缺失值与异常值处理的过程

In [2]
import numpy as npimport matplotlib.pyplot as pltimport seaborn as snsimport paddle#数据缺失值检查print(data.isnull().sum())
       
age         0
sex         0
cp          0
trtbps      0
chol        0
fbs         0
restecg     0
thalachh    0
exng        0
oldpeak     0
slp         0
caa         0
thall       0
output      0
dtype: int64
       
  • 数据统计量概览

在完成数据的完整性检查后,我们还需要对数据有一个初步的了解,本文只选择了数据的统计量进行简单的查看。

In [3]
#数据统计量展现data.describe()
       
              age         sex          cp      trtbps        chol         fbs  \
count  303.000000  303.000000  303.000000  303.000000  303.000000  303.000000   
mean    54.366337    0.683168    0.966997  131.623762  246.264026    0.148515   
std      9.082101    0.466011    1.032052   17.538143   51.830751    0.356198   
min     29.000000    0.000000    0.000000   94.000000  126.000000    0.000000   
25%     47.500000    0.000000    0.000000  120.000000  211.000000    0.000000   
50%     55.000000    1.000000    1.000000  130.000000  240.000000    0.000000   
75%     61.000000    1.000000    2.000000  140.000000  274.500000    0.000000   
max     77.000000    1.000000    3.000000  200.000000  564.000000    1.000000   

          restecg    thalachh        exng     oldpeak         slp         caa  \
count  303.000000  303.000000  303.000000  303.000000  303.000000  303.000000   
mean     0.528053  149.646865    0.326733    1.039604    1.399340    0.729373   
std      0.525860   22.905161    0.469794    1.161075    0.616226    1.022606   
min      0.000000   71.000000    0.000000    0.000000    0.000000    0.000000   
25%      0.000000  133.500000    0.000000    0.000000    1.000000    0.000000   
50%      1.000000  153.000000    0.000000    0.800000    1.000000    0.000000   
75%      1.000000  166.000000    1.000000    1.600000    2.000000    1.000000   
max      2.000000  202.000000    1.000000    6.200000    2.000000    4.000000   

            thall      output  
count  303.000000  303.000000  
mean     2.313531    0.544554  
std      0.612277    0.498835  
min      0.000000    0.000000  
25%      2.000000    0.000000  
50%      2.000000    1.000000  
75%      3.000000    1.000000  
max      3.000000    1.000000
               
  • 数据相关性检查
    对数据进行相关性检查,能让我们初步了解数据集各个特征间的关系,这会对我们选择神经网络的结构有所帮助
In [4]
#相关性热图,以初步查看自变量对结果的影响程度plt.figure(figsize=(10,10))
sns.heatmap(data.corr(),annot=True,fmt='.1f')
plt.show()
       
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  if isinstance(obj, collections.Iterator):
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2366: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working
  return list(data) if isinstance(data, collections.MappingView) else data
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:101: DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead
  ret = np.asscalar(ex)
       
               
  • 数据结构处理

在对数据有进一步的了解之后,我们需要对数据的结构进行处理,以方便其对神经网络进行输入,并且需要根据实际的需求,对数据进行增广、压缩、增强等操作,目的是为了模型更为高效。

In [5]
#由于cp,restecg,slp,thall是非顺序型的多分类变量,需进行进行独热编码a = pd.get_dummies(data['cp'], prefix = "cp")
b = pd.get_dummies(data['restecg'], prefix = "restecg")
c = pd.get_dummies(data['slp'], prefix = "slope")
d = pd.get_dummies(data['thall'], prefix = "thall")
data = pd.concat([data,a,b,c,d], axis = 1)
data = data.drop(columns = ['cp','restecg','slp', 'thall'])
data.head()
       
   age  sex  trtbps  chol  fbs  thalachh  exng  oldpeak  caa  output  ...  \
0   63    1     145   233    1       150     0      2.3    0       1  ...   
1   37    1     130   250    0       187     0      3.5    0       1  ...   
2   41    0     130   204    0       172     0      1.4    0       1  ...   
3   56    1     120   236    0       178     0      0.8    0       1  ...   
4   57    0     120   354    0       163     1      0.6    0       1  ...   

   restecg_0  restecg_1  restecg_2  slope_0  slope_1  slope_2  thall_0  \
0          1          0          0        1        0        0        0   
1          0          1          0        1        0        0        0   
2          1          0          0        0        0        1        0   
3          0          1          0        0        0        1        0   
4          0          1          0        0        0        1        0   

   thall_1  thall_2  thall_3  
0        1        0        0  
1        0        1        0  
2        0        1        0  
3        0        1        0  
4        0        1        0  

[5 rows x 24 columns]
                In [6]
#最后对数据集进行划分,并归一化,完成数据预处理from sklearn.model_selection import train_test_splitfrom sklearn.preprocessing import StandardScaler
X = data.drop(['output'], axis = 1)#删除['outout']特征y = data.output.values
X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=6)  #随机种子6,划分训练集与测试集standardScaler = StandardScaler()
standardScaler.fit(X_train)
X_train = standardScaler.transform(X_train)
X_test = standardScaler.transform(X_test)#对训练集与测试集归一化,使模型能更好的收敛y_train=y_train.reshape(y_train.shape[0],1)
y_test=y_test.reshape(y_test.shape[0],1)#由于在计算模型的评价指标时(x,)的数据会报错,所以需要进行转换
   

五、模型训练

In [7]
#定义网络class Net(paddle.nn.Layer):
    def __init__(self):
        super(Net,self).__init__()
        self.fc1 = paddle.nn.Linear(in_features=23,out_features=100)
        self.fc2 = paddle.nn.Linear(in_features=100,out_features=100)
        self.fc3 = paddle.nn.Linear(in_features=100,out_features=2)#输出向量的维度需要根据分类结果进行选择


    def forward(self,x):
        x=self.fc1(x)
        x=self.fc2(x)
        x=self.fc3(x)        return x
net=Net()
       
W0223 00:07:17.249727  4104 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 10.1, Runtime API Version: 10.1
W0223 00:07:17.254323  4104 device_context.cc:465] device: 0, cuDNN Version: 7.6.
        In [26]
#超参数设置# 设置迭代次数epochs = 6#损失函数:交叉熵loss_func = paddle.nn.CrossEntropyLoss()#优化器opt = paddle.optimizer.Adam(learning_rate=0.1,parameters=net.parameters())
    In [29]
#训练程序for epoch in range(epochs):
    all_acc = 0
    for i in range(X_train.shape[0]):
        x = paddle.to_tensor([X_train[i]],dtype="float32")
        y = paddle.to_tensor([y_train[i]],dtype="int64")
        infer_y = net(x)
        loss = loss_func(infer_y,y)
        loss.backward()
        acc= paddle.metric.accuracy(infer_y,y)
        all_acc=all_acc+acc.numpy()
        opt.step()
        opt.clear_gradients#清除梯度
        #print("epoch: {}, loss is: {},acc is:{}".format(epoch, loss.numpy(),acc.numpy()))由于输出过长,这里注释掉了
    print("第{}次正确率为:{}".format(epoch+1,all_acc/i))
       
第1次正确率为:[0.7300885]
第2次正确率为:[0.8053097]
第3次正确率为:[0.8362832]
第4次正确率为:[0.7920354]
第5次正确率为:[0.71681416]
第6次正确率为:[0.84513277]
       

六、模型评估

In [30]
#测试集数据运行net.eval()#模型转换为测试模式all_acc = 0for i in range(X_test.shape[0]):
        x = paddle.to_tensor([X_test[i]],dtype="float32")
        y = paddle.to_tensor([y_test[i]],dtype="int64")
        infer_y = net(x)    # 计算损失与精度
        loss = loss_func(infer_y, y)
        acc = paddle.metric.accuracy(infer_y, y)
        all_acc = all_acc+acc.numpy()    # 打印信息
        #print("loss is: {}, acc is: {}".format(loss.numpy(), acc.numpy()))print("测试集正确率:{}".format(all_acc/i))
       
测试集正确率:[0.84]
        In [20]
#预测结果展示net.eval()
x = paddle.to_tensor([X_train[1]],dtype="float32")
y = paddle.to_tensor([y_train[1]],dtype="int64")
infer_y = net(x)# 计算损失与精度loss = loss_func(infer_y, y)# 打印信息print("X_train[1] is :{}\n y_train[1] is :{}\n predict is {}".format(X_train[1],y_train[1],np.argmax(infer_y.numpy()[0])))
       
X_train[1] is :[-1.48235364 -1.49761715 -1.12562388  0.45148196 -0.382707    0.96548999
  1.46723474 -0.89784884 -0.6964023  -0.92771533 -0.44128998  1.54533482
 -0.29346959  0.99560437 -0.96110812 -0.13392991 -0.27537136 -0.93596638
  1.07791686 -0.0942809  -0.23624977  0.91139737 -0.8030738 ]
 y_train[1] is :[1]
 predict is 1
       

可以看到,模型在训练集上的准确率为0.845,在测试集上的准确率在0.84,并且我们抽取了一个数据进行预测,进行更为直观的展示,模型的预测结果与实际相符。

七、总结

本文对一个项目使用神经网络建模并预测使用的过程进行了一个较为完整的展示,包括了数据探索,数据处理,模型训练,模型评价等,并且在使用神经网络时采取了使用基础api进行组网的方式,希望能对刚了解深度学习并想要尝试的同学有所启发

八、个人介绍

浙江工业大学之江学院 理学院 数据科学与大数据技术专业 2019级 本科生 汪哲瑜

我在AI Studio上获得青铜等级,点亮1个徽章,来互关呀~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/761690        


# ai  # 排列  # red  # igs  # 数据结构  # https  # python  # 我在  # 使用了  # 如图所示  # 的是  # 数据统计  # 地中海  # 套件  # 数据处理  # 为例  # 率为  # 传感器 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化91478 】 【 技术知识72672 】 【 云计算0 】 【 GEO优化84317 】 【 优选文章0 】 【 营销推广36048 】 【 网络运营41350 】 【 案例网站102563 】 【 AI智能45237


相关推荐: 2025年冷邮件营销:技巧、工具和成功案例分享  雷小兔ai智能写作如何优化语句_雷小兔ai智能写作语句润色技巧【攻略】  AI任务管理器终极评测:找到最适合你的效率神器  AI视频生成器:免费工具,图像转视频和文字转视频  AI猴子视频制作终极指南:从入门到网红,轻松上手!  智谱AI智能绘图怎么用_智谱AI智能绘图使用方法详细指南【教程】  揭秘颜值真相:社交实验的背后,你是几分?  超频爱好者盛宴:液氮超频Xeon 28核处理器  教你用AI帮你生成一份详细的搬家清单,告别手忙脚乱  如何用文心一言写简历 快速生成高含金量求职简历方法  豆包AI怎么关闭消息推送_通知与提醒管理设置教程  5分钟搞定求职信:利用AI工具大幅提升求职效率的实操技巧  lovemo官网网页版入口 lovemo官网登录入口  百度输入法怎么去除ai模块 百度输入法纯净版安装教程  怎么用ai做证件照换底色 AI一键抠图与背景色替换【方法】  Xcode 26 Beta 新功能:集成 ChatGPT 代码助手全面测评  智谱AI创意设计怎么用_智谱AI创意设计使用方法详细指南【教程】  利用ChatGPT掌控健康:AI赋能的医疗新时代  Wrike:AI赋能的项目管理平台,提升电商效率与团队协作  都灵裹尸布之谜:AI揭示耶稣基督的真实面貌?  AI助手高效获取谷歌评论:提升本地商家曝光率的终极指南  秀米AI智能排版怎样生成节日专题模板_秀米AI智能排版节日模板调用【技巧】  2025年生成式AI发展蓝图:娱乐、医疗及创意产业的革新  深度解析Coldplay酷玩乐队《Viva la Vida》的音乐内涵  图像分割技术详解:定义、类型、技术与应用  5分钟教你用AI生成短视频分镜脚本,小白也能拍大片  AI绘图软件怎么用_AI绘图软件使用方法详细指南【教程】  AI Excel公式生成工具有哪些_一键生成函数公式的AI工具推荐  百度ai助手怎么取消 百度ai助手取消显示设置  lovemo官网直达链接 lovemo网页版在线  深度学习姿态估计:技术、应用与未来趋势全解析  Elon Musk会解决X平台上的机器人问题吗?塔罗牌预测  AI赋能项目管理:5个实用技巧提升效率  即梦ai怎么生成游戏角色原画_即梦ai游戏角色生成风格与装备细节【教程】  Feelin网页版在线使用 Feelin官网登录入口  AI合同提取指南:利用智能实现高效采购和节省成本  探索弦乐器世界:从吉他到卡曼切,乐器全解析  ChatGPT 4.0赋能室内设计:20+实用技巧提升工作效率  智行ai抢票如何查看抢票进度_智行ai抢票进度查询与状态解读【实操】  通义千问怎么找新功能入口_通义千问新功能查找【攻略】  AI Agent:颠覆传统工作模式的关键力量  AI电子书创作革命:AieBookSuite如何颠覆出版行业  去哪旅行ai抢票助手怎样提升抢票速度_去哪旅行ai抢票助手加速包与多通道使用【技巧】  在线图像分割:可信模糊聚类算法详解与应用  DeepSeek写合同怎么用_DeepSeek写合同使用方法详细指南【教程】  goPDF:AI驱动的PDF文档处理全方位指南,提升工作效率  2025年必备:顶级AI工具,赋能您的日常工作和业务流程  如何利用AI优化简历关键词?轻松通过ATS筛选系统  精明小鱼:儿童动画寓言故事及启示  E-LabVine:AI赋能的数字化学习平台,提升高中学业表现 

 2025-07-24

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

南京市珐之弘网络技术有限公司


南京市珐之弘网络技术有限公司

南京市珐之弘网络技术有限公司专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 87067657

 13565296790

 87067657@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.