我们使用Transformer实现医疗时序数据分析的 重症监护室(ICU)患者监测: 分析心率、血压等连续监测数据,提前预警病情恶化(如脓毒症休克)。样本数据如下所示:
数据准备
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import pandas as pd
from pathlib import Path
# 数据
save_path = r"E:\test_data001\ICU_DataSet_Sample.xlsx"
df = generate_icu_dataset(save_path=save_path)
# 读取数据
df = pd.read_excel(save_path)
print(f"数据加载成功,形状: {df.shape}")
# 提取特征和标签
features = ['心率', '收缩压', '舒张压', '血氧饱和度', '呼吸频率', '体温']
X = df.groupby('患者ID')[features].apply(lambda x: x.values).values
y = df.groupby('患者ID')['病情恶化'].last().values
# 转换为张量
X_tensor = torch.tensor(np.stack(X), dtype=torch.float32) # [患者数, 时间步, 特征数]
y_tensor = torch.tensor(y, dtype=torch.long) # [患者数]
编码器部分
步骤-1:Input Embedding
# 思想:将时序数据映射到高维空间
# 过程:使用线性层将6维特征转换为d_model维
d_model = 16 # 嵌入维度
input_embedding = nn.Linear(len(features), d_model)
# 选择一个患者的时序数据作为示例
sample_idx = 0
sample_X = X_tensor[sample_idx] # [时间步, 特征数]
embedded = input_embedding(sample_X) # [时间步, d_model]
print("\n步骤-1:Input Embedding 结果形状:", embedded.shape)
步骤-2:Positional Encoding
# 思想:为序列中的每个位置添加位置信息
# 过程:使用正弦和余弦函数创建位置编码
max_seq_len = X_tensor.shape[1] # 最大时间步
# 创建位置编码矩阵
positional_encoding = torch.zeros(max_seq_len, d_model)
position = torch.arange(0, max_seq_len).unsqueeze(1)
div_term = torch.exp(torch.arange(0, d_model, 2) * -(np.log(10000.0) / d_model))
positional_encoding[:, 0::2] = torch.sin(position * div_term)
positional_encoding[:, 1::2] = torch.cos(position * div_term)
# 将位置编码添加到嵌入向量
embedded_with_pos = embedded + positional_encoding
print("\n步骤-2:Positional Encoding 结果形状:", embedd