深度学习笔记26_糖尿病预测模型优化探索

  •  🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊 | 接辅导、项目定制

一、我的环境

1.语言环境:Python 3.9

2.编译器:Pycharm

3.深度学习环境:TensorFlow 2.10.0

二、GPU设置

       若使用的是cpu则可忽略

import tensorflow as tf
gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0] #如果有多个GPU,仅使用第0个GPU
    tf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用
    tf.config.set_visible_devices([gpu0],"GPU")

、数据导入

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import torch
import torch.nn as nn
from sklearn.model_selection import train_test_split

import warnings

plt.rcParams['savefig.dpi'] = 100  # 图片像素
plt.rcParams['figure.dpi'] = 100  # 分辨率
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
warnings.filterwarnings("ignore")
# 设置硬件设备,如果有GPU则使用,没有则使用cpu
DataFrame = pd.read_excel('data/dia.xlsx')

print(DataFrame.head())
         卡号  性别  年龄  高密度脂蛋白胆固醇  低密度脂蛋白胆固醇  ...   尿素氮     尿酸  肌酐  体重检查结果  是否糖尿病
0  18054421   0  38       1.25       2.99  ...  4.99  243.3  50       1      0
1  18054422   0  31       1.15       1.99  ...  4.72  391.0  47       1      0
2  18054423   0  27       1.29       2.21  ...  5.87  325.7  51       1      0
3  18054424   0  33       0.93       2.01  ...  2.40  203.2  40       2      0
4  18054425   0  36       1.17       2.83  ...  4.09  236.8  43       0      0

[5 rows x 16 columns]

、数据检查

# 查看数据是否有缺失值
print('数据缺失值---------------------------------')
print(DataFrame.isnull().sum())
数据缺失值---------------------------------
卡号            0
性别            0
年龄            0
高密度脂蛋白胆固醇     0
低密度脂蛋白胆固醇     0
极低密度脂蛋白胆固醇    0
甘油三酯          0
总胆固醇          0
脉搏            0
舒张压           0
高血压史          0
尿素氮           0
尿酸            0
肌酐            0
体重检查结果        0
是否糖尿病         0
dtype: int64
# 查看数据是否有重复值
print('数据重复值---------------------------------')
print('数据集的重复值为:'f'{DataFrame.duplicated().sum()}')
#数据重复值---------------------------------
#数据集的重复值为:0

五、数据分布分析

feature_map = {
    '年龄': '年龄',
    '高密度脂蛋白胆固醇': '高密度脂蛋白胆固醇',
    '低密度脂蛋白胆固醇': '低密度脂蛋白胆固醇',
    '极低密度脂蛋白胆固醇': '极低密度脂蛋白胆固醇',
    '甘油三酯': '甘油三酯',
    '总胆固醇': '总胆固醇',
    '脉搏': '脉搏',
    '舒张压': '舒张压',
    '高血压史': '高血压史',
    '尿素氮': '尿素氮',
    '尿酸': '尿酸',
    '肌酐': '肌酐',
    '体重检查结果': '体重检查结果'
}
plt.rcParams.update({
    'axes.titlesize': 8,  # 图标题
    'axes.labelsize': 8,  # 轴标签
    'xtick.labelsize': 8,  # x轴刻度标签
    'ytick.labelsize': 8,  # y轴刻度标签
    'legend.fontsize': 8,  # 图例字体
    'figure.titlesize': 8  # 图形标题
})
plt.figure(figsize=(15, 10))
for i, (col, col_name) in enumerate(feature_map.items(), 1):
    plt.subplot(3, 5, i)
    sns.boxplot(x=DataFrame['是否糖尿病'], y=DataFrame[col])
    plt.title(f'{col_name}的箱线图', fontsize=8)
    plt.ylabel('数值', fontsize=8)
    # plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()

 相关性分析

import plotly.express as px

# 删除列“卡号”
DataFrame.drop(columns=['卡号'], inplace=True)
# 计算各列之间的相关系数
df_corr = DataFrame.corr()


# 相关矩阵生成函数
def corr_generate(df):
    fig = px.imshow(df, text_auto=True, aspect="auto", color_continuous_scale='RdBu_r')
    fig.show()


corr_generate(df_corr)

六、LSTM模型

数据集构建

from sklearn.preprocessing import StandardScaler
# '高密度脂蛋白胆固醇'字段与糖尿病负相关,故而在 X 中去掉该字段
X = DataFrame.drop(['是否糖尿病', '高密度脂蛋白胆固醇'], axis=1)
y = DataFrame['是否糖尿病']
sc_X = StandardScaler()
X = sc_X.fit_transform(X)
X = torch.tensor(np.array(X), dtype=torch.float32)
y = torch.tensor(np.array(y), dtype=torch.int64)
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.2, random_state=1)
print(train_X.shape, train_y.shape)
输出
(torch.Size([804,13]),torch.Size([804]))
from torch.utils.data import TensorDataset, DataLoader

train_dl = DataLoader(TensorDataset(train_X, train_y),
                      batch_size=64,
                      shuffle=False)
test_dl = DataLoader(TensorDataset(test_X, test_y),
                     batch_size=64,
                     shuffle=False)

定义模型

class model_lstm(nn.Module):
    def __init__(self):
        super(model_lstm, self).__init__()

        self.lstm0 = nn.LSTM(input_size=13, hidden_size=200,
                             num_layers=1, batch_first=True)

        self.lstm1 = nn.LSTM(input_size=200, hidden_size=200,
                             num_layers=1, batch_first=True)
        self.fc0 = nn.Linear(200, 2)

    def forward(self, x):
        out, hidden1 = self.lstm0(x)

        out, _ = self.lstm1(out, hidden1)
        out = self.fc0(out)
        return out


model = model_lstm().to(device)
print(model)
输出
model_lstm(
  (lstm0): LSTM(13, 200, batch_first=True)
  (lstm1): LSTM(200, 200, batch_first=True)
  (fc0): Linear(in_features=200, out_features=2, bias=True)
)

七、训练模型

训练集

# 训练循环
def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)  # 训练集的大小
    num_batches = len(dataloader)  # 批次数目, (size/batch_size,向上取整)
    train_loss, train_acc = 0, 0  # 初始化训练损失和正确率

    for X, y in dataloader:  # 获取图片及其标签
        X, y = X.to(device), y.to(device)

        # 计算预测误差
        pred = model(X)  # 网络输出
        loss = loss_fn(pred, y)  # 计算网络输出和真实值之间的差距,targets为真实值

        # 反向传播
        optimizer.zero_grad()  # grad属性归零
        loss.backward()  # 反向传播
        optimizer.step()  # 每一步自动更新

        # 记录acc与loss
        train_acc += (pred.argmax(1) == y).type(torch.float).sum().item()
        train_loss += loss.item()

    train_acc /= size
    train_loss /= num_batches
    return train_acc, train_loss

测试集 

def test(dataloader, model, loss_fn):
    size = len(dataloader.dataset)  # 测试集的大小
    num_batches = len(dataloader)  # 批次数目, (size/batch_size,向上取
    test_loss, test_acc = 0, 0

    # 当不进行训练时,停止梯度更新,节省计算内存消耗
    with torch.no_grad():
        for imgs, target in dataloader:
            imgs, target = imgs.to(device), target.to(device)

            # 计算loss
            target_pred = model(imgs)
            loss = loss_fn(target_pred, target)

            test_loss += loss.item()
            test_acc += (target_pred.argmax(1) == target).type(torch.float).sum().item()
    test_acc /= size
    test_loss /= num_batches
    return test_acc, test_loss

 模型训练

loss_fn = nn.CrossEntropyLoss()  # 创建损失函数
learn_rate = 1e-4  # 学习率
opt = torch.optim.Adam(model.parameters(), lr=learn_rate)
epochs = 30
train_loss = []
train_acc = []
test_loss = []
test_acc = []
for epoch in range(epochs):
    model.train()
    epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, opt)
    model.eval()
    epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)
    train_acc.append(epoch_train_acc)
    train_loss.append(epoch_train_loss)
    test_acc.append(epoch_test_acc)
    test_loss.append(epoch_test_loss)

    # 获取当前的学习率
    lr = opt.state_dict()['param_groups'][0]['lr']

    template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f},Lr:{:.2E}')
    print(
        template.format(epoch + 1, epoch_train_acc * 100, epoch_train_loss, epoch_test_acc * 100, epoch_test_loss, lr))

    print("=" * 20, 'Done', "=" * 20)
Epoch: 1, Train_acc:56.2%, Train_loss:0.690, Test_acc:53.0%, Test_loss:0.694,Lr:1.00E-04
==================== Done ====================
Epoch: 2, Train_acc:56.2%, Train_loss:0.685, Test_acc:53.0%, Test_loss:0.694,Lr:1.00E-04
==================== Done ====================
Epoch: 3, Train_acc:56.2%, Train_loss:0.681, Test_acc:53.0%, Test_loss:0.693,Lr:1.00E-04
==================== Done ====================
Epoch: 4, Train_acc:56.2%, Train_loss:0.677, Test_acc:53.0%, Test_loss:0.692,Lr:1.00E-04
==================== Done ====================
Epoch: 5, Train_acc:56.6%, Train_loss:0.673, Test_acc:53.0%, Test_loss:0.690,Lr:1.00E-04
==================== Done ====================
Epoch: 6, Train_acc:57.1%, Train_loss:0.668, Test_acc:54.0%, Test_loss:0.685,Lr:1.00E-04
==================== Done ====================
Epoch: 7, Train_acc:58.1%, Train_loss:0.662, Test_acc:55.4%, Test_loss:0.680,Lr:1.00E-04
==================== Done ====================
Epoch: 8, Train_acc:60.2%, Train_loss:0.655, Test_acc:57.9%, Test_loss:0.672,Lr:1.00E-04
==================== Done ====================
Epoch: 9, Train_acc:62.7%, Train_loss:0.645, Test_acc:62.9%, Test_loss:0.662,Lr:1.00E-04
==================== Done ====================
Epoch:10, Train_acc:65.4%, Train_loss:0.631, Test_acc:62.9%, Test_loss:0.649,Lr:1.00E-04
==================== Done ====================
Epoch:11, Train_acc:69.2%, Train_loss:0.609, Test_acc:65.3%, Test_loss:0.626,Lr:1.00E-04
==================== Done ====================
Epoch:12, Train_acc:72.0%, Train_loss:0.563, Test_acc:70.8%, Test_loss:0.586,Lr:1.00E-04
==================== Done ====================
Epoch:13, Train_acc:73.5%, Train_loss:0.519, Test_acc:71.8%, Test_loss:0.562,Lr:1.00E-04
==================== Done ====================
Epoch:14, Train_acc:74.9%, Train_loss:0.493, Test_acc:72.3%, Test_loss:0.549,Lr:1.00E-04
==================== Done ====================
Epoch:15, Train_acc:75.5%, Train_loss:0.479, Test_acc:72.8%, Test_loss:0.540,Lr:1.00E-04
==================== Done ====================
Epoch:16, Train_acc:76.1%, Train_loss:0.468, Test_acc:72.8%, Test_loss:0.533,Lr:1.00E-04
==================== Done ====================
Epoch:17, Train_acc:76.7%, Train_loss:0.459, Test_acc:72.8%, Test_loss:0.527,Lr:1.00E-04
==================== Done ====================
Epoch:18, Train_acc:76.6%, Train_loss:0.452, Test_acc:72.3%, Test_loss:0.522,Lr:1.00E-04
==================== Done ====================
Epoch:19, Train_acc:77.1%, Train_loss:0.446, Test_acc:72.8%, Test_loss:0.518,Lr:1.00E-04
==================== Done ====================
Epoch:20, Train_acc:77.9%, Train_loss:0.441, Test_acc:72.8%, Test_loss:0.515,Lr:1.00E-04
==================== Done ====================
Epoch:21, Train_acc:78.0%, Train_loss:0.436, Test_acc:72.3%, Test_loss:0.513,Lr:1.00E-04
==================== Done ====================
Epoch:22, Train_acc:78.7%, Train_loss:0.432, Test_acc:72.8%, Test_loss:0.511,Lr:1.00E-04
==================== Done ====================
Epoch:23, Train_acc:79.0%, Train_loss:0.428, Test_acc:73.3%, Test_loss:0.510,Lr:1.00E-04
==================== Done ====================
Epoch:24, Train_acc:79.2%, Train_loss:0.424, Test_acc:73.3%, Test_loss:0.508,Lr:1.00E-04
==================== Done ====================
Epoch:25, Train_acc:79.6%, Train_loss:0.421, Test_acc:73.3%, Test_loss:0.508,Lr:1.00E-04
==================== Done ====================
Epoch:26, Train_acc:80.0%, Train_loss:0.418, Test_acc:72.8%, Test_loss:0.507,Lr:1.00E-04
==================== Done ====================
Epoch:27, Train_acc:79.7%, Train_loss:0.415, Test_acc:72.8%, Test_loss:0.507,Lr:1.00E-04
==================== Done ====================
Epoch:28, Train_acc:79.9%, Train_loss:0.412, Test_acc:73.3%, Test_loss:0.506,Lr:1.00E-04
==================== Done ====================
Epoch:29, Train_acc:79.9%, Train_loss:0.409, Test_acc:72.3%, Test_loss:0.506,Lr:1.00E-04
==================== Done ====================
Epoch:30, Train_acc:79.7%, Train_loss:0.406, Test_acc:71.8%, Test_loss:0.506,Lr:1.00E-04
==================== Done ====================

八、模型评估

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
plt.rcParams['figure.dpi'] = 100  # 分辨率
epochs_range = range(epochs)
plt.figure(figsize=(12, 3))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, train_acc, label='Training Accuracy')
plt.plot(epochs_range, test_acc, label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, label='Training Loss')
plt.plot(epochs_range, test_loss, label='Test Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

九、总结

这周学习LSTM实现糖尿病探索与预测:

优势

长距离依赖学习能力:LSTM 能够有效地解决传统 RNN 中的梯度消失问题,从而可以学习到序列数据中长距离的依赖关系。这使得它在处理诸如长文本、长时间序列等数据时表现出色,能够捕捉到数据中深层次的语义、趋势和模式。
灵活性与适应性:LSTM 可以应用于多种不同类型的序列数据处理任务,无论是自然语言、时间序列还是语音信号等。它的门控机制使得模型能够根据不同的数据特点和任务需求,灵活地调整细胞状态中的信息保留与更新,具有较强的适应性。

局限

计算复杂度较高:由于 LSTM 的细胞结构和门控机制相对复杂,相比于简单的神经网络模型,其计算复杂度较高。在处理大规模数据或构建深度 LSTM 网络时,训练时间和计算资源的需求可能会成为瓶颈,需要强大的计算硬件支持。

可能存在过拟合:在数据量较小或模型参数过多的情况下,LSTM 模型也可能出现过拟合现象,即模型过于适应训练数据,而对新的数据泛化能力较差。需要采用一些正则化技术,如 L1/L2 正则化、Dropout 等,来缓解过拟合问题。

尝试减少参数,拟合效果会更好,剔除掉相关性较弱的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习的unfold操作

unfold(展开)是深度学习框架中常见的数据操作。与我们熟悉的卷积类似,unfold也是使用一个特定大小的窗口和步长自左至右、自上至下滑动,不同的是,卷积是滑动后与核求乘积(所以取名为卷积)&#…

Redis篇-2--原理篇1--I/O多路复用机制(5种I/O模型,I/O多路复用)

I/O多路复用机制: Redis 是通过I/O多路复用机制来管理大量客户端连接。这使得redis可以实现通过单线程来处理多个客户端连接的请求,避免了为每个客户端创建独立的线程,从而减少了上下文切换的开销,提高了系统的并发性和性能。 理解…

计算机毕设-基于springboot的某学院兼职平台的设计与实现(附源码+lw+ppt+开题报告)

博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…

Promise详解-1:初识Promise

最近在回顾ES6的知识,想整理下跟Promise相关的内容。我准备整一个Promise解读的系列,看看能深入到什么程度吧。由浅入深,先认识下Promise。 痛苦的回忆:回调地狱 假如现在让你维护一个“古老”的项目,缺少脚手架的加…

【蓝桥杯备战】Day 1

1.基础题目 LCR 018.验证回文串 给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。 本题中,将空字符串定义为有效的 回文串 。 示例 1: 输入: s "A man, a plan, a canal: Panama…

让文案生成更具灵活性/chatGPT新功能canvas画布编辑

​ ​ OpenAI最近在2024年12月发布了canvas画布编辑功能,这是一项用途广泛的创新工具,专为需要高效创作文案的用户设计。 无论是职场人士、学生还是创作者,这项功能都能帮助快速生成、优化和编辑文案,提升效率的同时提高内容质量…

使用秘钥登录服务器

在我们测试或生产环境中,为了服务器安全性,有时可能需要以 SSH 密钥的方式登录服务器,接下来,将演示如何通过 SSH 私钥的方式来远程服务器。 一、远程服务器生成密钥对 1、首先在目标远程服务器下生成 SSH 密钥对 ssh-keygen然…

linux-16 关于shell(十五)date,clock,hwclock,man,时间管理,命令帮助

想显示一下当前系统上的时间该怎么显示?有一个命令叫做date,来看date命令,如下图, 第一个星期几对吧?然后是月日小时分钟秒,最后一个是年对吧?CST指的是它的时间格式,我这个可以先姑…

番外篇 | Hyper-YOLO:超图计算与YOLO架构相结合成为目标检测新的SOTA !

前言:Hello大家好,我是小哥谈。Hyper-YOLO,该方法融合了超图计算以捕捉视觉特征之间复杂的高阶关联。传统的YOLO模型虽然功能强大,但其颈部设计存在局限性,限制了跨层特征的融合以及高阶特征关系的利用。Hyper-YOLO在骨干和颈部的联合增强下,成为一个突破性的架构。在COC…

在 Ubuntu 中 make 是否是系统自带的?怎么样查看Linux系统中是否有make?

make 命令 并不是所有 Ubuntu 系统都默认安装的,但它通常是开发工具链的一部分,许多开发者会在安装系统后配置它。make 是一个非常重要的构建工具,用于自动化编译和构建过程,特别是在编译软件或内核时。 make 的来源 make 是一个…

ubuntu+ros新手笔记(一)

系统ubuntu20.04 ros noetic humble(源码安装失败&#xff0c;放弃源码安装了) 1. ubuntu安装vcs 拉取autoware源码的时候需要用到命令 vcs import src < autoware.ai.repos但是ubuntu默认没有安装vcs工具&#xff08;zsh: command not found: vcs&#xff09; 应使用以…

蛋白研究新热点:AI 全方位剖析 DHA 与 Ferrostatin - 1 的作用密码

胰腺癌是一种非常棘手的癌症&#xff0c;传统化疗药物往往对它收效甚微&#xff0c;很难提高患者的生存率。不过&#xff0c;研究人员发现了一种可能的新治疗方向 —— 利用双氢青蒿素&#xff08;DHA&#xff09;诱导癌细胞发生铁死亡。 下面将以Dihydroartemisinin induces …

大数据挖掘建模平台案例分享

大数据挖掘建模平台是由泰迪自主研发&#xff0c;面向企业级用户的大数据挖掘建模平台。平台采用可视化操作方式&#xff0c;通过丰富内置算法&#xff0c;帮助用户快速、一站式地进行数据分析及挖掘建模&#xff0c;可应用于处理海量数据、高复杂性的数据挖掘任务&#xff0c;…

docker安装、升级、以及sudo dockerd --debug查看启动失败的问题

1、docker安装包tar下载地址 Index of linux/static/stable/x86_64/ 2、下载tgz文件并解压 tar -zxvf docker-24.0.8.tgz 解压后docker文件夹下位docker相关文件 3、将老版本docker相关文件&#xff0c;备份 将 /usr/bin/docker下docker相关的文件&#xff0c;mv到备份目录…

远程桌面防护的几种方式及优缺点分析

远程桌面登录是管理服务器最主要的方式&#xff0c;于是很多不法分子打起了远程桌面的歪心思。他们采用暴力破解或撞库的方式破解系统密码&#xff0c;悄悄潜入服务器而管理员不自知。 同时远程桌面服务中的远程代码执行漏洞也严重威胁着服务器的安全&#xff0c;攻击者可以利…

【电子通识】电流倒灌为什么需要注意?

电流倒灌是一个很常见的问题,以“IO电流倒灌”为关键词在百度上进行搜索,可以找到很多相关案例。 电流倒灌问题在5V电平的单片机时代几乎不会发生,主要是因为5V单片的IO耐压值高,单片机内部结构对IO保护设计很好。 到了3.3V单片机时代,这类问题有一定的偶发性,但…

Linux系统编程——进程间通信

目录 一、前言 二、进程间通信的目的 三、进程通信的方法 四、管道 通信 1、进程如何通信 2、管道概念 3、匿名管道 1&#xff09;理解 2&#xff09;匿名管道的创建 3&#xff09;匿名管道用途——控制进程 4&#xff09;匿名管道对多个进程的控制 5&#xff09;总…

【中工开发者】鸿蒙商城实战项目(启动页和引导页)

创建一个空项目 先创建一个新的项目选择第一个&#xff0c;然后点击finish 接下来为项目写一个名字&#xff0c;然后点击finish。 把index页面的代码改成下面代码块的代码&#xff0c;就能产生下面的效果 Entry Component struct Index {build() {Column(){Blank()Column(){…

Hadoop其一,介绍本地模式,伪分布模式和全分布搭建

目录 一、Hadoop介绍 二、HDFS的本地模式 三、伪分布模式 四、Hdfs中的shell命令 五、全分布搭建 六、使用Java代码操作HDFS 1、环境准备 2、单元测试&#xff08;Junit&#xff09;​编辑 一、Hadoop介绍 Hadoop 分为三部分 &#xff1a; Common、HDFS 、Yarn、MapRe…

【Linux-ubuntu通过USB传输程序点亮LED灯】

Linux-ubuntu通过USB传输程序点亮LED灯 一,初始化GPIO配置1.使能时钟2.其他寄存器配置 二&#xff0c;程序编译三&#xff0c;USB传输程序 一,初始化GPIO配置 1.使能时钟 使能就是一个控制信号&#xff0c;用于决定时钟信号是否能够有效的传递或者被使用&#xff0c;就像一个…