はじめに
以下のkaggle コンペについての覚書です。
目次
問題設定
タンパク質(? DNAかも?)のアミノ酸配列からタンパク質の機能を予測したい。
[予測元]
アミノ酸配列はFASTA形式というのを使う。
以下の例はkaggleで提供されているデータベースの中のID P20536 というタンパク質のアミノ酸配列を示している。
>P20536 sp|P20536|UNG_VACCC Uracil-DNA glycosylase OS=Vaccinia virus (strain Copenhagen) OX=10249 GN=UNG PE=1 SV=1
MNSVTVSHAPYTITYHDDWEPVMSQLVEFYNEVASWLLRDETSPIPDKFFIQLKQPLRNK
RVCVCGIDPYPKDGTGVPFESPNFTKKSIKEIASSISRLTGVIDYKGYNLNIIDGVIPWN
YYLSCKLGETKSHAIYWDKISKLLLQHITKHVSVLYCLGKTDFSNIRAKLESPVTTIVGY
HPAARDRQFEKDRSFEIINVLLELDNKVPINWAQGFIY
sp|P20536|UNG_VACCC というのはデータの出典元である UniProtKB の中でのID。sp から始まっていたら実測結果あり、tr から始まっていたら計算による予測のみ。
IDの後にはsp-シリーズのみ慣用名とかが書いてあり、その下の行がアミノ酸配列。
[予測対象]
予測したいものは遺伝子オントロジー(GO)。
タンパク質の機能と GO term が一意に紐づいている。
GO term は大分類、小分類みたいな順序関係が入った半順序集合。
obonet っていう python ライブラリで networkX 形式で見られる。グラフは有向非巡回グラフ(DAG)となる。
やることは、FASTA形式のアミノ酸配列を与えられて、発現するGO term とその発現確率を求めること。
お手本になるノート
中の文章からのコピペ↓
-
学習済みのタンパク質機能予測モデル(T5、ProtBERT、EMS2)から埋め込みベクトルを収集する。
-
train_termsファイルからラベルを生成:全タンパク質セットで上位600個の頻出GO用語を考慮し、K個のGO用語がタンパク質に含まれる真の確率(0または1)を示す長さKのスパースベクトルを各タンパク質について生成する。
-
Protein IDとエンベッディングを扱えるPytorch Datasetクラスを作成する。
-
予測用のPytorch Modelクラスを作成:ここではMultiLayerPerceptronとConvNN1d Networksを検討。
-
重みとバイアスパッケージ(Wandb)を使って、F-1メジャーを使った交差検証を行い、ハイパーパラメータのチューニングを行う。
このノートでは目的変数のデータは自分で作ることになっているけど、同じものを作ってくれている人がいるのでそれを使えばいい。
https://www.kaggle.com/datasets/siddhvr/train-targets-top500
やりたいこと
- 現状 GO terms の親子関係を活かせていない。「子の GO term をもつ ⇒ 親の GO term をもつ」となるはずだから、親の GO をもつデータに制限すれば子の GO を持つ割合も上がって予測しやすくなりそう。
- ハイパラチューニングができる気がしない。AutoMLで何か使えないか探す。
- 一度embeddingをしたから見えなくなっているけど説明変数に外れ値がある。異様に長い配列とか、ぜんぜん出現しないアミノ酸が登場するとか。ここらへんのお掃除もちゃんとしたほうがいいと思う。