ぬがの勉強記録

ぬがが勉強したことをまとめておきます

第5回 富士フイルムBrain(s)コンテスト 参加記録

概要

FUJIFILU AI Academy主催のBrain(s)コンテストに参加してきました。

fujifilmdatasciencechallnge.mystrikingly.com

富士フイルムの体験型ハッカソンに参加した際に、マテリアルズ・インフォマティクス機械学習の実装コンペがあることを知り、すぐに参加登録しました。

機械学習の実装は初めてだったのですが、結果としてはQ2で3位、Q3で1位を取ることができました!商品としてとてもいいカメラがもらえました。

fujifilm-x.com

本記事では、その解法について紹介します。第6回以降のBrain(s)コンテストが開催された際に参考になることを期待しています。

 

問題概要

問題

SMILESとNa+チャネルに対するIC50のデータが3800化合物ほどに対し与えられる。N種の化合物のSMILESからIC50の値を予測するモデルを作成せよ。(実行時間制限 10分、メモリ 512MB、N <= 10^5、提出ファイル容量 10MB)

データセットはbinding DB (http://bindingdb.org/bind/info.jsp)から取ってきているようでした。では問題を読み解いていきます。

SMILES

SMILESとは、いわば「有機化合物をコンピュータが理解できるように書き表した文字列」です。SMILESが与えられればそれが示す化合物は一意に定まります。逆に有機化合物から一意に文字列変換するとcanonical SMILESと呼ばれる文字列となります。

例えばベンゼンはc1ccccc1となります。 どの原子が入っているかはアルファベットで表され、芳香環と呼ばれる環に含まれる原子は小文字で表されます。環を巻いている化合物は数字でリンクできるようになっています。(ベンゼンの例だと最初のc1と最後のc1で環をなしているということになります)

便利なことにSMILESから汎用の分子記述子を計算するライブラリがあります。今回のコンペでもそのライブラリを使い、文字列情報を分子幾何学的な特徴に変換しています。

Na+チャネル

我々生物の細胞は、細胞内のNa+濃度が一定になるように保たれており、神経系ではシグナルによってNa+が流入・流出することで先へ先へと信号を送ります。このように細胞内のNa+濃度を調節する役目を担っているのがNa+チャネルです。Na+チャネルはタンパク質でできており、折りたたまれて細胞膜を貫通しています。このチャネルに膜の内外でのイオン濃度の差やシグナル分子を与えるとチャネルが開き、Na+を選択的に細胞内外で輸送することができます。

IC50

IC50は50% Inhibitory Concentrationの略であり、タンパク質が50%機能しなくなる濃度を示します。この値が小さいほど、濃度が低くても阻害するということで、毒性が強い化合物ということになります。

ここで出てくる阻害とは、分子がタンパク質の表面にある結合部位に結合することで、タンパク質がその役割を果たせなくなることを言います。結合部位の形は決まっていて、その形に合うような分子が結合しやすい、つまり阻害しやすいということになります。

 

特徴量

特徴量としてはRDKit descriptor、Mordred descriptor、Morgan Fingerprintと(その二乗)に加えてTanimoto係数を用いました。

Tanimoto係数は、Fingerprintから分子の類似度を数値化したもので、この値は0~1の範囲を取ります。これが1に近ければ分子はよく類似しており、0に近ければ分子はあまり似ていないということになります。今回は外部データの使用が禁止されていたため、データセットにあった3840個の化合物とのTanimoto係数を用いました。

特徴量を作った後は、XGBoostでTotal-gainが大きい方から500個の特徴量を使うことにしました。ここで、Nが大きく10分間で計算が終わらないことがあったため、計算コストが一番大きいMordred descriptorは最大で100個までしか含められないという制約を付けて特徴量選択を行いました。

 

モデル

モデルは5-foldのXGBoostを使いました。最終提出はXGBoost以外にもLightGBM、Ridge回帰、多層パーセプトロン、RandomForestをスタッキングしたアンサンブルモデルでした。しかし、そこまでしっかりとXGBoost以外をチューニングしておらず性能の低いままモデルをスタッキングしていたため、XGBoost単体を上回るスコアは出なかったです。

 

結果

f:id:nougat_nuga:20210129194205p:plain

Q3の最終スコア

結果としては自分のスコアが1.2707、2位の方のスコアが1.3874と大差をつけて1位をとることができました。Tanimoto係数を導入する前はスコアが1.42程度だったので、分子が似たような形をしているかを表す指標を加えたことが優勝へとつながったのではないかと考えています。

 

雑記

ここまででまとまった解法を書いてきたわけですが、ここからはコンテストを踏まえて学んだことをつらつらと書いていきたいと思います。解法の本質はここまで示した通りであり、これ以降は私見を書き連ねます。ご了承ください。

特徴量エンジニアリングは本当に大切

機械学習を勉強したての時は、「特徴量に分子の持っている情報をすべて反映すれば、そこから有益な情報をニューラルネットワークとかが勝手に読み取ってくれて、最良のモデルが得られる」と考えていました。一通り機械学習について勉強してみた今の状況での考えは「この主張は正しいが、現実的ではない」です。理由としては回帰手法の限界がある、ということです。

例えば、x→yの機械学習において、学習データとして(x,y)=(0,0), (-1,1), (1,1), (2,4), (-2,4), (3,9), (-3,9),...があったとしましょう。このデータを線形回帰を用いて回帰しようとしても、うまくいかないことがはっきりと想像できると思います。このように、単体のモデルが表現できることはどこかに制約があり、モデルをチューニングすることによる性能の強化には限界があるわけです。

しかしそこで特徴量としてx^2を追加してやると、(x^2,y)はうまく直線に乗ってくれて、回帰の性能が上がります。

ここから何が言いたいのかというと、モデルをがっちり構築していく前に、目的変数とよい相関がある特徴量を少しでも多く作っておくことが大切である、ということです。面白い回帰アルゴリズムは多くありますし、それを学ぶことでいろいろなモデルを適用できるようにはなります。しかし真に大切なのはコンピュータに厳選された特徴量を与えることです。特徴量をむやみに増やせば、目的変数に相関がある特徴量の数は少しずつ増えていきますが、ノイズも大きくなってしまい、結果として性能は落ちてしまいます。上位を狙うのであれば特徴量エンジニアリングはしっかりとしましょう。

実装スケジュール管理

私の考える理想の実装スケジュールは以下の通りです。

1. (特徴量が与えられなければ)とりあえず特徴量を増やす。(5%)

2. LightGBMやXGBoostなどを用い、ある程度の性能が出るモデルを構築する。ここで自分の環境で特徴量の性能を評価できるCVなどを構築できるとよい。(5%)

3-1. 特徴量をひたすらいじる。どの特徴量がどのような分布をしているのか、目的変数との相関はどうか、などを調べる。自動生成した特徴量から選ぶだけではなく、問題の趣旨に合った特徴量を選ぶ。(70%)

3-2. モデルを構築していく。最終的に各モデルで最も良い性能となるものをアンサンブルするため、様々なモデルでハイパーパラメータをチューニングする。(15%)

4. 細かい調整を行う。余裕があればCVの切り方を工夫し、リーダーボードの値がどう動くかを見る。(5%)

3-13-2は相互に行き来しながら行うとよいと思います。

 

おわりに

このコンテストを通じて、私は機械学習の基本を学ぶことができたと思います。今後の研究生活でも、基礎となる機械学習を用いたアプローチの方法は変わらないと思うので、ぜひとも機械学習道具として使って世の中に新しいものを提案していけたらいいと考えています。

 

ソースコード

べちゃっと張ります。

github.com

create_datasetで特徴量を抽出し、trainでモデルを訓練し、mainで回帰を行います。

最後に出した提出の方がまとまっていますが、スコア的に良かったのでそのまま載せています。ご自由にお使いください。データセットは載せられません、悪しからず。