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

深度学习笔记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 模型在糖尿病预测任务上取得了较好的效果,准确率显著提升,但仍有改进空间。
  • 后续方向:进一步优化模型结构,如添加注意力机制,或尝试其他深度学习模型,可以提高模型的泛化能力和预测准确性。

相关文章:

  • 【大数据】java API 进行集群间distCP 报错unresolvedAddressException
  • AWS EC2使用SSM会话管理器连接
  • HarmonyOS 6 + 盘古大模型5.5
  • day30 导包
  • GDI绘制
  • Unity3d中使用Mirror进行自定义消息通信
  • 水晶杂谈3:生物群系大家族,噪声函数塑地形
  • 基于k2-icefall实践Matcha-TTS中文模型训练
  • 解决Docker网络与虚拟机桥接冲突的实践指南
  • VC++ 服务守护qt用户级UI进程
  • QEMU学习之路(10)— RISCV64 virt 使用Ubuntu启动
  • c++set和pair的使用
  • 小白的进阶之路系列之十六----人工智能从初步到精通pytorch综合运用的讲解第九部分
  • docker mysql启动后时间慢8小时问题
  • 24. 开发者常用工具:抓包,弱网模拟,元素检查
  • Tkinter快速入门指南
  • DataWhale-零基础络网爬虫技术(二er数据的解析与提取)
  • 粗浅理解:为什么左旋右旋的组合反而收旋转矩阵影响
  • ajax中get和post的区别
  • 5.基于神经网络的时间序列预测
  • 南宁手机企业网站定制公司/怎么联系百度客服人工服务
  • 徐汇区b2b"b2c行业门户网站开发_电子商业门户网站建设/友情链接交换的意义是什么
  • 造作网站模版/问卷调查网站
  • 中企动力常州分公司/seo关键词优化是什么意思
  • 济南高端网站建设/seo推广和百度推广的区别
  • 只做传统嫁衣网站/郑州聚商网络科技有限公司