ConCare: Personalized Clinical Feature Embedding via Capturing the Healthcare Context

《ConCare: Personalized Clinical Feature Embedding via Capturing the Healthcare Context》介绍了如何利用时间感知的多通道GRU和注意力机制处理不规则时序的EMR数据,预测患者入院死亡风险。模型考虑了时间间隔的影响和特征间的关系,提高了预测的准确性和可解释性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

论文阅读——《ConCare: Personalized Clinical Feature Embedding via Capturing the Healthcare Context》

【这是2020.12投给所里一篇论文速递,搬到CSDN上做个纪念嘿嘿】
本文要给大家分享的是北京大学Liantao Ma等人在AAAI2020发表的一篇关于利用患者的EMR数据预测患者入院死亡风险的论文。从电子病历(Electronic Medical Records, EMR)数据中预测患者的临床结果一直是医疗信息学中一个基础研究问题,在本文中,作者提出ConCare框架,该框架使用时间感知的多通道GRU对EMR数据进行建模,提取不规则时序数据对预测结果的影响。ConCare还引入了多头注意力机制,不仅能有效捕获EMR数据中动态特征与静态基线信息之间的相互依赖关系,还使模型具有很好的可解释性。

背景

EMR数据也就是我们常说的电子病历数据,由患者的一系列历史就诊序列构成。临床输出一般是对患者未来状态的一种预测,比如患者下一阶段的就诊序列,或者特定疾病或任务的风险。在本文中,临床输出为患者入院死亡风险。常用的方法是利用机器学习或者深度学习的手段,对患者的就诊序列进行建模,学习患者的临床就诊嵌入,并利用这个嵌入进行最后的预测任务。但是现有的方法还存在两大问题:
1、如何评估不规则的就诊时间间隔对预测结果影响。
在患者的EMR数据中,每次就诊之间的时间间隔并不是规律的,因为患者一般是身体不舒服了才会去医院进行就诊,所以可能这两次就诊之间只隔了几个星期,下一次就诊却隔了好几

### Concare 模型概述 Concare 是一种用于医疗场景下的药物推荐系统,其设计思路与 COGNet 类似。该模型同样依赖于编码器-解码器架构来处理病人的历史和当前健康数据[^1]。 具体来说,Concare 使用 LSTM 或 GRU 结构作为编码器部分,用来捕捉病人过往就医记录中的时间序列特征。对于每一个就诊事件,模型会提取其中包含的诊断信息、操作以及所使用的药品代码,并将其转换成向量形式存储起来。这些向量随后被送入到注意力机制层,在这里不同时间段内的状态会被赋予不同的权重,从而更好地反映最近一次问诊的重要性。最后经过全连接层映射得到最终预测结果——即可能适合给定病情的新处方列表。 下面是一个简化版 Python 实现的例子: ```python import torch from torch import nn, optim class Encoder(nn.Module): def __init__(self, input_size, hidden_size): super(Encoder, self).__init__() self.hidden_size = hidden_size self.embedding = nn.Embedding(input_size, hidden_size) self.gru = nn.GRU(hidden_size, hidden_size) def forward(self, inputs, hidden): embedded = self.embedding(inputs).view(1, 1, -1) output = embedded output, hidden = self.gru(output, hidden) return output, hidden class Decoder(nn.Module): def __init__(self, hidden_size, output_size): super(Decoder, self).__init__() self.hidden_size = hidden_size self.embedding = nn.Embedding(output_size, hidden_size) self.gru = nn.GRU(hidden_size * 2, hidden_size) self.out = nn.Linear(hidden_size, output_size) self.softmax = nn.LogSoftmax(dim=1) def forward(self, input, context, hidden): embedded = self.embedding(input).view(1, 1, -1) gru_input = torch.cat((embedded[0], context), dim=-1) output, hidden = self.gru(gru_input.unsqueeze(0), hidden) output = self.softmax(self.out(output[0])) return output, hidden def train(encoder, decoder, n_iters, learning_rate=.01): encoder_optimizer = optim.SGD(encoder.parameters(), lr=learning_rate) decoder_optimizer = optim.SGD(decoder.parameters(), lr=learning_rate) criterion = nn.NLLLoss() for iter in range(n_iters): # 假设我们已经有了训练样本对 (input_tensor, target_tensor) loss = 0 encoder_hidden = encoder.initHidden() encoder_outputs = [] for i in range(len(input_tensor)): encoder_output, encoder_hidden = encoder( input_tensor[i], encoder_hidden) encoder_outputs.append(encoder_output) decoder_input = torch.tensor([[SOS_TOKEN]]) decoder_hidden = encoder_hidden use_teacher_forcing = True if random.random() < teacher_forcing_ratio else False if use_teacher_forcing: # Teacher forcing: 将目标作为下一个输入 for di in range(target_length): decoder_output, decoder_hidden = decoder( decoder_input, encoder_outputs[-1].squeeze(0), decoder_hidden) loss += criterion(decoder_output, target_tensor[di]) decoder_input = target_tensor[di] else: # Without teacher forcing: 自己生成的结果作为下一步的输入 for di in range(target_length): decoder_output, decoder_hidden = decoder( decoder_input, encoder_outputs[-1].squeeze(0), decoder_hidden) topv, topi = decoder_output.topk(1) decoder_input = topi.squeeze().detach() loss += criterion(decoder_output, target_tensor[di]) loss.backward() encoder_optimizer.step() decoder_optimizer.step() encoder = Encoder(INPUT_SIZE, HIDDEN_SIZE) decoder = Decoder(HIDDEN_SIZE, OUTPUT_SIZE) train(encoder, decoder, N_ITERS) ``` 此段代码展示了如何构建一个简单的基于 PyTorch 的编码器-解码器框架来进行医学文本分析任务。需要注意的是这只是一个非常基础的概念验证版本;实际应用中还需要考虑更多细节如批量处理、更复杂的损失函数定义等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值