当前位置: 首页 > ops >正文

深度学习笔记27-LSTM实现糖尿病探索与预测(Pytorch)

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

 一、前期准备

1.数据导入

import torch.nn as nn
import torch.nn.functional as F
import torchvision,torch
import numpy as np
import pandas as pd
import seaborn as sns
from sklearn.model_selection import train_test_split
import matplotloib.pyplot as pltplt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
plt.rcParams['savefig.dpi']=500 #图片像素
plt.rcParams['axes.unicode_minus'] = False#用来正常显示负号
plt.rcParams['figure.dpi']= 500    #分辨率import warnings
warnings.filterwarnings("ignore")#忽略警告信息
DataFrame=pd.read_excel('../data/dia.xls')
DataFrame.head()
DataFrame.shape

 

2.数据检查

# 查看是否有缺失值
print(DataFrame.isnull().sum())
# 查看是否有重复值
print('数据的重复值为:'f'{DataFrame.duplicated().sum()}')

3.数据分布分析

feature_map={'年龄':'年龄','高密度脂蛋白胆固醇':'高密度脂蛋白胆固醇','低密度脂蛋白胆固醇':'低密度脂蛋白胆固醇','极低密度脂蛋白胆固醇':'极低密度脂蛋白胆固醇','甘油三酯':'甘油三酯','总胆固醇':'总胆固醇','脉搏':'脉搏','舒张压':'舒张压','高血压史':'高血压史','尿素氮':'尿素氮','尿酸':'尿酸','肌酐':'肌酐','体重检查结果':'体重检查结果'
}
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=14)plt.ylabel('数值',fontsize=12)plt.grid(axis='y',linestyle='--',alpha=0.7)plt.tight_layout()
plt.show()

​二、LSTM模型

1.数据集构建

from sklearn.preprocessing import StandardScaler
# '高密度脂蛋白胆固醇'字段与糖尿病负相关,故而在X中去掉该字段
X=DataFrame.drop(['卡号','是否糖尿病','高密度脂蛋白胆固醇'])
y=DataFrame.drop['是否糖尿病']# sc_X=StandarScaler()
# X=sc_X.fit_transform(X)
X=torch.tensor(np.array(X),dtype=torch.float32)
X=torch.tensor(np.array(y),dtype=torch.int64)train_X,test_X,train_y,testn_y=train_test_split(X,y,test_size=0.2,random_state=1)train_X.shape,train_y.shape

 

from torch.utils.data import TensorDataset,DataLoader
train_dl=DataLoader(TensorDataset(train_X,train_y),batch_size=64,shuffle=False)
test_dl=DataLoader(TensorDataset(tst_X,tset_y),batch_size=64,shuffle=False)

2.定义模型

class model_lstm(nn.Model):def __init__(self):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)slef.fc0=nn.Linear(200,2)def forward(self,x):out,hidden1=self.lstm0(x)out,_=self.lstm1(out,hidden1)out=self.fc0(out)return outmodel=model_lstm()
model

3.训练模型

3.1定义训练函数​

# 训练循环
def train(dataloader,model,loss_fn,optimizer):size=len(dataloader.dataset) #训练集大小num_batches=len(dataloader) #批次数目train_loss,train_acc=0,0 #初始化训练损失和正确率for X,y in dataloader: #获取图片及其标签#计算预测误差pred=model(X)  #网络输出loss=loss_fn(pred,y) #计算网络输出和真实值之间的差距,targets为真实值,计算二者差值即为损失# 反向传播optimizer.zero_grad()loss.backward()optimizer.step()#记录acc、losstrain_acc+=(pred.argmax(1)==y).type(torch.float).sum().item()train_loss+=loss.item()train_acc/=sizetrain_loss/=num_batchesreturn train_acc,train_loss

3.2定义测试函数 

def test(dataloader,model,loss_fn):size=len(dataloader.dataset) #训练集大小num_batches=len(dataloader) #批次数目train_loss,train_acc=0,0 #初始化训练损失和正确率#当不进行训练时,停止梯度更新,节省计算内存消耗with torch.no_grad():for imgs,target in dataloader: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/=sizetest_loss/=num_batchesreturn test_acc,test_loss

3.3训练模型 

loss_fn=nn.CrossEntropyLoss()
learn_rate=1e-4 #学习率
opt=torch.optim.Adam(model.parameters(),lr=learn_rate)
epochs=30train_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)

三、模型评估:Loss与Accuracy图

import matplotlib.pyplot as plt 
from datetime import datetime
#隐藏警告
import warnings
warnings.filterwarnings("ignore")#忽略警告信息
current_time=datetime.now()#获取当前时间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='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')
plt.xlabel(current_time)#打卡请带上时间戳,否则代码截图无效plt.subplot(1,2,2)
plt.plot(epochs_range, train_loss, label='Training Loss')
plt.plot(epochs_range, test_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()


四、总结

  • 模型表现:优化后的双向 LSTM 模型在糖尿病预测任务上取得了较好的效果,准确率显著提升,但仍有改进空间。
  • 后续方向:进一步优化模型结构,如添加注意力机制,或尝试其他深度学习模型,可以提高模型的泛化能力和预测准确性。
http://www.xdnf.cn/news/14525.html

相关文章:

  • 实验问题记录:PyTorch Tensor 也会出现 a = b 赋值后,修改 a 会影响 b 的情况
  • 解锁决策树:数据挖掘的智慧引擎
  • IT运维面试常问问题答案
  • QEMU学习之路(10)— RISCV64 virt 使用Ubuntu启动
  • 【C++】哈希表的实现(开放定址法)
  • 服务器手动安装并编译R环境库包:PROJ→RGDAL
  • C++ 11 智能指针 std::weak_ptr
  • 项目开发中途遇到困难的解决方案
  • RISC-V物联网关,支持鸿蒙,T-Thread实时系统
  • 关于Seata的一个小issue...
  • 【蓝牙】Qt4中向已配对的手机发送PDF文件
  • html和css实现文本打断换行、自动换行
  • linux下如何找到dump文件被生成到哪里了
  • 机构运动分析系统开发(Python实现)
  • Excel学习01
  • 257. 二叉树的所有路径(js)
  • DL00215-基于YOLOv11的太阳能电池红外异常检测含数据集
  • 【工具】Koishi|koishi跨平台聊天机器人开发平台使用方式(开发者方式)
  • 神经网络试题
  • 船舶动力与自动化系统:PROFIBUS转EtherCAT接口技术的创新应用
  • 【分布式】基于Redisson实现对分布式锁的注解式封装
  • 数据要素治理框架下图情学科的核心角色重塑
  • 猜数字小游戏微信流量主小程序开源
  • 【机械视觉】Halcon—【十五、一维码(条形码)和二维码识别】
  • 多模态大语言模型arxiv论文略读(128)
  • 计算机视觉课程总结
  • FPGA基础 -- Verilog 锁存器简介
  • Python 区块链与Web3开发指南
  • 实战指南:用DataHub管理Hive元数据
  • 断言(Assertion)中常用的正则表达式