バイオ系博士の備忘録

プログラミング関係の備忘録

第4回富士フイルムコンペ参加記録(Q3: 6位)

第4回目となる富士フイルム主催データ分析コンペ(Brain(s))に参加したので、忘れないうちに細々したことを記録しておこうと思います。
本やらウェブテキストやらでデータ分析の勉強しただけで実践はまだだったのですが、Kaggleは画像コンペばっかでとっつき辛いし、ツヨツヨデータサイエンティストとまともに戦える気もしませんでした。
そんなとき学生限定*1富士フイルムテーブルコンペを知って参加しました。

コンペはathleticsというプログラミングスキルチャレンジプラットフォームで行われました。
エンジニア用の就活用コーディングテストみたいな側面もあるらしく、競プロに近いチャレンジから分析系チャレンジまで幅広く扱っているみたいです。
今回参加したのは富士フイルムが主催するテーブルデータコンペで、低分子化合物の化学式(SMILES)から各種物性(記述子)を計算し、溶解度や変異原性を予測するというケモインフォマティクス分析のお題でした。
記述子や分子情報の計算には有名なRDKitというライブラリを主に使いました。

提出モデル(Q3)

記述子テーブル → ランダムフォレストNN ...①
Morgan FingerPrint テーブル → ランダムフォレストNN ...②
記述子テーブル、①、 ②、①+② → ランダムフォレストStacking

f:id:arukuhito_000:20200916225058p:plain
Q3 Solution

accuracy
Final score: 0.848
Final PublicLB: 0.87096
Final PrivateLB: 0.6574

モデル作成までの道のり(Q3)

  1. データ取得*2*3*4
    複数のデータセットをまとめた後で一度は精度が落ちたが、Molオブジェクトへの変換時にMolStandardizeモジュールによって標準化・脱塩・中和処理を行うことで逆に精度は向上した(+0.03くらい)
  2. 特徴量作成
    RDKitから200カラムの記述子と2048カラムのMorgan FingerPrintを、Mordredから1800カラムくらいの記述子を計算*5
    Q2で作成した溶解度予測モデルの値を追加
    他の特徴量エンジニアリングはLeaderBoardが非公開になった後の数日で急いで行った(後述)
  3. 特徴量選択
    Borutaで記述子テーブルを706カラムまで削減
    FingerPrintは特にいじらなかった
  4. Train
    記述子テーブルとFingerPrintテーブルから、ランダムフォレストとNNで予測(計4列)
    モデルはBayesianOptimizationでハイパラチューニングした
    単独モデルの精度はそれぞれ0.8超えたあたりくらい
  5. Stacking
    記述子テーブルに、4列の予測結果(0 or 1)とその合計値(最大4)を追加し、ランダムフォレストで予測*6
    記述子テーブルを付け足す必要があったかどうかは謎
    情報多い方がモデル君も嬉しいだろうと思ってつけた
    過誤を起こしやすい構造を学んでほしかった

スコア推移

RDKit記述子のみ、ランダムフォレスト単独モデル
CV score, 0.816; PublicLB, 0.58くらい; 1回目PrivateLB, 0.51852

アンサンブルモデル追加・データ追加・ハイパラ調整(パラメータ設定のエラーやSMILESの重複が残っていたので、それも除去)
score, 0.810; PublicLB, 0.8387

データ追加
score, 0.841; PublicLB, 0.77419

標準化・脱塩・中和
score, 0.840; PublicLB, 0.87097; 2回目PrivateLB, 0.62037

特徴量作成
score, 0.848; PublicLB, 0.87097; 最終PrivateLB, 0.6574

LeaderBoard非公開後に以下の特徴量を追加したことで+0.034
1. Q2溶解度とMordredのLogS予測値との差分
2. 5次元にPCA圧縮した結果
3. kmeansでクラスタリングした結果(n=5)*7
4. base estimatorsのクラスラベル合計値(大きい値ほど陽性っぽいと予測)

所感

  • Q1–Q3まで3問あり、ケモインフォマティクスに慣れない人もステップアップして取り組める内容で優しさを感じた。
  • Q2はPublicLBが最終スコアとなるため高度な過学習抑制は要求されておらず、俺の考えた最強モデルバトル!みたいな様相。
  • Q3はビジネスタスク寄りで、手法やデータセットの制限も特になかったのでしっかり取り組めば実力が確実に付けられる内容だった。
  • モデルとソースコードをアップロードして採点する方式で(10MB制限)、普段メモリや環境に気を使っていないツケが回ってきたため、これは今後の課題。

全体を通してコードがぐちゃぐちゃになったり勘違い実装があったりしたので、Kaggleで勝つ本の購入検討中です。
が、Stackingのリークなどは自分で実装しないと実感しなかったと思うので、勉強と実装のバランスはこれからも大事にしていきたいと思いました。

あらためてスコア推移を整理してみると手持ちデータの検証精度・PublicLB・PrivateLBの乖離が非常に大きく、如何にモデルを汎化させられるかが鍵だったと思います。
また、Brain(s) slackで日々情報交換が行われており、PublicLBに使用されるデータ数が少ないことが予想されていました。
コンペ最終日付近はスコアが伸びなくても手元のスコア伸びるのを信じてチマチマ頑張ったのが効いてくれて報われました。

入賞するとは思わずにzoom開催の表彰式をぼけーっと聞いてたら自分の名前が挙がっており、めちゃくちゃに慌ててしまいました。
頭が真っ白になってしまって、自分の最後のPrivateスコアと順位と賞品を覚えていないです。すみません。確か6位でした。いいカメラが貰えるらしいです。
初参加コンペで初入賞で嬉しいです。
これをきっかけに、これから色々なコンペに出てみようと思いました。

参考

コンペ後に公開された他の参加者の取り組み例

何かと便利なサイト

*1:年齢制限ギリギリでした。なんか申し訳ない。

*2:http://doc.ml.tu-berlin.de/toxbenchmark/ 参加者全員に渡されたデータ

*3:https://pubs.acs.org/doi/abs/10.1021/ci300400a

*4:https://www.sciencedirect.com/science/article/pii/S1383571820300693

*5:開発者が日本人なので日本語解説が豊富

*6:このとき学習データ全体を使ってしまったので、リークしてしまった。あとからOut-of-FoldやHoldoutTSの手法を知ったので、以後気を付けたい。

*7:testはtrainで作成したモデルからの予測値を用いた