11月AI×Bio赛事日历:从Kaggle质谱赛到蛋白设计挑战赛
从这一期开始,「AI×Bio 赛事」成为固定栏目:每周一档,上半场是赛事日历速递(本周 deadline、方向、适合人群),下半场挑一个当期赛事做Baseline 起步实战。做这个栏目的动机很简单:此前 Enveda CASMI 质谱赛那篇实战(站内互链)的收藏率是全账号最高档——赛事文「有截止日期、有数据、能直接动手」,是收藏型内容的黄金形态。
⚠️deadline 红线:赛事截止日期以官方页面实时显示为准,本文不臆造具体日期;开跑前务必到赛页核对。
速递层:11 月上旬赛事日历
以下为方向型日历,deadline 与奖金均以各官方页面为准:
| 赛事/方向 | 平台 | 方向 | 适合人群 |
|---|---|---|---|
| 质谱小分子结构鉴定(CASMI 线) | Kaggle | 质谱→分子结构 | 质谱/化学信息学,PyTorch 基础 |
| 蛋白结构/设计类挑战 | 各平台轮动 | 蛋白折叠与设计 | 生信 + 结构生物学 |
| 单细胞分析类竞赛 | 平台轮动 | 组学聚类/注释 | 扫描图/AnnData 使用者 |
| 生物医学 NLP 类 | 平台轮动 | 文献/病历文本 | LLM 微调经验者 |
每类赛事在本栏目后续各期轮动做 Baseline。具体在打哪场、什么时候截止,评论区互相通报(deadline 变动我会在下期更新)。
深度层:质谱赛的 Baseline 最小路径
为什么首期选质谱赛?两个理由:一是它是我唯一完整跑过数据管线的赛题(10-28 那篇实战的延续,踩过的坑可以直接搬过来);二是它的任务结构(谱图→结构)对生信背景的同学最友好——本质是「多输入特征 → 分类/检索」,和序列分析思维同构。
以 Kaggle 质谱线为例(详细赛制见 10-28 Enveda CASMI 文,互链),任务是「给定质谱图 → 预测候选小分子结构」。第一次提交的最小路径分四步:
- 看懂数据:训练集是「谱峰列表 + 对应分子 InChIKey」;
- 构造特征:把峰列表变成模型可用的固定长度向量;
- 先上检索 Baseline:不训深度模型,用「谱图相似度 + 分子指纹最近邻」就能出第一版提交;
- 再迭代:搭一个简单的峰序列编码器(1D CNN/Transformer)。
先建立「能提交」的底线,再谈排名——这是所有数据竞赛的第一原则。检索 Baseline 的意义不仅是热身:它同时验证了你的数据读取、提交格式、评分理解三个环节,深度模型上线后还要用它做 sanity check(如果端到端模型打不过检索基线,先怀疑实现而不是急于调参)。
环境准备:十分钟搭好比赛工作台
开跑前把环境一次配齐,避免中途反复折腾:
# 竞赛环境一键脚本(本地或 Kaggle Notebook 之外的云机)conda create-naibiopython=3.11-y&&conda activate aibio pipinstallpandas numpy scikit-learn rdkit torch --index-url https://pypi.org/simple# rdkit 若 pip 失败,走 conda-forge:# conda install -c conda-forge rdkit -ymkdir-paibio-comp/{data,src,sub}echo"data/ 放原始数据, src/ 放代码, sub/ 放提交文件"建议养成两个习惯:所有随机过程设固定 seed(复现自己的分数是和队友协作的基础);数据文件不进 git(用dvc或至少.gitignore+ 下载脚本),比赛结束复盘时不至于对着代码找不到数据。
代码块 1:数据加载与特征构造
# pip install pandas numpy rdkitimportnumpyasnpimportpandasaspdfromrdkitimportChemfromrdkit.ChemimportMACCSkeys N_BINS=1000MZ_MAX=1000.0# 按赛的 mz 范围调整defspectrum_to_vector(peaks,n_bins=N_BINS,mz_max=MZ_MAX):"""peaks: [(mz, intensity), ...] → 固定长度强度向量"""vec=np.zeros(n_bins,dtype=np.float32)formz,inteninpeaks:idx=int(mz/mz_max*(n_bins-1))if0<=idx<n_bins:vec[idx]+=inten# 同 bin 强度累加ifvec.max()>0:vec/=vec.max()# 归一化returnvecdefmol_fingerprint(smiles):mol=Chem.MolFromSmiles(smiles)ifmolisNone:returnNonefp=MACCSkeys.GenMACCSKeys(mol)# 167 位 MACCS 指纹returnnp.array(fp,dtype=np.float32)# 训练集示意(列名以实际数据字典为准)df=pd.read_csv("train_spectra.csv")df["spec_vec"]=df["peaks"].apply(lambdas:spectrum_to_vector(eval(s)))df["mol_fp"]=df["smiles"].apply(mol_fingerprint)代码块 2:检索 Baseline 与提交文件生成
fromsklearn.neighborsimportNearestNeighborsimportnumpyasnp# 构建分子指纹库mask=df["mol_fp"].notna()fp_matrix=np.stack(df.loc[mask,"mol_fp"].values)nn=NearestNeighbors(n_neighbors=5,metric="jaccard")nn.fit(fp_matrix)test=pd.read_csv("test_spectra.csv")rows=[]for_,rintest.iterrows():q=spectrum_to_vector(eval(r["peaks"]))# 简易策略:谱向量最近邻训练样本 → 其分子指纹近邻sims=df["spec_vec"].apply(lambdav:float(np.dot(v,q)))top=df.loc[sims.nlargest(5).index,"mol_fp"]top=np.stack([tfortintopiftisnotNone])dist,idx=nn.kneighbors(top.mean(axis=0,keepdims=True))pred=df.loc[mask].iloc[idx[0][0]]["inchikey"]rows.append({"id":r["id"],"inchikey":pred})pd.DataFrame(rows).to_csv("submission.csv",index=False)print("已生成 submission.csv,共",len(rows),"条")两段代码跑通即完成「可提交 Baseline」——先上车,再谈排名。后续期再讲深度模型的谱编码器与数据增强。
三个第一次参赛最容易踩的坑
把这些放在代码之后、因为它们都是跑通 Baseline 之后才会暴露的问题:
坑一:提交格式校验比模型调优更早出事。第一次提交被拒的常见原因不是分数低,而是 InChIKey 大小写、列名、行数不匹配。对策:本地写一个格式校验函数(行列数、列名、值域三查),每次生成提交后自动跑。
坑二:训练/测试的谱图预处理必须同源。归一化方式(强度除以基峰还是总量)、mz 分箱边界,训练和推理必须逐字一致——不同源的特征是「静默掉分」的头号来源,而且排行榜上完全看不出来。
坑三:不要在公开榜上过度拟合。质谱赛公开集与私有集的分子分布通常有差异,公开榜蹭分技巧(如针对候选集频次的后处理)在最终榜上经常反噬。正确姿势:本地按分子骨架分层做交叉验证,公开榜只作为方向性参考。
时间管理:deadline 驱动的三段投入法
竞赛时间是最稀缺资源,建议按 40/40/20 分配:40%花在数据理解与验证集设计上(最不性感但决定上限);40%花在 Baseline 迭代与错误分析上(看错例比调参有用);20%留给提交前最后的格式校验与集成。倒排时间点:deadline 前 72 小时冻结方法、前 24 小时只做集成与选提交。
怎么挑「值得投入」的比赛
赛事多了之后,挑比赛比打比赛更影响收益。给三个筛选维度,按权重排:
- 数据质量 > 奖金:有干净、规模合理、文档齐全的数据集的比赛,就算不进奖牌区,跑完数据管线本身也是作品集素材(面试/跳槽时「完整打过一场数据赛」的说服力远超课程项目);
- 与你的主线技能有 70% 重叠:完全陌生的领域学习成本会吞掉全部业余时间;完全熟悉的领域又学不到东西——重叠七成、留三成新知识的比赛性价比最高;
- 时间盒匹配:评测「剩余可投入小时数 × 每周可连续时间」与赛程是否匹配,两个周末的碎片时间打不了需要持续调参的 NLP 赛,但够打一个特征工程为主的表格/谱图赛。
用这三条过滤完,通常一季值得认真打的比赛就 1–2 场。贪多必然都打不完,这也是本栏目每周只推一档的原因:日历帮你省筛选时间,专注力还是得自己省。
下期预告与互动
下期(下周一档):更新 11 月中旬 deadline 变动 + 按评论区呼声选一场赛事做深度 Baseline(蛋白设计类优先候选)。如果这期的检索 Baseline 你跑通了,欢迎晒分数——下期可能引用你的实测结论(注明来源)。速查表与两段代码都可以直接搬走,欢迎反馈哪里卡住了,卡点会优先写进下期。
本期速查要点回顾:deadline 以官方页为准 → 环境一键脚本 → 检索 Baseline 先上车 → 预处理同源 → 公开榜不过拟合 → 40/40/20 时间分配。
收藏钩子
建议先收藏:下期同一时间更新 deadline 变动与新赛事 Baseline。你在打的 AI×Bio 比赛是哪场?评论区报个到,人多的话下期优先做那场的实战。另外如果对「谱编码器」的深度模型路线(1D CNN → 峰序列 Transformer → 预训练迁移)感兴趣,也可以留言点单,我会按呼声安排在后续期展开。
参考来源 / 信源清单
- 站内互链:10-28 Enveda CASMI 文(169462842)、10-30 赛事速查文(169561355)
- Kaggle 赛事页:https://www.kaggle.com/competitions(deadline 以赛页实时显示为准)
- 各赛事官方页面(成文时逐一核验)
AI 辅助生成,人工核验后发布。