解决问题:
- 随机缺失(实验室指标未检测)
- 系统性噪声(设备测量误差)
- 类别不平衡(健康/患病人群比例悬殊)
思路:引入可控噪声 → 重建原始数据
实现步骤
(1) 数据预处理
# 预处理流程:
# a. 缺失值填充:对连续变量用中位数填补,类别变量新增"None"类别
# b. 归一化:连续变量缩放到[0,1],类别变量做one-hot编码
(2) 噪声注入
def add_noise(clean_data):
# 随机掩码(模拟数据缺失)
mask_prob = 0.3 # 30%的数据点被随机遮蔽
mask = torch.rand(clean_data.shape) < mask_prob
noisy_data = clean_data.clone()
noisy_data[mask] = 0 # 用0填充被遮蔽区域
# 添加高斯噪声(模拟测量误差)
noise = torch.randn_like(clean_data) * 0.1
noisy_data += noise
return noisy_data
(3)forward函数
class DAE(nn.Module):
def __init__(self, input_dim=256, hidden_dim=64):
super().__init__()
# 编码器
self.encoder = nn.Sequential(
nn.Linear(input_dim, 128),
nn.ReLU(),
nn.Linear(128, hidden_dim) # 潜在特征维度
)
# 解码器
self.decoder = nn.Sequential(
nn.Linear(hidden_dim, 128),
nn.ReLU(),
nn.Linear(128, input_dim),
nn.Sigmoid() # 输出归一化到[0,1]
)
def forward(self, x):
corrupted_x = add_noise(x) # 注入噪声
z = self.encoder(corrupted_x)
recon_x = self.decoder(z)
return recon_x