SSearch, blast や ClastalW のようなプログラムを利用して、16SrDNA塩基配列で細菌の分類を目的として相同性検索と系統樹作成を行うことは、細菌研究ではよくおこなわれています。
従来の方法では以下の手順が一般的だと思います。
(1)サンプルの 16SrDNA 塩基配列を DNAシーケンサーで読み取る。
(2)16SrDNA 塩基配列をDNAデータベース( DDBJ など)とプログラム( SSearch, blast など)を利用して相同性検索を行う。
(3)遺伝子系統樹を書いてどのグループに属するか検討する。

ディープラーニング(深層学習)では以下のような作業となります。
(1)既存の 16SrDNA 塩基配列とバクテリアの種類のパターンを大量に与え学習させる。
(2)サンプルの 16SrDNA 塩基配列を DNAシーケンサーで読み取る。
(3)学習済みモデルを利用して、サンプルの 16SrDNA 塩基配列からバクテリアの種を求める。

ディープラーニングの一つの利点は、基本的には従来のアルゴリズムでは難しい判断をコンピュータで行うことですが、 この場合は、上手くいけば学習済みモデルを利用することによって、スーパーコンピュータで大量のDNAデータを検索する手間が省け、パソコン/スマートフォン/組込機器程度のスペックでも高速な簡易検査ができる可能性が考えられます。
学習には時間がかかりますが、一度学習してしまえば以降は学習済みモデルを利用することによって軽量化と高速化ができるのではないかと考えられます。

ディープラーニングだけでどの程度の分類ができるが試してみようと思います。

【課題1-1 16SrDNA塩基配列で細菌分類】

まずは、試しに属レベルで分類してみようと思います。

(1)DDBJから細菌の16SrDNAをダウンロード。

https://www.ddbj.nig.ac.jp/download-e.html
16S rRNA (Prokaryotes) in FASTA format をダウンロード

(2)今回の対象となる属のデータを抽出。

データが少ないと学習できないので登録件数が一定量以上の属を抽出します。
今回は、登録 各属で600件以上、123種類の属を分類します。

抽出に使ったブログラム( dnaread.py

抽出結果のファイル( target16S.fasta , genera.txt

(3)問題と正解(DNAと属名)のパターンを作成、ディープラーニング(今回は TensorFlow を使う)で使えるデータ形式に変換する。

まずは、固定長で全結合型で試してみます。
登録データによっては先端や末端のDNAは読み取れていない場合があるので、中央部分 1024塩基を使うことにしました。

変換するプログラム( converttfdata.py

変換結果のファイル( tf16S.dna , tf16S.ans

(4)作成したデータで学習を行う。
今回は、全結合型1層、ノード数は、1024塩基×16(4塩基×4塩基)=16834にしてみました。
(今後は、他の方法も試してみます。)

学習プログラム( dnadnn.py

学習時間は2時間半程度でした。

学習結果(学習済みモデル)
model_full.ckpt.data-00000-of-00001 , model_full.ckpt.indexmodel_full.ckpt.meta 

(5)学習済みモデルの検証を行う。
既存のデータでテストして得られた結果です。

テストPythonプログラム( dnadnntest.py

[  0   1   2 … 114  68  31]
[  0   1   2 … 114  68  31]
精度
0.9383

まだ正答率9割程度ですが、ある程度の判断はできていると思います。
ノードを増やすことや層を深くするなど、あるいはインプットデータの種類と量や形式を工夫するなどで改善できるかもしれません。
畳込ニューラルネットワークや再帰型ニューラルネットワークで試してみると良い結果が得られるかもしれません。

また、学習時間が長くなってきたので、そろそろハードスペックを改善して GPU の導入検討も必要かと思われます。

 

(S.Onda 2018/3/24)