MoAコンペのふり返り
どうも、tacoriceです。
先日終了したKaggleのMechanisms of Action (MoA) Prediction コンペに参加しました。
せっかくなので取り組み内容を残しておこうと思います。
コンペ概要
Mechanisms of Action (MoA) = 「薬の働き」の予測します。MoAとは薬物の作用機序のことであり、薬が治療効果を及ぼす仕組みのことです。 通常、薬がどの標的分子(タンパク質)と相互作用し、どのような影響を与えた結果、治療効果が得られるのかを、分子レベルで言及します。
MoAを予測することは併用療法 や新薬の開発に役立ちます。本コンペは、MoA予測アルゴリズムの改善を通じて医薬品開発を前進させることを目的としています。
本コンペのタスクは、マルチラベル分類です。データ1サンプルに対して1つのラベルが与えられているマルチクラス分類と異なり、マルチラベル分類ではデータ1サンプルに対して複数のラベルを予測します。
また、Code competitionであるので、推論はkaggleのカーネル上で行う必要があります。なお、結果の提出コードはGPUなら2時間、CPUなら9時間以内に実行されるものである必要があります。
データ
本コンペでは、遺伝子発現データや細胞生存率データ等の様々なインプットが与えられた異なるサンプル(sig_id)の作用機序(MoA)応答の複数のターゲットを予測します。予測するラベルは206種あります。
データが不均衡で、50以上のラベルで陽性サンプル数が 0.1% 以下 (20サンプル以下) ですが、 あるラベルでは、陽性数が全サンプルの 3.5% (約830) あります。
また、学習サンプルの 40% がすべてのラベルで 陰性であり、 50% 以上が陽性ラベルを1つだけ持ちます。 一方で、陽性ラベルを7つ持つサンプルもあります。
- train_features.csv : 訓練セットの特徴量(23814個x 特徴量 875個)cp_type は化合物(cp_vehicle)または対照摂動(ctrl_vehicle)で処理されたサンプルを示す
- train_targets_scored.csv : スコア化されるMoAターゲット(206種)
- train_targets_nonscored.csv :追加の(オプションの)MoAターゲット(402種)※ただし、予測もスコア化もされません
- train_drug.csv:学習データのサンプルと薬剤IDの紐付けたデータ
- test_features.csv : テストデータの特徴量(3982個 x 特徴量 875個) テストデータの各行のスコアされたMoAの確率を予測する必要があります
- sample_submission.csv : 正しい形式の提出ファイル
評価指標
log loss score
前処理
Rank Gauss
・数値変数を正規分布に変換(ニューラルネットワークを使用する際の特徴量変換の手法として、 正規化や標準化よりも優れた性能を発揮すると言われています)
・外れ値の影響を軽減
・対象となる値を順位付けし、その順位を -1 ~ 1 の範囲に変換
・変換後の結果を分位関数に適用し、正規分布を取得
PCA
・次元削減と特徴量の追加
Variance Threshold
・分散が閾値以下のデータを特徴量から除外
モデル
今回、マルチラベル分類ということで、GBDT系の勾配ブースティングは使用しませんでした。代わりにNN系のモデルを複数採用しました。理由としては、GBDTは各サンプルに対して1つのラベルを予測することに特化したモデルだからです。一応、サンプルそれぞれに対してモデルを作成すれば予測も可能ですが、206サンプル分必要になり、計算コストもかかります。一方、NN系のモデルであれば1つのモデルで予測が可能です。マルチラベル分類タスクを解くに際してはNN系のモデルを採用した方が良さそうです。
以下、採用したモデル(5つ)
①MLP (with K Folds by Drug ID)
後半から開示されたDrug IDを用いてクロスバリデーションを実施しました。
また、nonscoredを含めたターゲットを用いて事前に学習した重みを用いて、学習を実施。
使用したモデルの中でもっとも良いスコア(public)を出力しました。
②MLP (with DenoisingAutoEncoder)
DAE(DenoisingAutoEncoder)を用いて特徴抽出を実施。また、バリデーションの損失はepoch=30程度から改善しませんでしたが、エポック数を増やすほどCVが改善したのでエポック数を大きめに設定(epoch=70)しました(おそらく過学習)
③TabNet
tabnetは表計算用のディープラーニングモデル。コンペでは、事前学習のないMLPに劣っていましたが、discussionでは予測結果の分布が違うことからアンサンブルに有用だと議論されていました。
④TabNet (with KMeans clustering)
前述の前処理に加えて、kmeansによる特徴抽出を実施。
⑤ResNet
resnetのアーキテクチャを模擬したモデル。
各モデルを以下にアップしたので詳細の説明は省きます。
最終的には上記のモデルをアンサンブルし提出しました。publicとprivateテストデータの分布差の影響を避けるため、アンサンブルにはスタッキング等の手法は使わずに、単純に加重平均を用いました。Yirun Zhangさんが、OOFを用いた加重平均の重みの最適化方法を示したノートブック
を上げてくれていましたが、自分のモデルではスコアが伸びなかったため、最もスコアの高いシングルモデルとの相関の比を用いました。(※基準となるベストシングルモデルの重みは2倍しています)
以下に、各モデルの相関ヒートマップを示します。
相関0.95以下のモデル同士のアンサンブルは精度向上に寄与するといわれており、上記の各モデルがそれを満たしていることが分かります。
また、MLP (with DenoisingAutoEncoder)モデルはエポック70に設定し、かなり過学習していたモデルですが、スコアアップに役立ちました。これは、アンサンブルは一般的にモデルのバイアスを減らして未知の予測精度をよくするものである一方で、バリアンスが高くなりすぎることに対処したものです。下図は、高バリアンスと高バイアスの予測結果を模擬したものです。
MLP (with DenoisingAutoEncoder)モデルのアンサンブル前後で以下のように予測結果の分布に変化があったと考えられます。
実際値に対して少しバイアスが高くなる一方で、予測値の点がアンサンブル前より1つ多く実際値の中に入っており、バリアンスの調整に貢献したことが確認できます。
以上より、シングルモデルのスコアが低くても、相関が大きく(0.7以上)且つアンサンブル後の公開スコアが向上するモデルならアンサンブルに役立つといえそうです。ただ、例外もあり、メラノーマコンペのようにpublicとprivateテストデータが大きく異なる場合は、アンサンブル後のpublic LBが悪くなってもprivate LBは向上する可能性があります。(※メラノーマコンペの時は、高スコアモデルの予測結果に偽陰性の疑いのあるものが多数確認されたため実施)
publicとprivateテストデータが似通ているかどうかはコンペ終了後しか分からないので、上記のようなアンサンブルを行ったものと行っていないもの両方を提出することが1つの戦略だと思います。私は提出用submissionにはそれら2つを選択しました。
結果は、過学習のモデルを少しアンサンブルしたものがprivate 0.01609でした。
public 161st 、private 61st(初銀メダル獲得!!)
まとめ
そういえば、今話題のmRNAワクチンの作用機序は従来ワクチンのそれとは異なる新しいものらしく、摂取に対して不安がないわけではありません。(宿主に変異リスクやウイルス粒子の情報がないため安全と言われていますが)作用機序の予測が安全な薬やワクチンの早期開発に役立つことを願うばかりです。
最近のKaggleはmRNAワクチン開発や作用機序予測など、人類に貢献しそうなテーマが多く、その分だけやりがいがありますね。
残すところ、あと銀メダル以上1つ獲得で目標のKaggle masterです。
画像コンペで連敗しているので画像系でも結果出したいなと思います。
とりあえず、サンタさんにRTX3090をお願いするところから始めようと思います。