CAFA 5 Protein Function Prediction DeepGOの写経(2023/07/10)


# はじめに
<!-- 発端や概要を記載 -->
[6/30](https://qiita.com/taichan003/items/e2ab1d4c70ff715faf05), [7/2](https://qiita.com/taichan003/items/ed365c6b2470d25a4a3f),[7/3](https://qiita.com/taichan003/items/39ff269e80752f9f0097) のメモの続きです。
以下のkaggle コンペについての覚書です。

https://www.kaggle.com/competitions/cafa-5-protein-function-prediction


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [概観](#Chapter1)
1. [uni2pandas.py](#Chapter2)
1. [deepgozero_data.py](#Chapter3)
1. [deepgozero.py](#Chapter4)
1. [deepgozero_predict.py](#Chapter5)
1. [次やること](#Chapter6)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# DeepGOZero: Improving protein function prediction from sequence and zero-shot learning based on ontology axioms

https://github.com/bio-ontology-research-group/deepgozero

とりあえず公開されている 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予測値を得るために使用されます。

一つずつ入出力を確認する。
<a id="#Chapter2"></a>
### 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 のページ](https://ftp.uniprot.org/pub/databases/uniprot/current_release/knowledgebase/complete/)からダウンロードできる。
上から何行か確認してみたけど、やっぱりわかんない。
```
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']。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470253/7ea2499b-c545-7b26-bc29-22cc86463b94.png">

[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' の列について変更を加えているぽい。


<a id="#Chapter3"></a>
### 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
```

<a id="#Chapter4"></a>
### 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']。
<img width="500" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470253/b55bbb8a-a681-17f0-953a-9426be66f492.png">

一番上の 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 に対応しているみたい。

<a id="#Chapter5"></a>
### 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'
```

力尽きたので以降のプログラムはなし。


<a id="#Chapter6"></a>
# やりたいこと

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 に提出したい。目標は低いところから。