はじめに
6/30, 7/2,7/3 のメモの続きです。
以下のkaggle コンペについての覚書です。
目次
DeepGOZero: Improving protein function prediction from sequence and zero-shot learning based on ontology axioms
とりあえず公開されている GO term を予測するプログラムをそのまま実行した。
github も google colab もなにもわかっていないからプログラムをコピーするだけで大変。
実行するファイル
README に書いてあることのコピペ。
- uni2pandas.py - UniProtデータベースフォーマットからpandasデータフレームに変換するスクリプトです。
- deepgozero_data.py - トレーニングデータセットとテストデータセットを生成するスクリプトです。
- deepgozero.py - モデルの学習に使用します。
- deepgozero_predict.py - ゼロショット予測を行うスクリプトです。
- evaluate.py - Fmax、Smin、AUPRを計算するスクリプトです。
- evaluate_terms.py - クラス中心の平均AUCを計算するスクリプトです。
- Normalizer.groovy - OWLオントロジーを正規化するスクリプト。
- Corpus.groovy - クラスの公理定義を抽出するスクリプトです。
- deepgopro.py - このスクリプトはMLPベースラインモデルの学習に使用されます。
- deepgocnn.py - このスクリプトは、DeepGOCNNモデルの学習に使用されます。
- run_diamond.sh - このスクリプトはDiamond予測値を得るために使用されます。
uni2pandas.py
UniProtデータベースフォーマットからpandasデータフレームに変換するスクリプトです。
[options]
'--swissprot-file', '-sf', default='data/uniprot_sprot_2021_04.dat.gz', help='UniProt/SwissProt knowledgebase file in text format (archived)'
'--out-file', '-o', default='data/swissprot.pkl', help='Result file with a list of proteins, sequences and annotations'
[input]
data/uniprot_sprot.dat.gz
よくわかんない。とりあえず最新版をUniProt のページからダウンロードできる。
上から何行か確認してみたけど、やっぱりわかんない。
b'ID 001R_FRG3G Reviewed; 256 AA.\n'
b'AC Q6GZX4;\n'
b'DT 28-JUN-2011, integrated into UniProtKB/Swiss-Prot.\n'
b'DT 19-JUL-2004, sequence version 1.\n'
b'DT 02-JUN-2021, entry version 42.\n'
b'DE RecName: Full=Putative transcription factor 001R;\n'
b'GN ORFNames=FV3-001R;\n'
b'OS Frog virus 3 (isolate Goorha) (FV-3).\n'
b'OC Viruses; Varidnaviria; Bamfordvirae; Nucleocytoviricota; Megaviricetes;\n'
b'OC Pimascovirales; Iridoviridae; Alphairidovirinae; Ranavirus.\n'
b'OX NCBI_TaxID=654924;\n'
b'OH NCBI_TaxID=30343; Dryophytes versicolor (chameleon treefrog).\n'
b'OH NCBI_TaxID=8404; Lithobates pipiens (Northern leopard frog) (Rana pipiens).\n'
data/swissprot_exp.pkl
データの出典はわからなかった。
pandas DataFrame 型。
列名は ['index', 'proteins', 'accessions', 'genes', 'sequences', 'annotations', 'string_ids', 'orgs', 'interpros', 'exp_annotations', 'prop_annotations', 'cafa_target']。
[output]
data/swissprot_exp.pkl
pandas DataFrame 型。入力に使ったものを上書きしている。
列名は ['index', 'proteins', 'accessions', 'genes', 'sequences', 'annotations', 'string_ids', 'orgs', 'interpros', 'exp_annotations', 'prop_annotations', 'cafa_target']で、さっきと同じ。
変わったところが見当たらないけど、わたしがプログラムを一度実行して元データを書き換えたからかも。
プログラムを見ると'exp_annotations', 'prop_annotations', 'cafa_target' の列について変更を加えているぽい。
deepgozero_data.py
トレーニングデータセットとテストデータセットを生成するスクリプトです。
[options]
'--go-file', '-gf', default='data/go.obo', help='Gene Ontology file in OBO Format'
'--data-file', '-df', default='data/swissprot_exp.pkl', help='Uniprot KB, generated with uni2pandas.py'
'--sim-file', '-sf', default='data/swissprot_exp.sim', help='Sequence similarity generated with Diamond'
[input]
data/go.obo
GO ontology の各タームの説明と親子関係のデータ。
b'[Term]\n'
b'id: GO:0000001\n'
b'name: mitochondrion inheritance\n'
b'namespace: biological_process\n'
b'def: "The distribution of mitochondria, including the mitochondrial genome, into daughter cells after mitosis or meiosis, mediated by interactions between mitochondria and the cytoskeleton." [GOC:mcc, PMID:10873824, PMID:11389764]\n'
b'synonym: "mitochondrial inheritance" EXACT []\n'
b'is_a: GO:0048308 ! organelle inheritance\n'
b'is_a: GO:0048311 ! mitochondrion distribution\n'
b'\n'
data/swissprot_exp.pkl
前のプログラムで出力したやつ。
data/swissprot_exp.sim
options の説明にある"Sequence similarity generated with Diamond" でぐぐるとわからない説明が出てくる。
b'11K_PAVHV\t11K_PAVHV\t100\n'
b'11S1_CARIL\t11S1_CARIL\t100\n'
b'11S1_CARIL\tJUGR4_JUGRE\t94.3\n'
b'11S1_CARIL\tJUGN4_JUGNI\t89.1\n'
b'11S1_CARIL\tANAO2_ANAOC\t57.9\n'
b'11S1_CARIL\tPRU01_PRUDU\t50.4\n'
b'11S1_CARIL\tPRU1_PRUDU\t49.9\n'
b'11S1_CARIL\tCOS1_COCNU\t45.4\n'
b'11S1_CARIL\tGLYG1_SOYBN\t47.7\n'
[output]
data/mf/train_data_hard.pkl
data/mf/valid_data_hard.pkl
data/mf/test_data_hard.pkl
入力した data/swissprot_exp.pkl の pandas DataFrame 型データの分割。
train 81%, valid 9%, test 10% で配分している。
GO term には BPO, CCO, MFO というグループがあって、それごとに分けている。
それ以外ではたぶんだけど完全ランダム。
data/mf/terms.pkl
GO term の列挙、だと思う。7151 件。
gos
0 GO:0045735
1 GO:0005488
2 GO:0019865
3 GO:0019863
4 GO:0044877
deepgozero.py
モデルの学習に使用します。
[options]
'--data-root', '-dr', default='data', help='Prediction model'
'--ont', '-ont', default='mf', help='Prediction model'
'--batch-size', '-bs', default=37, help='Batch size for training'
'--epochs', '-ep', default=256, help='Training epochs'
'--load', '-ld', is_flag=True, help='Load Model?'
'--device', '-d', default='cuda:1', help='Device'
個人的に、-d オプションは 'cuda' ってしないとエラーが出た。
[input]
前プログラムの出力が train_data_hard, test_data_hard とかだったので、最後の_hard の部分を消しておく。
data/mf/terms.pkl についても data/mf/terms_zero_10.pkl に変えておく。
{data_root}/{ont}/terms_zero_10.pkl
terms.pkl の何かしらの制限だと思うけど、コードがないしよくわかんない。2041 件。
gos
0 GO:0045735
1 GO:0019001
2 GO:0017076
[output]
{data_root}/{ont}/deepgozero_zero_10.th
学習したモデル
{data_root}/{ont}/predictions_deepgozero_zero_10.pkl
pandas DataFrame 型。
列名は['proteins', 'accessions', 'genes', 'sequences', 'annotations', 'string_ids', 'orgs', 'interpros', 'exp_annotations', 'prop_annotations', 'cafa_target', 'preds']。
一番上の id 9299 の行を見てみる。
interpros : ['IPR001168', 'IPR000276', 'IPR017452', 'IPR001671'] 長さ 4
exp_annotations : ['GO:0005886', 'GO:0004978', 'GO:0004977', 'GO:0007189', 'GO:0007186', 'GO:0007187'] 長さ 6
prop_annotations : ['GO:0004930', 'GO:0033218', 'GO:0019932', ......
'GO:0110165', 'GO:0008188', 'GO:0004888'] 長さ 62
preds : [0.0059625 0.00552347 0.00662551 ... 0.00666691 0.00647238 0.00467796] 長さ 2041
preds は data/mf/terms_zero_10.pkl に挙げられた GO terms に対応しているみたい。
deepgozero_predict.py
ゼロショット予測を行うスクリプトです。
アノテーションのない GO term を予測するのかな。よくわかんない。あと動かないし。
[input]
data/definitions_go.txt
b'GO_0005753: GO_0045259 and BFO_0000050 some GO_0005739\n'
b'GO_1905618: GO_0065007 and RO_0002213 some GO_0035278\n'
b'GO_0001988: GO_0010460 and BFO_0000050 some GO_0001982\n'
b'GO_0001976: GO_0050877 and BFO_0000050 some GO_0003073\n'
b'GO_0002500: GO_0002496 and BFO_0000066 some GO_0005764\n'
力尽きたので以降のプログラムはなし。
やりたいこと
google colaboratory でやっていると、GCN のライブラリのインストールがうまくいかなかった。
理屈は一切わからないけど以下のおまじないでなんとかなった。
ただしフォルダはぐちゃぐちゃになる。
!git clone https://github.com/joerg84/Graph_Powered_ML_Workshop.git
!rsync -av Graph_Powered_ML_Workshop/ ./ --exclude=.git
!pip3 install dgl
とりあえず再学習とかなしでそのまま動かして、一度これで行った計算を kaggle に提出したい。目標は低いところから。