PO2GO、PO2Vec论文阅读与模型复现报告
论文与代码
论文:
Partial order relation–based gene ontology embedding improves protein function prediction | Briefings in Bioinformatics | Oxford Academic (oup.com)
代码:
xbiome/protein-annotation (github.com)
论文介绍
今年的一篇经典蛋白质功能预测论文,思路自然,效果也不错
模型主要分为两个部分,PO2Vec和PO2GO,PO2Vec是PO2GO的一个模块。
数据集使用了CAFA3和Swissprot,使用的是蛋白质序列特征和GO标签依赖关系特征。
PO2Vec模型
目的就是提取GO标签的特征向量
结构很简单,就是一个Embedding层和一个MLP层
但采样方式比较有趣:利用GO标签的偏序关系抽取正负样本
'''
根据论文的说法,标签视为点,is_a和part_of关系视为有向边
一个点有对应的直接可达集合Qdr、间接可达集合Qir、不可达集合Qur(通过有向边可达、把有向边视为无向边之后可达、完全不联通(指跨越CC、MF、BP的大类))。
在Qdr、Qir中各随机抽一个最近的点作为正样本。
然后根据超参数k、u来获取负样本,(k表示有k个负样本,u表示负样本中位于Qdr集的占比,u很小)
然后在Qdr中随机采集负样本k*u个,剩下的负样本指标,Qir和Qur集合各占一半,随机抽取。
'''
采集完正负样本之后,使用对比学习,训练出每个GO标签的embedding向量。
说是这么说啊,但我根本没看出来代码里面怎么实现的上述过程,没找到超参数k、u:(可能是我读的还不够仔细)
PO2GO模型
用ESM1b提取蛋白质序列特征,PO2Vec提取各个GO标签的特征
最后MLP+点积预测蛋白质功能
复现流程
(仓库确实写了,但没有完全写清楚,害我倒腾了好久)
1、克隆仓库,配置环境
我用的python3.9.19,需要把requirement.txt里面的sklearn换成scikit-learn
2、下载数据:Index of /pub/databases/uniprot/knowledgebase/complete
下载uniprot_sprot.dat.gz
获取go.obo:Requesting a dataset · Issue #1 · xbiome/protein-annotation (github.com)
两个文件都放在data文件夹下。
3、运行preprocess_raw_data.py
4、训练PO2Vec,获取GO embeddings
(1)运行extract_all_terms_from_obo.py
(2)运行GO_data.py,获取正负样本
(3)运行train.py,训练PO2Vec
(4)运行extract_GO_embeddings_all.py和extract_GO_embeddings_ontologies.py,提取GO embeddings
5、下载ESM-1b模型:https://dl.fbaipublicfiles.com/fair-esm/models/esm1b_t33_650M_UR50S.pt
还有这个:ESM-Scan/esm1b_t33_650M_UR50S-contact-regression.pt at main · xuebingwu/ESM-Scan (github.com)
6、运行get_protein_embedding.py(。。。似乎上面两个可以不用手动下载,它会自动帮你下,但是由于一些代码原因,即便你手动下好了,它无法直接导入,我魔改了代码才导入成功),提取蛋白质使用ESM-1b提取的embeddings
7、运行prepare_data_seperate_swissprot.py划分数据集
记得把pkl的文件名改为带embedding的
8、运行prepare_data_seperate_ontologies.py把数据集按照GO标签大类进一步划分(BP、CC、MF)
9、运行train_po2go.py(请使用README.md中的命令),开始训练,这里会强制你使用wandb,如果没有账号或者其他,可以直接注释掉所有wandb log相关的语句。
10、查看训练结果
在swissprot数据集上的MFO标签分类,我没调参数直接开训,最后AUC 0.98,Fmax 0.41, AUPR 0.39
实际上复现结果并不好,论文中的AUPR可以达到0.753,FMAX 0.697,相当不错的水平了
(个人感觉应该是GO Embedding训练的时候正负样本比例不均衡,迭代次数过多之后过拟合了,然后又对后面的功能预测造成了影响,导致AUC虚高但AUPR很低的现象,可能作者的训练方法以及参数调整会更加优秀一些)