深度学习-第R1周心脏病预测

news2024/11/25 7:15:30
  •  🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

我的环境:

  • 语言环境:Python3.10.7
  • 编译器:VScode
  • 深度学习环境:TensorFlow 2.13.0

一、前期工作: 

1、导入数据集

age: 1)年龄
sex:2)性别
cp: 3) 胸痛类型(4 values) aK同字
trestbps: 4) 静息血压
chol: 5) 血清胆甾醇(mg/dl
fbs: 6) 空腹血糖> 120 mg/dI
restecg: 7) 静息心电图结果(值0,1 ,2)
thalach: 8) 达到的最大心率
exang: 9) 运动诱发的心绞痛
oldpeak: 10) 相对于静止状态,运动弓|起的ST段压低
slope: 11) 运动峰值ST段的斜率
ca: 12) 荧光透视着色的主要血管数量(0-3)
thal: 13)0= 正常; 1 =固定缺陷; 2 =可逆转的缺陷
target: 14) 0 =心脏病发作的几率较小1 =心脏病发作的几率更大

实验代码:

import pandas as pd
import numpy as np

df = pd.read_csv("D:\R1heart.csv")
print (df)
print (df.isnull().sum())

df.isnull().sum()):检查是否有空值,并计算每个标签空值个数

 运行结果:

 

 2.数据集划分

实验代码:

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

X = df.iloc[:,:-1]
y = df.iloc[:,-1]

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.1, random_state = 1) 
print (X_train.shape, y_train.shape)

1. sklearn.preprocessing.StandardScaler:
   这个库是用于数据预处理中的特征缩放工具。在许多机器学习算法中,特征的尺度(scale)可能会对模型的性能产生影响。一些算法(如支持向量机、K近邻等)对于特征的尺度比较敏感,如果特征的尺度差异较大,可能会导致算法收敛速度慢或者模型表现不佳。

   StandardScaler 可以对数据集中的每个特征进行标准化处理,使得每个特征的均值为 0,标准差为 1。具体来说,对于每个特征,它会执行以下操作:
   从每个特征中减去平均值(均值为0)
   除以标准差,使得特征的值符合标准正态分布

   这样处理后,所有特征的尺度都是相同的,有助于提高某些算法的性能和收敛速度。

2. sklearn.model_selection.train_test_split:
   这个库用于将数据集划分为训练集和测试集,以便在机器学习模型的开发和评估中使用。

   在机器学习中,为了能够对模型进行准确的评估和测试,需要将原始数据集划分为两部分:
   训练集(Training Set):用于训练模型
   测试集(Test Set):用于评估模型的性能

   train_test_split 函数的作用就是根据指定的划分比例,将原始数据集划分为训练集和测试集。通常情况下,数据集的大部分(比如 80% - 90%)用于训练,剩余的部分用于测试。这样划分可以确保在训练和测试时使用不同的数据,避免模型过拟合训练数据。
   X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
`train_test_split` 将数据集 X 和标签 y 按照 80%-20% 的比例划分为训练集和测试集。其中,`test_size` 参数指定了测试集所占的比例,`random_state` 参数用于设置随机种子,保证结果的可重复性。

3.X = df.iloc[:, :-1]:

这行代码使用 iloc 属性从 DataFrame df 中选择了所有行和除最后一列之外的所有列。iloc 是 Pandas 库中用于通过行和列的索引选择数据的属性。其中 ‘:' 表示选择所有行,':-1' 表示选择除了最后一列之外的所有列。

运行结果:

 3.标准化

实验代码:

sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

X_train = X_train.reshape(X_train.shape[0],X_train.shape[1],1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1],1)
  1. sc = StandardScaler(): 这行代码创建了一个 StandardScaler 的实例对象 sc,用于对特征进行标准化处理。

  2. X_train = sc.fit_transform(X_train): 将训练集 X_train 中的特征数据进行标准化处理。fit_transform 方法会在训练集上进行标准化,并且在同一时间计算出训练集上的均值和标准差。然后,使用这些均值和标准差对训练集进行标准化处理,使得训练集的特征符合标准正态分布。

  3. X_test = sc.transform(X_test):将测试集 X_test 中的特征数据使用之前计算得到的训练集的均值和标准差进行标准化处理。这里使用的是 transform 方法,它会使用已经计算得到的均值和标准差来对测试集进行标准化,确保测试集的特征也符合与训练集相同的标准正态分布。

  4. X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1): 这行代码对训练集 X_train 进行了维度调整。有些机器学习模型,尤其是深度学习模型,可能对输入的维度有特定要求。在这里,将 X_train 的维度从原本的 (样本数量, 特征数量) 调整为 (样本数量, 特征数量, 1)。这样的维度调整通常用于一维卷积神经网络 (1D Convolutional Neural Network) 模型中,其中 1 表示每个特征现在具有 1 个维度。

  5. X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1): 这行代码对测试集 X_test 进行了与训练集相同的维度调整,以保持输入维度的一致性。

二、构建RNN模型:

实验代码:

import tensorflow
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM,SimpleRNN


model = Sequential()
model.add(SimpleRNN(200,input_shape=(13,1),activation = 'relu'))
model.add(Dense(100, activation = 'relu'))
model.add(Dense(1,activation = 'sigmoid'))
model.summary()

model.add(SimpleRNN(200,input_shape=(13,1),activation = 'relu')) 代码中 input_shape=(13,1)的输入过程为:

输入1: [样本1的特征1]
         [样本2的特征1]
         [样本3的特征1]
         ...
         [样本13的特征1]

输入2: [样本14的特征1]
         [样本15的特征1]
         [样本16的特征1]
         ...
         [样本26的特征1]

输入3: [样本27的特征1]
         [样本28的特征1]
         [样本29的特征1]
         ...
         [样本39的特征1]


直至270*13个特征全部输入完毕后输入过程结束

整个训练过程流程

训练数据 (train_data, train_labels)

   ↓
   
前向传播
   ↓
   
输入层 (Input Layer)        SimpleRNN层      Dense层        Dense层
(输入数据的形状为 (13,1))   (200个神经元)   (100个神经元)   (1个神经元)
   ↓                        ↓               ↓             ↓
   ──────────────▶ ─────────────▶ ───────────▶ ──────────▶
   
   ↓                        ↓               ↓             ↓
   ↘ (包含权重)          ↘ (包含权重)     ↘ (包含权重)   ↘ (包含权重)
   
计算损失
   ↓
   
反向传播
   ↓
   
优化器更新权重
   ↓
   
循环以上过程 (多次Epoch)
 

运行结果:

三、编译 

opt = tf.keras.optimizers.Adam(learning_rate = 1e-4)
model.compile(loss = 'binary_crossentropy',
              optimizer = opt,
              metrics = "accuracy")

1. opt = tf.keras.optimizers.Adam(learning_rate = 1e-4):
Adam 是一种常用的梯度下降优化算法,它在深度学习中广泛使用。learning_rate = 1e-4 是指定的学习率,用于控制参数更新的步长,即每次迭代中参数更新的幅度。

2. model.compile(loss = 'binary_crossentropy', optimizer = opt, metrics = "accuracy"):
   为训练过程指定损失函数、优化器和评估指标。

   loss = 'binary_crossentropy:
     代码指定了损失函数,该模型使用二分类问题的交叉熵(Cross Entropy)作为损失函数。在二分类问题中,交叉熵是常见的损失函数之一,用于度量模型输出与实际标签之间的差异。

   optimizer = opt:
   代码指定了优化器,将之前创建的 Adam 优化器 `opt` 赋值给了模型的优化器。模型在训练过程中将使用 Adam 优化器来自动调整参数以最小化损失函数。

   metrics = "accuracy":
     代码指定了评估指标,模型在训练过程中将计算并输出准确率(Accuracy)作为评估指标。准确率是衡量模型分类性能的常用指标,它表示模型在预测时正确分类的样本比例。

 四、模型训练

实验代码:

epochs = 100
history = model.fit(X_train,y_train,
                    epochs = epochs,
                    batch_size = 128,
                    validation_data = (X_test,y_test),
                    verbose = 1)

batch_size=128: 这个参数表示在每个迭代(epoch)中,将训练数据划分为大小为 128 的小批次。每个小批次会包含 128 个样本(数据点)和对应的标签(目标变量)。

小批量梯度下降是梯度下降算法的一种改进版本。传统的梯度下降算法在每次迭代中使用所有训练数据来更新模型的参数,这样的算法被称为批量梯度下降(Batch Gradient Descent)。但是,当数据集非常大时,批量梯度下降的计算代价会很高,而且每次迭代只能进行一次参数更新。

小批量梯度下降通过将数据分成多个小批次,每个小批次包含部分训练数据,从而实现更高效的参数更新。在每次迭代中,模型将对每个小批次的样本计算损失函数并求取梯度,然后将这些梯度的平均值用于更新模型的参数。这样的做法使得每个迭代可以进行多次参数更新,从而更快地收敛到最优解。

batch_size 的选择

通常需要根据具体的问题和硬件资源进行权衡。较小的 batch_size 可能会导致模型更新不稳定,但可以更快地收敛。较大的 batch_size 可能会更稳定,但可能需要更多的内存和计算资源。常见的 batch_size 大小通常是 32、64、128、256 等。

validation_data=(X_test, y_test) :是用于在每个 epoch 结束后评估模型在测试集上的性能。它用于监控模型的泛化能力,即模型在未见过的测试数据上的表现。在训练过程中,模型使用训练集数据进行参数更新,而测试集数据仅用于评估模型性能,不会参与参数更新。

评估性能主要包括以下指标:

1. 损失函数(Loss)
   损失函数是模型在训练数据上的表现,它衡量模型输出与真实标签之间的差异。在这里,使用的损失函数是二分类问题的交叉熵(binary cross-entropy)。在训练过程中,模型会尝试最小化损失函数,使得模型预测尽可能接近真实标签。

2. 准确率(Accuracy)
   准确率是模型在测试数据上的表现,它表示模型预测正确的样本比例。准确率是分类任务中最常用的评估指标之一。

3. 其它指标
   除了损失函数和准确率,还可以使用其它一些指标来评估模型性能,具体根据任务的要求而定。例如,对于多分类问题,还可以使用精确率(Precision)、召回率(Recall)、F1 分数等指标来衡量模型的表现。

在每个 epoch 结束后,模型会根据测试集数据计算损失函数和评估指标,并输出这些指标的值。通过观察这些指标的变化,可以了解模型在训练过程中的性能变化,是否出现过拟合或欠拟合等问题。当模型的性能在测试集上表现稳定且令人满意时,可以停止训练,得到一个较好的泛化模型。

运行结果:

需要注意的是input_shape=(13, 1)batch_size=128 之间没有直接联系,它们分别用于不同的目的

 五、模型评估

实验代码:

#模型评估
import matplotlib.pyplot as plt

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

epochs_range = range(epochs)

plt.figure(figsize=(14,4))
plt.subplot(1,2,1)

plt.plot(epochs_range, loss, label = 'Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
 
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

 运行结果:

完整代码

import tensorflow as tf
import pandas as pd
import numpy as np

df = pd.read_csv("D:\R1heart.csv")

from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

X = df.iloc[:,:-1]
y = df.iloc[:,-1]

#划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.1, random_state = 1) 

#标准化处理
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

X_train = X_train.reshape(X_train.shape[0],X_train.shape[1],1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1],1)

import tensorflow
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM,SimpleRNN


#model = Sequential()
#model.add(SimpleRNN(200,input_shape=(13,1),activation = 'relu'))
#model.add(Dense(100, activation = 'relu'))
#model.add(Dense(1,activation = 'sigmoid'))
 
model = Sequential()
model.add(SimpleRNN(128, input_shape= (13,1),return_sequences=True,activation='relu'))
model.add(SimpleRNN(64,return_sequences=True, activation='relu'))
model.add(SimpleRNN(32, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.summary()

opt = tf.keras.optimizers.Adam(learning_rate = 1e-4)
model.compile(loss = 'binary_crossentropy',
              optimizer = opt,
              metrics = "accuracy")

epochs = 100
history = model.fit(X_train,y_train,
                    epochs = epochs,
                    batch_size = 128,
                    validation_data = (X_test,y_test),
                    verbose = 1)

#模型评估
import matplotlib.pyplot as plt

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

epochs_range = range(epochs)

plt.figure(figsize=(14,4))
plt.subplot(1,2,1)

plt.plot(epochs_range, loss, label = 'Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
 
plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

#准确率评估
scores = model.evaluate(X_test, y_test, verbose=0)
print("%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/782710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

语义通信中基于深度双Q网络的多维资源联合分配算法

目录 论文简介系统模型多维资源联合分配模型多维资源联合分配算法 论文简介 作者 林润韬 郭彩丽 陈九九 王彦君发表期刊or会议 《移动通信》发表时间 2023.4 系统模型 场景中的边缘服务器部署在路边单元上,每个路边单元具有一定的无线覆盖区域,服务器将…

安装mmocr

安装mmocr 一、安装mmdetection 在安装前,如果已经安装过mmcv,先卸载掉,否则不同版本会导致ModuleNotFoundError报错! 1、先安装对应版本的pytorch(本次cuda10.2,pytorch1.7) 2、安装对应版本的…

TableGPT: Towards Unifying Tables, Nature Language and Commands into One GPT

论文标题:TableGPT: Towards Unifying Tables, Nature Language and Commands into One GPT 论文地址:https://github.com/ZJU-M3/TableGPT-techreport/blob/main/TableGPT_tech_report.pdf 发表机构:浙江大学 发表时间:2023 本文…

搭建基于Nginx+Keepalived的高可用web集群并实现监控告警

目录 搭建相关服务器DNS服务器配置WEB服务器配置配置静态IP编译安装nginx 负载均衡器配置lb1lb2高可用配置 NFS服务器配置配置静态IP安装软件包新建共享目录web服务器挂载 监控服务器配置安装node-exporter编写prometheus.yml安装alertmanager和钉钉插件获取机器人webhook编写a…

ubuntu22.04上如何创建有privilege权限,有固定自定义IP的空容器

需求背景: 我想用docker来隔离自己的主机环境,来创建一个隔离的空白全新的开发环境,并且使之有固定的IP,在里面可以自由更新下载各种编译依赖,具有privileged权限的容器,以下是操作实现的具体步骤 查看do…

系统架构设计师-软件架构设计(2)

目录 一、基于架构的软件开发方法(ABSD) 1、架构需求 1.1 需求获取 1.2 标识构件 1.3 架构需求评审 2、架构设计 2.1 提出架构模型 2.2 映射构件 2.3 分析构件的相互作用 2.4 产生架构 2.5 设计评审 3、架构文档化 4、架构复审 5、架构实现 5.1 分析与…

JVM运行时区域——对象创建内存分配过程

新创建的对象,都存放在伊甸园区域,当垃圾回收时,将伊甸园区域的垃圾数据销毁,然后将存活的对象转移到幸存者0区域,之后创建的新的对象还是存放在伊甸园区域,等到再次垃圾回收后,将伊甸园区域和幸…

《Docker资源限制和调度策略:性能优化与资源管理,打造高效稳定的容器环境》

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Python 集合 pop()函数使用详解,pop随机删除原理

「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 pop函数使用详解 1、随机删除并不完全随机1.1、纯数字1.2、纯字符1.3、混合情况 …

【软件测试】Git 详细实战-远程分支(超细总结)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 远程分支 远程引…

2023云曦期中复现

目录 SIGNIN 新猫和老鼠 baby_sql SIGNIN 签到抓包 新猫和老鼠 看到反序列化 来分析一下 <?php //flag is in flag.php highlight_file(__FILE__); error_reporting(0);class mouse { public $v;public function __toString(){echo "Good. You caught the mouse:&…

使用Selenium与Chrome DevTools交互

目录 为什么我们应该自动化Chrome开发工具&#xff1f; 如何打开Chrome DevTools 元素 控制台 源代码 网络 应用 安全 性能 如何使用Selenium使用chrome Devtools实现自动化&#xff1f; 收集性能指标 使用Selenium DevTols捕获控制台日志 模拟位置 网络节流 捕…

论文精读之Transformer论文

目录 Abstract Conclusion Introduction Background Training Abstract 在一个序列转录模型中&#xff0c;在编码器与译码器之间使用一个“注意力机制”的东西&#xff0c;做了两个机器翻译的实验&#xff0c;效果较其他模型效果更好。 Conclusion Transformer是第一个用于…

全志F1C200S嵌入式驱动开发(调整cpu频率和dram频率)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 f1c200s默认的cpu频率是408M,默认的dram频率是156M。这两个数值,坦白说,都算不上特别高的频率。因为我们的晶振是24M输入,所以408/24=17,相当于整个cpu的频率只是晶振倍频了17…

vue引入自定义字体并使用

结构 font.scss引入字体 charset "UTF-8";font-face{font-family: "caoshu";src: url("caoshu.ttf");font-weight: normal;font-style: normal; }font-face{font-family: "Xingkai";src: url("XingKai.ttf");font-weight: …

leetcode 144.二叉树的前序遍历 145.二叉树的后序遍历 94.二叉树的中序遍历

⭐️ 题目描述 &#x1f31f; 链接1&#xff1a;leetcode 144.二叉树的前序遍历 &#x1f31f; 链接2&#xff1a;leetcode 145.二叉树的后序遍历 &#x1f31f; 链接3&#xff1a;leetcode 94.二叉树的中序遍历 思路&#xff1a; leetcode的遍历和普通的遍历还略有一些不同&a…

【Spring篇】初识 Spring IoC 与 DI

目录 一. Spring 是什么 ? 二. 何为 IoC ? 三. 如何理解 Spring IoC ? 四. IoC 与 DI 五 . 总结 一. Spring 是什么 ? 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&#xff0c;有着活跃⽽ 庞⼤…

SAP 执行失败JOB及dump日志监控

背景 系统使用时间较长&#xff0c;存在大量的后台作业&#xff0c;用户量较大&#xff0c;需要及时监控后台作业状况及系统dump情况&#xff0c;以便及时处理。 功能 1. 查询屏幕填写日期前n秒状态为错误及未知的后台作业 2. 查询屏幕填写日期前n秒系统中的dump记录--客制化程…

有关动态内存管理的笔试题

题目一&#xff1a; void GetMemory(char* p) {p (char*)malloc(100); }void test(void) {char* str NULL;GetMemory(str);strcpy(str, "hello world");printf(str); }int main() {test();return 0; } 请问上述代码输出结果是什么&#xff0c;理由是什么&#xf…

leetcode 90. 子集 II

2023.7.23 这道题是上一题子集的升级版&#xff0c;即数组nums包含了相同的元素&#xff0c;这时候需要对集合之间进行去重&#xff0c;可以参考这一题组合总和II的去重方法。 下面直接上代码&#xff1a; class Solution { public:vector<vector<int>> ans;vecto…