riron1206 / kaggle_MoA

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

kaggle MoAコンペのコード

コンペ概要

  • 薬の作用機序(MoA)の応答を予測する

    • MoA. mechanism of action: 薬物が生体に何らかの効果を及ぼす仕組み、メカニズム。特定の分子の生物学的活性。要はお薬が病気の原因に届くまでの流れのこと。
    • 治験薬の活性値からその治験薬はなんの薬の効果を出すかを予測するモデルを作る
  • テーブルデータ

    • 約5,000種類の薬を使った実験データ
      • 1行1実験
    • 1つの薬について7行ある
      • 6通りの実験条件(cp_time列, cp_dose列の組み合わせ) + 薬投与なし の7行
    • 薬の種類を識別する情報なし
      • KfoldでCV作ると同種の薬のデータが混じってリークする。薬の種類でGroupKFoldしたいができない
      • コンペ中に薬のidファイルが追加されMultilabelStratifiedGroupKFoldできるようになった
    • 特徴量はヒトの遺伝子発現や細胞生存率の数値データ
    • ※遺伝子発現(発現). Gene expression:遺伝情報に基づいてタンパク質が合成されること(DNA→(転写)→RNA→(翻訳)→タンパク質のサイクルをセントラルドグマという)。また発現される量(発現量)のことを発現ということもある。
      • 列名が「g-」の特徴量(g-0からg-771の772列)がヒト遺伝子の発現値。1列1列がALKやPI3Kなど各遺伝子についての発現値のはず。
        • 発現値の種類は不明。-5-5の値なのでIC50ではなさそう
        • 「このデータは、100種類の細胞タイプのプール内の薬剤に対するヒト細胞の反応を同時に(同じサンプル内で)測定する新技術に基づいています」と書いてるからマイクロアレイとか次世代シーケンサーでとった値?
    • ※細胞生存率. Cell viability: 生細胞数/全細胞数のパーセンテージ。
    • ラベルは206種の薬の作用機序(MoA)の応答(0/1)
      • 1列1クラス。クラス名が薬の名前。なので206クラスある
      • 薬は 5α還元酵素阻害剤、11-β-HSD1阻害剤 など
      • 非常に不均衡(0のラベルが大半で1のラベルが非常に少ない)
  • マルチラベル分類問題

  • 評価指標は各クラスのlog_lossの平均値

  • コンペ概要日本語訳:


最終submitはチームのアンサンブル(35位)

moa_pipeline

自分が作ったモデル

2クラス分類のLightGBM

LGBMClassifier + ClassifierChain

XGBClassifier + ClassifierChain

Self-Stacking + 2クラス分類のXGBoost

cuml + 2クラス分類のSVM

遺伝的アルゴリズム + cuml + KNN

DummyClassifier + MultiOutputClassifier

MLP(層の数変えた5種類)

StackedTabNet

GrowNet

  • cv: 0.01589
  • ※1,2層程度の浅いMLPを弱モデルとしてブースティング。浅いMLPを1epoch学習→最終層の出力を特徴量列に追加→浅いMLPを1epoch学習→… を繰り返す
  • https://www.kaggle.com/anonamename/moa-grownet

作業ログ


Qiitaに投げた記事


上位解法

  • 1位の解法
  • 2位の解法
    • 最初に全結合層を1つ入れることで入力フィーチャをそれ自体で意味のある順序に並べ替える(誤差逆伝播により意味のある並び替えになる)→1D-CNNのモデルを使ってる。この正しい並べ替え+1D-CNNを使うモデルはLB:0.001601でこのコンペで一番高精度なモデルになってる
    • cp_time、cp_doseは除いた
    • https://www.kaggle.com/c/lish-moa/discussion/202256
  • 3位の解法
  • 4位の解法
  • 5位の解法
  • 7位の解法
    • Early Stoppingを各クラス単位で行うことしてた。普通は全クラスの平均で打ち切るところを
    • private test set含めたPCAしてる。つまり、submit時に学習+推論両方している。CVは悪化するが、Private LBは良くなってる
    • https://www.kaggle.com/c/lish-moa/discussion/200808
  • 8位の解法
    • マルチラベルをマルチクラスに変換。一意なラベルの組み合わせが328通りしかないので
    • マルチクラスは単独モデルとしては精度悪いがアンサンブルで非常に強力。他のモデルとは相関低いので
    • https://www.kaggle.com/c/lish-moa/discussion/200992
  • 14位の解法
    • スタッキングモデルを含め、TabNetなどの6つのモデルすべてをブレンド
    • テストセット用のnon scored targetsを作成するモデルを作成している(よくわからん)
    • https://www.kaggle.com/c/lish-moa/discussion/200585
  • 27位の解法
    • 3種のMLPのアンサンブル(TabNetなし)
    • オリジナルの特徴量+1段目モデルの予測値を2段目モデルの入力にしてスタッキングしてる。スタッキングでprivate LB 0.00001 下がってる
    • MLPの単純平均のアンサンブルだけでprivate LB 0.00002 も下がってる
    • https://www.kaggle.com/c/lish-moa/discussion/200630
  • 30位の解法
    • 4つのモデルの平均的なブレンド
    • 後処理として、[1e-5; 1-1e-5]のクリッピング
    • lr = 1e-5とSGDオプティマイザーでPseudo Labelling効いたみたい(学習率下げたら効いたのかな?)
    • https://www.kaggle.com/c/lish-moa/discussion/200679
  • 36位の解法
  • コンペ中ずっと1位だった猫の解法(private LBは560位)
    • oofでモデルブレンディングの重み最適化してる。最適化後、MultilabelStratifiedKFoldで1から学習してる(我々のチームのようにscipyで最適化すれば1回ですむのに)
    • 予測値0.0014/0.99を超えるサンプルをバイナリラベルに置換する後処理はpublic LBで効果あったみたい
    • Pseudo Labellingも使ってるがよくわからん
    • 選んだサブミットが悪かったみたいだが一番良いスコアでも銀圏
    • https://www.kaggle.com/c/lish-moa/discussion/200338
  • コンペ中3位の解法(private LBは118位)
    • cvではなくLBを信じたためshake downした
    • NVIDIA RAPIDS UMAPで画像にした DeepInsight などのモデルブレンド
    • test setの分布がtrain setとは異なると予測(trainで全然ないターゲットがtestで頻繁に発生する可能性)
      • test setの各ラベルの平均はわからないから、モデルの予測値がほぼ0のクラスは全ラベルの平均値に近づけるようにした
    • https://www.kaggle.com/c/lish-moa/discussion/200614

マイナークラスの行を増やして学習すればLB 0.0003 - 0.0004改善するらしい

TabNetだけでpublic LB = 0.01833だしたらしいパラメ

n_d = 32
n_a = 256
n_steps = 1
gamma = 1.5
lambda_sparse = 1e-7
LEARNING_RATE = 8e-3
wd = 1e-5
div_factor = 10
EPOCHS = 500
BATCHSIZE = 248
GBATCHSIZE = 64
n_independent= 1
n_shared = 0 

コンペ後にtrain set/public test set/private test set のラベルの分布に違い証明してるディスカッション

  • public test set の分布は他のsetより明らかにいびつ
  • train setとprivate test set の分布は同じ
  • このためcvとpublic LBで完全な相関がなく、cvを信じたチームはshake upした
  • https://www.kaggle.com/c/lish-moa/discussion/200832

ラベルスムージングは学習データとテストデータのラベルの分布が違う場合に効く

About


Languages

Language:HTML 52.2%Language:Jupyter Notebook 47.2%Language:Python 0.6%Language:Shell 0.0%