まだタイトルない

アウトプット用です

【Kaggle挑戦記】MoAコンペ振り返り【#4】

f:id:teyoblog:20201201232444p:plain:w200

こんにちは

kaggle登録して4回目のコンペに参加してきました。

Mechanisms of Action (MoA) Prediction

結果はpublic619位→private204位/4384でメダルなしです。
publicで一回銅圏内までいけましたが最終的にはメダル圏外フィニッシュからのshakedown...ブレンドだけしてる公開ノートが上にあったので流石にshakedownはしないかと思ったのですが残念無念。

コンペ概要

※自分のコンペ用のメモから抜粋 間違った部分ございましたら指摘ください

MoA(作用機序)とは

  • 薬理学における作用機序とは、薬剤がその薬理学的効果を発揮するための特異的な生化学的相互作用を意味する
  • 薬剤が結合する酵素、受容体といった特定の分子標的について言及されることが多い
  • 受容体に結合しないしない薬物は、単に体内の化学的または物理的特性と相互作用することにより、対応する治療効果を生じる。
    • 例:制酸剤・下剤
  • 作用機構(MoA:mode of action)とは、生体が物質に曝露されることによって生じる細胞レベルでの機能的または解剖学的変化を意味する。

なぜ重要なのか

  • 感染症薬の開発では、臨床安全性に関わる問題を予測することができる。
  • 薬剤の特定の部位と受容体の間の相互作用を知ることで、その相互作用を複製するように他の薬剤を処方することができる。
    • 新薬の開発にも使われる
  • どの治療に反応する可能性が高いかを特定したり、投与量の決定に役立つ
  • 併用療法に活用できる
  • 他の適応症を特定できる場合がある
  • ある病気に関連するタンパク質を特定し、そのタンパク質を標的とする分子を開発する事ができる

用語

  • agonist:作用薬
    • 生体内の受容体分子に働いて神経伝達物質やホルモンなどと同様の機能を示す作動薬のこと
  • antagonist:拮抗薬
    • アゴニストの対義語
    • アゴニスト同様に受容体に作用するが、作用することで受容体の活動を抑制する薬剤のこと
  • inhibitor:阻害剤
    • アンタゴニストとは違い、酵素に作用することで、活動を抑制する薬剤
  • activator:活性化剤
    • 酵素活性をもたない酵素前駆体に作用して、酵素活性をもつようにさせる物質

task

  • 206のマルチラベル分類問題
  • 評価値
    • 対数損失関数の平均値

このコンペでの目標

  • pythonの実装力向上
    • NNの実装
    • GBDTの実装

まずはLGBMとNNを実装する

www.kaggle.com
www.kaggle.com
www.kaggle.com
上の3つを参考にしながら自分なりにLGBMとNNを実装してこれをベースラインとしました。

簡単にパイプラインを作ってみる

TabNetという名前もよく見かけていたのでそれのベースラインも作成した後に一旦パイプラインとやらを作ってみる。
参考にしたパイプラインはこちらです。 qiita.com

出来たものはこんな感じ
f:id:teyoblog:20201201231525p:plain

  • MoAベースとはiterative stratificationを指しています
  • LGBMはstratified kfoldでラベル数分(206)モデルを用意

Feature engineering

discussionや公開ノートを参考に入れてみましたが、RankGaussとVarianceThreshold以外は聞いていたのかよくわかりません。

  • PCA
  • RankGauss
  • KMeans
  • GENES CELLSごとの統計量
  • VarianceThreshold

discussionで2以上、-2未満の数値に意味があるみたいな書き込みを見たので、2より大きい数値の数、-2より小さい数値の数という特徴量を作りましたがこれも効果があったのか不明です。

Feature engineeringが一番大事という認識を持っていたのですが特に何が出来たわけでもありませんでした。

EDA

極端な不均衡マルチラベルデータということで、正例の割合とLogLossを並べてみたり f:id:teyoblog:20201201231929p:plain
プロットしたりしました。
f:id:teyoblog:20201201231938p:plain
Lossもratioもある程度高いものに限定して学習したら良いんじゃないかと思いましたがだめでした。 結局この2つの図を生かして何かを解決するには至らず。。。

新しいCV戦略でパイプラインを再作成

コンペ期間も折り返して、drug_idが公開されたことによりdrug_idベースのCVができるようになりました。
公開場所は下記
Drug and MultiLabel Stratification Code

こちらを使ったモデルを作成し直して、スタッキングのパイプラインを作成し、最終的にこれを提出ということになりました。 f:id:teyoblog:20201201232052p:plain

結果

冒頭の通りメダル取れず!

上手くいった気がするもの

  • スタッキング
  • 1st stageにLGBM
  • RankGauss
  • VarianceThreshold
  • label smoothing (privateではだめだったっぽい?)

試したけど上手く働かせられなかったもの

  • ratioとlossが高いラベルだけで学習
  • 2nd stageのtabnet
  • 学習時にサンプリング比率を調整する
  • testデータのdrug_idを common/uncommonに分けて適したモデルに推測させる

今回学んだこと

  • LGBM実装
  • pytorchでのNN実装
  • 簡単なスタッキング
  • optunaでのチューニング
  • modelのシリアライズ

最初の目標となることは学べましたが悔しいものは悔しいですね

今後に向けて

この2ヶ月間色々やることを積んできたので12月はそれを消化するとして、また1月からkaggle master目指して頑張ろうと思います。

取り組み方に悩んでいて、

  • チームを組むとモチベーションが上がるタイプなのでチームで取り組む
  • 1つのコンペに2ヶ月は長いので1コンペ1ヶ月のように少し短めで数多くこなす
  • チームで1ヶ月チャレンジ

んー・・・・なにか持論ある方、チーム組んでくださる方いたら連絡ください。

謝辞

今回声をかけていただいてチームを組むことになりました。この場を借りて、ありがとうございます。 期間中はたくさんの考察や分析を共有してもらい勉強になりました。必死についていこうとしたものの理解に至らなかったものも...自分からなかなか考察/分析を提供できなかったことにはやはり力不足を感じたので今後の課題とします。もしまた機会があったらチームで取り組めたらなと思っております。以上。