Kipoiでゲノミクスの深層学習をやってみる

ゲノミクスの分野でも深層学習を活用したモデルがいくつかあります。
例えば、塩基配列からDNA・RNA結合タンパク質への結合能を予測するDeepBindや、塩基配列からエピジェネティックな修飾を予測するDeepSEAなどです。

Kipoiは、ゲノミクスの深層学習の様々なモデルを利用することができるプラットフォーム(論文ではレポジトリとされてる)です。
KerasやTensorFlow、PyTorch、Scikit-learnで書かれたモデルに対応しています。
トレーニングされたモデルをロードして、簡単に自分の配列データで試して予測値を出すことが出来ます。

ホームページ：http://kipoi.org/
論文：https://www.nature.com/articles/s41587-019-0140-0

# 実際に使ってみる

環境は
Ubuntu 16.04
Anaconda
Python 3.6
です。

##インストール

```bash
pip install kipoi
```
これでインストールできました。バージョンは0.6.25でした。
###エラー情報
この後動かしてみた時に`AttributeError: 'Table' object has no attribute 'purge'`というエラーが出ることがあります。
これはtinydbが新しいバージョンであるからのようです。
その場合は下記のようにして古いバージョンを入れなおすと直ります。

```bash
pip uninstall tinydb
pip install tinydb==3.13.0
```
## Kipoiを動かしてみる
チュートリアルがgithubで公開されていて試すことができます。(https://github.com/kipoi/examples )
今回はチュートリアルの最初のところをやってみます。

まずはチュートリアルのセットをダウンロードします。

```bash
git clone https://github.com/kipoi/examples.git
cd examples
```
kipoiのモデルリストを読み込みます。

```bash
kipoi ls
```
これで使えるようになりました。ホームフォルダにモデルの入るフォルダ(.kipoi/models/)が作成されました。
次に新しい仮想環境を作ります。

```bash
kipoi env create shared/envs/kipoi-py3-keras2
```
これでcondaの中に「kipoi-shared＿envs＿kipoi-py3-keras2」という仮想環境が作られました。
その仮想環境に移動します。

```bash
conda activate kipoi-shared__envs__kipoi-py3-keras2
```
＊マニュアルでは上記コマンドが`source activate`となっていましたがそれでは動かず、`conda activate`に変更したら動作しました。

いくつかのテストコードを試してみます。

```bash
kipoi test Basset --source=kipoi
kipoi test DeepSEA/predict --source=kipoi
kipoi test DeepBind/Homo_sapiens/TF/D00328.018_ChIP-seq_CTCF/ --source=kipoi
```
動作することが確認できました。

###example1
example1の予測をやってみます。

```bash
cd 1-predict
```

inputフォルダにサンプルデータがあるので、解凍します。

```bash
zcat input/hg19.chr22.fa.gz > input/hg19.chr22.fa
```
予測を行います。
今回使うDeepBindのモデルでは100塩基ずつを入力としてCTCFとの結合能の予測を出力します。
fasta_fileには塩基配列の情報が入っていて、
intervals_fileは取り出す塩基配列の場所(startとend)の情報が入っています。


```bash
kipoi predict DeepBind/Homo_sapiens/TF/D00328.018_ChIP-seq_CTCF \
   --dataloader_args='{"intervals_file": "input/enhancer-regions.hg19.chr22.bed.gz",
                       "fasta_file": "input/hg19.chr22.fa"}' \
  -o preds.tsv
```
予測ができました。


出力(preds.tsv)の中身を見てみます。

```
$ less preds.tsv
metadata/ranges/chr     metadata/ranges/end     metadata/ranges/id      metadata/ranges/start   metadata/ranges/strand  preds
chr22   17274293        0       17274192        *       -4.108346
chr22   17274548        1       17274447        *       -2.6903393
chr22   17275618        2       17275517        *       -5.2259955
chr22   17275863        3       17275762        *       -5.2259955
chr22   17287134        4       17287033        *       -4.2063684
chr22   17288718        5       17288617        *       -5.2259955
chr22   17570303        6       17570202        *       -4.93376
chr22   17597591        7       17597490        *       -4.4880404
chr22   17597800        8       17597699        *       -4.825454
chr22   17598104        9       17598003        *       -5.190316
・・・・・
```
一番右の列が予測値です。

チュートリアルの続きにはSnakefileが使われていて、これを動かすにはsnakemakeをインストールする必要があるようです。(snakemakeは便利なワークフローの自動化ツールです。[こちら](https://qiita.com/smatsumt/items/e6bb2c64878b0d8a4f5f)を参照)

##Pythonでの実行方法
これまでは全てをCLIで行いましたが、PythonやRのAPIもあります。
仮想環境に入った後は、Pythonで以下のようにして実行していくようです。([マニュアル](http://kipoi.org/docs/#quick-start)からの抜粋)

```Python
import kipoi

kipoi.list_models() # list available models
model = kipoi.get_model("Basset") # load the model
model = kipoi.get_model(  # load the model from a past commit
    "https://github.com/kipoi/models/tree/<commit>/<model>",
    source='github-permalink'
)

# main attributes
model.model # wrapped model (say keras.models.Model)
model.default_dataloader # dataloader
model.info # description, authors, paper link, ...

# main methods
model.predict_on_batch(x) # implemented by all the models regardless of the framework
model.pipeline.predict(dict(fasta_file="hg19.fa", intervals_file="intervals.bed"))
# runs: raw files -[dataloader]-> numpy arrays -[model]-> predictions 
```

#感想など
ゲノミクス解析のプラットフォームとして非常に興味深いと思いました。
kipoiで作った仮想環境はAnacondaの仮想環境と同じような扱いになります。
モデルをダウンロードして使うだけでなく、自分でトレーニングしたモデルをアップロードして共有することも出来るようです。
これからも使っていきたいです。