おうちだいすき

自宅警備員からデータサイエンティストになった人の雑記的ななにか。

Santander コンペをふりかえる。

超絶今更ながらになってしまいました。
結果は銀メダルとれました。嬉しいです。
ですが、どこか心のモヤモヤがあったり。

どんなコンペだったの?

スペインだったかその辺の国にSantanderって銀行があるらしいです。
その銀行における、顧客取引の二値分類問題でした。
しかし、カラム200列全て匿名化された上、全て連続値ヒストグラムをとるとおおよそ正規分布、評価指標はAUCで適当にモデルに放り込むだけでもスコア.897(最終日銅メダルLBスコア : .901)みたいなコンペでした。
ぶっちゃけ、「ここまでスコア出てたらもうええやんけ」となっていました。

何故参加し、何故やり続けたのか

単刀直入にいうと、モデリングに不慣れだったためです。
前処理なしでモデルに放り込めそうな点において、私にとっては格好の練習場所だと感じました。 どなたかのコピペなどではなく、自分でバリデーションを切りながらモデルを組む時間をたっぷりと取れました。

ついでに言うと、courseraで習ったstackingも同時に試せたので良い復習にもなりましたし、今後使いまわせる関数が出来たのでこちらも私に取ってプラスになったのではと考えます。

ラスト1週間までの取り組み

ラスト1週間の時点で銅メダルLBボーダーラインは.901でした。
以下に取り組み内容を示しますが、特に大したことはやっていません。

  1. CatBoostでValidation切りながら学習 → 0.898
  2. CatBoostでDataAugmentation → 0.900(以降チームマージするまで全てのモデルにaugmentationを適用)
  3. ひたすらハイパラチューニング → 0.900
  4. 公開kernelのLGBモデルとstacking → 0.900
  5. 効いてる特徴をカテゴリ変数化。何も処理せずCatBoostのcat_featureに放り投げる → 0.900(なお、この時のCVは過去最高を記録し0.9014くらい)

これ、チームマージする際に送ったDMをほぼそのまま貼り付けたのですが、最後の5番、、、、、うっすらMagic Featureにかすってる(と思う)のでこの段階で本コンペで効いた特徴「カウントエンコーディング」を試していればと後悔がまた蘇ります。。。
この時、頭に思い浮かんでいたのは「ターゲットエンコーディング」で、それが故にとりあえずcat_featureにぶん投げてみようと横着をしてしまいました。
猛省します。

チームマージしてからコンペ終了まで

チームメイトの@nekoumeiさんとはチームマージ最終日にお願いしてチームを組んでもらいました。
マージ直後は互いのこれまでの取り組み内容の共有、お互いの最強モデルのアンサンブル、気になるカーネルやディスカッションの共有を行いました。

それ以降は手分けして、手当たり次第に実験していた気がします。kdeプロット見てスパイクしたカラムについて代表値取ってみたり等々。。。 カウントエンコーディングは最後の最後で@nekoumeiさんが気付いたのですが、時すでに遅し。submit制限を超えてしまいました。
結局、最終的なLBスコアは.901で、Leader Board の 銅メダルボーダーは超えられませんでした。
最後に提出したのは@nekoumeiさんの最強のLGBモデルと私のCatBoostモデルと、KernelのLGBM w/ DataAugmentationモデルをBayesian Ridge Regression で stacking したものを提出しました。

テンションだだ下がりで乗車した電車内

結局、最後の最後まで何もわからず、そしてボーダーラインも越えられず、何もかも諦めた状態で眠たい目をこすりながら通勤電車に乗って順位発表を確認しました。
↓その時の様子がこちらです。↓

一瞬何が起こったかわかりませんでした。 どうせ取れるとも思ってなかったし、順位確認するつもりだけでした。
電車の中でギョッとしてたのを思い出します。
大きくshake upしたようです。
stackingの関数作っといて正解だったかもしれません。

順位繰り上がりで得た銀メダル

銀メダルって棚から落ちてくるのですね。初めて知りました。
そもそもあと4〜5人で銀メダルだったところ、私たちより上の20名ほどが失格になったらしく、その繰り上がりで銀メダルになってしまいました。
銀メダル、とても嬉しいです。
嬉しいのですが、銀メダルの上位陣のスコアは.920くらい。
これって、

  • カウントエンコーディング
  • テストデータのFake Data とReal Dataに対する処理を行なっている

最低この2つを行わないと辿りつけなくて、シンプルなようでここに気づくか気づけないかで大きくスコアが変わる印象を持っています。(もし間違っていたり足りない部分があったら、こっそり教えていただければ幸いです)
気付くべきところに気付いて獲得した銀メダル、闇雲にコードぶん回して乱雑にスタッキングして獲得した銀メダル、私はどうしてもこの差が気になってしまいます。
言い出したらキリがない話ではあるとは思いますし、外から見ればどちらも同じ階級に違いはないのですが、とても大きな実力差を感じます。
シンプルに銀メダルという結果に満足することなく、これからも自分が納得出来るように精進していきたいと思います。

ただ、今回の結果はチームメイトの@nekoumeiさんがいなければ獲れなかったのは間違いありません。
寧ろめっちゃ迷惑かけたと思います。。。
沢山のことを教えてもらい、沢山の知識を得ることができました。
感謝してもしきれません。

さいごに

いつも最後までやりきるとそうなのですが、今回もしんどいコンペでした。
ですが、コンペ終盤になって出てきた「木のお気持ち」的な話題は分析初心者の私にとってとても参考になりましたし、コンペ終了後に出てきた以下のKernelは何故カウントエンコーディングが効いたかの説明もなされていて大変参考になりました。
勉強勉強アンド勉強です。

www.kaggle.com

また、@0verfitさんの2nd place solutionから飛べる、Githubリポジトリソースコードの管理方法含めて現在進行形で参考にさせていただいています。
本当はこのリポジトリを読み切ってから書こうと思ったのですがなかなか終わらず、中途半端な状態で記事を書いてしまっているのはナイショです。

メダルを取れたっちゃ取れたのですが、やはり課題を無限に感じるコンペとなってしまいました。
少しでも自分が納得出来るKaggle Lifeを送れるように精進していきたい次第です。