SCP竞赛第21名解决方案
SCP竞赛第21名解决方案
作者:maxleverage | 发布于:2023-12-01 | 最后更新:2023-12-12
特征工程
最终集成中使用的不同模型采用了两套特征集:
特征集1
- 细胞类型 - one-hot编码
- SMILES - 使用RDKit Morgan指纹转换为2048位向量
- 药物性质:对每个SMILE计算log P和摩尔折射率对数,进行标准化缩放
- 对照组 - 是否为对照药物(1)或非对照(0)
特征集2
- 与特征集1相同的特征
- 药物对所有细胞类型影响的平均SVD嵌入值以及细胞对多种药物反应的平均SVD嵌入值
- 排除第2项),或使用药物对所有细胞类型log倍数变化的平均SVD嵌入值以及细胞对多种药物log倍数变化的平均SVD嵌入值(使用2或3之一)
保留的SVD奇异值数量根据Gavish-Donohoe(GD) SVD硬阈值方法确定:https://arxiv.org/abs/1305.5870
目标变量
- 使用GD SVD准则确定低维模式保留的奇异值截断值
- 对目标矩阵应用SVD,并根据Gavish-Donohoe阈值确定奇异值截断
- 所有模型都针对原始目标的SVD嵌入进行训练,模型预测通过V矩阵的转置变换回原始空间
模型架构与数据上采样
模型1
在SVD嵌入目标上的直接回归:
- 8层密集前馈神经网络(每层5128个神经元),输出层114个神经元
- 每层使用SELU激活函数(输出层除外,无激活,线性回归输出)
- 输出位于SVD嵌入空间(114列)
- 损失函数:MAE或伪Huber损失
- 训练轮数:800
- 批大小:16
- 余弦退火学习率调度(每200轮重启,alpha=0.01, t_mul=1.0, m_mul=0.9)
- 随机权重平均(SWA):从第2轮开始
- 18211个基因的预测:
- 设输出为预测的SVD嵌入
- 将预测的SVD嵌入与SVD的V矩阵转置相乘,得到原始18211维表示
- 保留的奇异值数量根据Gavish-Donohoe阈值确定
模型2
与模型1架构相同,但在损失函数中引入样本权重:
样本权重方案:
- 从训练集中筛选出B细胞/髓系细胞暴露于相同化合物的药物-细胞对
- 从1)中,暴露于相同化合物但观察到目标差异(-log10(p_val) * sign(LFC))应归因于细胞差异
- 对每个非B细胞/髓系细胞的细胞类型,计算其与过滤后观察目标之间的距离(使用Frobenius范数等度量)
- 对每个细胞类型平均化这个距离指标,然后用1减去该值(距离B细胞或髓系细胞越近得分越高)
- 将每个细胞类型的得分除以6种细胞类型中的最小得分,作为该细胞类型实验对应的权重
- 模型在该加权损失上训练
模型3
带跳跃连接的架构:
- 8或9个密集层
- 跳跃连接:
- 输入维度:2056
- 连接层:输入与第2层激活前输出(3072神经元)连接,形成5128维输出(3072+2056)
- 加法跳跃连接:连接层的SELU输出+第4层激活前输出(5128),第4层SELU输出+第6层激活前输出,第6层SELU输出+第8层激活前输出(使用9隐藏层时)
- 其他细节与模型1相似
模型4
使用训练误差识别难以预测的药物-细胞对进行上采样的模型1架构:
上采样通过识别训练误差低于阈值的样本索引,并复制这些行(整数倍)到原始训练集中实现。
基本思路:由于预测B/髓系细胞相互作用的问题可能欠定,需要从其他细胞的观察进行外推,因此高准确率或低MAE的行重要性较低,可以牺牲这些行的性能以提升低准确率行的性能。
上采样方法1:基于回归的逐行MAE指标
- 在原始训练集上训练一个较小的神经网络200轮
- 计算每个样本的逐行MAE
- 取614个逐行MAE的中位数
- 将该中位数的倍数(如3倍或15倍)作为上采样的基础集
- 将该子集复制K次(如7倍)并拼接到原始训练集
- 在扩展后的训练集上重新训练更大的模型
上采样方法2:基于逻辑损失的符号分类
该方法认为符号正确性非常重要,因为即使幅度正确但符号错误会对RWRMSE指标产生严重影响。
- 与之前方法相同,但神经网络训练目标为log倍数变化的符号(目标矩阵为+1/-1)
- 逻辑损失:(1/n) * Σ L(y,t),其中 L(y,t) = ln(1 + exp(-y*t)),t∈{-1,+1}
- 计算训练集上的逐行准确率(%)
- 选择低于特定阈值(如75%或低于均值3个标准差)的行进行上采样
- 重复上采样过程并重新训练模型
上采样方法3:针对小p值样本的符号分类
小p值(如<0.1)经-log10转换后会产生大数值,因此这些样本的符号正确性尤为重要。
类似方法2,但仅计算p值低于阈值时基因的准确率,然后对低准确率行进行上采样。
模型5
带对比损失的三重回归头模型:
该架构使用共享层(5层)连接3个不同的回归输出,通过对比损失激励每个回归头学习不同的假设。
架构:
- 共享权重层:5个密集层
- 激活函数:共享层和回归头使用SELU,输出层使用线性激活
- 3个回归头:[3072, 2048, 1024]神经元,输出SVD嵌入
- 对比损失:Σ(各头回归损失) + contrast_weight * 平均成对差异性
K = C(n_head,2)
平均成对差异性 = (1/K) * Σ(平均行余弦相似度 + 1)
该损失平衡了偏差降低和假设差异性学习,contrast_weight控制对比强度
- 每个回归头输出通过V矩阵转置变换回原始18211个基因
- 提交时可选用最佳头或集成3个头(等权重或按训练损失加权)
最终提交
最终提交是16个最佳和80个最佳提交的LB RWRMSE加权集成。
计算方法:对每个提交的RWRMSE误差取立方,用1减去该值作为得分,然后归一化得到最终权重。