atmaCup #5に参加しました(Public2位→Private6位)
先週土曜日から今週土曜日にかけて1週間、atma社が主催するatmaCup #5に初参戦しました。
結果はPublic2位からのPrivate6位で、残念ながらメダルは逃す結果となりました( ´•̥ו̥` )クヤシイ
個人的には短期間のコンペで複数のモデルを試し、最終的にエレガントっぽい解法を作れたので満足しています。メダルほしかったけどね!!!
2020-06-07追記:実装を公開しました!
問題概要
- テーブルデータとスペクトルデータが与えられてとある現象が発生しているか否かを予測する2値分類問題
- 負例の多いimbalanced data
- 評価指標はPrecision-Recall CurveのAUC
- LightGBMもニューラルネットも同じくらいのスコアが出る(良問!)
解法
共通部分
- スペクトルにはscipyのSavitzky-Golay Filteringをかけた
- Savitzky-Golay Filteringをかける際にn次微分を算出し、それを新たなスペクトルとしてデータ拡張した
LightGBM
- テーブル部分は特に凝った特徴量作成はしていない
- スペクトル部分は、スペクトルをn次微分したものに対して集約をかけて特徴量を作成
- パラメータは温かみのある手動調節
- optunaのLightGBMTunerCVがコンペ中にリリースされ、意気揚々と試したが今回はworkしなかった
NN
- テーブル部分をMLPに通し、スペクトル部分をConv1Dに通し、concatして予測
- テーブル部分
- LightGBMのときに作った特徴をrankgaussにかけた
- スペクトル部分
- スペクトルの微分をチャネル方向に追加した
- 大きめのkernel_sizeが効いた
- 複数のkernel_sizeでConv1D→BatchNorm→ReLU→Dropout→GlobalMaxPoolしたものをconcatした
バリデーション
GroupKFoldとStratifiedKFoldを試した。CVとLBの動きに相関が取れていたStratifiedKFoldを採用した。
アンサンブル
OOFを見ながらLGBM:NN=0.25:0.75でrank averageした。爆死した。
コンペ中の動き
序盤(初日〜2日目)
微分が絶対に効くというのは最初から確信していたので、微分×ピーク周りの集約で特徴量を作り、LightGBMにかけた。
結果、早い段階でPublic 1位になり、スタートダッシュ完了。
やったね!#atmaCup pic.twitter.com/U5K3aB8f6U
— えじ|Amane Suzuki (@SakuEji) 2020年5月29日
しばらく同僚のtakuokoさんとshimacosくんとのデッドヒートを楽しむ。
中盤(3日目〜7日目)
平日で仕事があったためあまり時間を割けず、LightGBMの特徴量を機械的に作ろうと考えた。 tsfreshを利用して網羅的に特徴生成をしたあと、Null Importanceに基づいて特徴を削った。しかし、微分×ピーク特徴に全く勝てず、LB上の進捗はなし。
水曜日は有給をとって特徴量をちびちび手作りしていたが、これも効果なし。
悲しくなってオートチェスに逃げたが、オートチェスでも惨敗したので泣く泣くatmaCupに帰ってくる。
#atmaCup の息抜きにオートチェスやったら惨敗して悲しい気持ちになったのでatmaCupがんばります……
— えじ|Amane Suzuki (@SakuEji) 2020年5月30日
終盤(締切前日〜最終日)
DiscussionでNNが強いという噂を聞き、NNを作ろうと考える。
微分が効くのが分かっていたため、スペクトルの微分をチャネル方向に加え、Conv1Dに通すシンプルなモデルを作成。9位くらいに帰ってくる。
進捗した / Nice Hard Work ✒ 現在の順位は 9位です. https://t.co/eesc9F7U3q #atmaCup
— えじ|Amane Suzuki (@SakuEji) 2020年6月6日
kernel_sizeを大きくして、複数のkernel_sizeを並列すると良いことに気づき、5位に進捗。
よっしゃ / public LB は飾りです 現在の順位は 5位です. https://t.co/eesc9F7U3q #atmaCup
— えじ|Amane Suzuki (@SakuEji) 2020年6月6日
作っておいたLightGBMとアンサンブルして2位に。
1位が遠い / 勝ちたい! 現在の順位は 2位です. https://t.co/eesc9F7U3q #atmaCup
— えじ|Amane Suzuki (@SakuEji) 2020年6月6日
結果、shakedownして6位に。悲しみを背負う。NN single modelで出していたらprivate2位だった(なおこいつはCVはそんなに良くなかったので、たぶんどう頑張っても選べなかった)
public2位、private6位で残念ながらメダルはもらえませんでした><#atmaCup
— えじ|Amane Suzuki (@SakuEji) 2020年6月6日
感想
工夫のしがいがあるとてもよいコンペで、atmaCup初参戦ながらとても楽しめました。最近はあまりKaggleには触れていないのですが、データ分析コンペの感覚も少し取り戻すことができました。
面白い問題を用意し、コンペサイトのUIアップデートを含めて1週間コンペを盛り上げ続けてくださった運営の方々、本当にありがとうございました!
LBでいっしょにデッドヒートを繰り広げたみなさま、楽しかったです。入賞されたみなさま、おめでとうございます。次は負けないぞ〜〜〜
以上!