富士フィルムコンペ総合1位解法・アプローチ(化合物の溶解度予測2位、変異性予測2位)

富士フィルムさんが開催された、Brain(s)コンテスト 化合物の溶解度予測、変異性予測のコンペの解法

Koya Tango
Koya Tango
富士フィルムコンペ総合1位解法・アプローチ(化合物の溶解度予測2位、変異性予測2位)

はじめに

富士フィルムさん主催の富士フイルム データサイエンス チャレンジに参加してきました。 コンペでは「Q2: 化合物の溶解度予測」と「Q3: 化合物の毒性予測」の2つのタスクがあり、両者2位(1位にはなれなかったorz)の成績で、総合1位を取れました

賞品として定価170,000円ぐらいのカメラ(FujiFilm X100V)を頂きました。ありがとうございます。

ここではその解法を纏めておこうと思います。

全体的なルール説明・そこからアプローチ

コンペのプラットフォームにはtrackというコーディングテストに用いられるサービスで行われました。カーネル形式のコンペで、submitは10MB制限があり、コンパクトに収める必要があります。

評価

評価指標に関しては、Q2はPublicLBのみで順位付けされました。Q3はPrivateどころか実世界データ(富士フィルムさん社内データ)で行われました。ここから僕は、以下のようなアプローチでモデルを組みました。

  • Q2に関してはCV(クロスバリデーション)せずにひとつのごついモデルで推論
  • Q3に関してはCVして無難なモデルを作ることを意識

よくKaggleのDiscussionでは、上図のようなスパイダーマンの画像が出ており、訓練時のデータセットとPrivateのデータセット、そして現実世界のデータセットとのドメインの差が非常に難しい事が取り上げられます。

富士フィルムさんのコンペでは「Q2: 化合物の溶解度予測」に関しては赤線の組み合わせの訓練データとPublicLBとなっており、「Q3: 化合物の毒性予測」に関しては緑線で囲ったような訓練データと実世界データ組み合わせとなります。

このことから、特にQ3は非常に難しい問題設定となることが予想できます。なので、Q2は攻めのモデルQ3は無難なモデルを作ることを心がけました。

使用ライブラリ

モデル作成

  • Scikit-learn

    • モデル作成からスタッキングまで
  • DeepChem

特徴量作成

  • RD-kit

  • Mordred

    • RDkitより多くの記述子が計算できるライブラリ
  • DeepChem

使った特徴量説明

  • Count

    • 炭素・酸素・塩素の元素の数を単純にカウントしたもの,微妙に上がる
  • 記述子

    • RDkitやMordredで計算できる化合物の特徴量の事
    • 分子の一部の特徴を表す
    • 主にこの特徴量が効いた
  • FingerPrint

    • 分子の全体の特徴量を表す
    • 正直効いているか微妙

(参考: https://future-chem.com/rdkit-fingerprint/)

Q2「化合物の溶解度予測」

問題説明

Q2は、「分子構造を表すSMILES(string型)から物質の溶解度を予測する回帰タスク 」です。 SMILESというのは例えば「c1(ccccc1)CHCl」のような化合物を文字列で表すフォーマットのようなものらしいです。 データセットは富士フィルムさんが事前に用意されており1000rows近くのデータでした。

解法

モデルのアーキテクチャは以下の様になりました。

GCNは以下のような感じのモデルになっています。レイヤーのサイズも小さめ、dropout率高め、epoch数も15とできるだけ汎化性能が上がるように意識しました。コードで書くと以下の様な感じです。

from deepchem.models import GraphConvModel

GraphConvModel(n_tasks=1, batch_size=100, graph_conv_layers=[16,16], dense_layer_size=32, dropout=0.6, learning_rate=0.01, mode='regression', model_dir=current_dir + "/graph_model")

アプローチを簡単にまとめると

  • とにかく特徴量を作る (Count, Mordred, MorganFP, CircularFP)
  • lightGBMのFeature Importanceで特徴量選択
  • とにかくいろいろなモデルでスタッキング (各回帰モデル, GCN, SVR)

といった感じです。

LBの遍歴は

  • LGBM+Bagging+Linear+ExtraTreeSVR Stacking。特徴量はRDKit+Count

    • LB: 0.827
  • Mordred特徴量LGBM特徴量選択追加

    • LB: 0.834
  • GCN(Graph Convolutional Networks)を追加

    • LB: 0.841
  • MorganFP+CircularFP特徴量追加、Ridge+Elastic+RandomForest+GradientBoost+XGB+MLP追加

    • 最終LB: 0.846 (2位)

Q2感想

どうやら最終LBは1位の方は0.8467で私は0.8464で2位3位の方は0.8463でめちゃくちゃ熱戦で驚きました。。。

ちょっとゴリゴリにモデルを組んで解いてたのですが、1位の方は特徴量エンジニアリングをしっかりされており、いろいろな特徴量を作成していました。それで簡単なモデル(ほぼRidge回帰)で僕より高精度を出されていて驚きでした。教科書には、Kaggleで勝つ本を使われていたらしくて、「まじで勝ってんじゃん」と思いました。個人的に、もうちょっと特徴量についても勉強せねばと反省しました。

Q3「化合物の毒性予測」

問題説明

Q3は、「分子構造を表すSMILES(string型)から物質が変異するかを予測する二値分類タスク」です。物質が変異するかしないか(Mutagenicity)を調べる試験をエームズ試験というらしいです。

データセットは用意されておらず、個人で探すところまでがコンペでした。

データセット収集

Google Dataset Searchで「Ames」「Mutagenicity」とかで検索 しました。

結果、以下のデータセットを使用しました。

解法

非常に無難なモデルで恐縮ですが、以下のような構造になっています。

一応、試したことは以下です。

欠損値の穴埋め

  • 記述子計算時(RD-kit, mordred)計算失敗が多発

    • 平均値でpaddingしても効果なし

スタッキング

  • Ridge+XGB+LGBM+MLPでスタッキングしてみた

    • 効果なし(lightGBM単体のほうが強い)

スケーリング

  • SklearnのScalerを試すも、効果なし

lightGBMのハイパラ

結局色々試したのですが、lightGBMのCVしたモデルが一番良かったです。 lightGBMのハイパラのチューニングはnum_leaves (葉の数)とmin_data_in_leaf (ノードの最小データ数)を手動で頑張って調整しました。結果的には、num_leaves=5, min_data_in_leaf=24に設定しました。

個人的な感想ではあるのですが、num_leavesは結構lightGBMのハイパラの中でもスコアを左右する値なので結構頑張ってチューニングすると良い結果が得られるかもしれないです。

Q3感想

最終のLBは1位の人が2位より1%ほど高かったのですが、2位はなんと同率が3人いてこのコンペの難しさを表しているなぁと感じました。

どうやら1位の人がたまたまテストsubmitしたモデルがずっとこのコンペで1位だったらしく頭を抱えられてたのが面白かったです。(エンタメ的な意味でも、現実のタスクは難しいなぁという意味でも)

おわりに

以上が富士フィルムさん主催の富士フイルム データサイエンス チャレンジに参加した備忘録です。

化学物質のコンペというのは富士フィルムさんならではで楽しかったです。

どうやら、冬にも何かしらのコンペを開く予定があるかもという噂なので、興味が出た方は是非開催された際は参加することを勧めます!