Paoの技術力を磨くブログ

機械学習やブロックチェーン等の技術を身に付けていくブログです。

【kaggle奮闘記】malwareコンペ〜天国と地獄〜

kaggleばっかりやっていてブログを更新していませんでした。
kaggleやってる最中に内容ブログに書くとルール違反になっちゃうのでなかなか難しいですね。。 先日までkaggleのmalwareコンペに参加していて、かなり頑張ったコンペだったので、振り返りがてら記事にしました。

kaggleのこと知ってる前提なのと、あまり技術的な内容は含んでない日記です。

malwareコンペとは

PCの状態に関する情報から、そのPCがマルウェアに感染してたかを予測するコンペ。
コンペの特徴としては

  • trainとtestで感染したかどうかの判定日が時間的に異なる(testのほうが1,2ヶ月後)
  • さらにtestの中でもPublicとPrivateで時間が異なる
  • アンチウイルスソフトやOSのバージョンといった情報が感染率によく影響を与えるが、時間が異なる影響でtestにしかないバージョンが多数ある
  • データ量が多い(train、testともに800万レコードくらい)

といった感じ。特にバージョン特徴量の扱い、train/test(public)/test(private)で時間が異なる点が大きい。

最下位からのスタート

年末に出した最初のスコア。

AUCで0.3って... まぁ感染したPCではなく、感染してないものを予測した値を出してたので、当然の結果。

全員抜いてやる...!!
ここから全てが始まった。

育児の合間のkaggle

言い訳にしかならないのであまり書きたくはないが、10ヶ月の息子の育児もありそんなにkaggleの時間はとれない。
基本は通勤時間に情報収集やアイデア出しを行い、時間が取れたときに出来る範囲でコーティング。
kaggle自体よりkaggleの時間を作るほうが頑張ったかもしれない。いや、頑張ったのは妻である。

なんで子供が出来てからkaggle始めたんだろう?

LightGBMでの苦戦

これまでのコンペではほぼLightGBMしか使ってなかったので、今回もLightGBMで始めた。
だが、バージョン特徴の扱いに苦戦し、頑張ってる割にスコアが全然あがらない日々。
1月後半時点でLB0.691くらいだった(その時点で上位10〜20%くらいだったはず)

ニューラルネットワーク(NN)への挑戦

前々からNNでkaggleしたい気持ちがあり、今回のコンペはデータ量が多く相性がいいと判断し、NNでチャレンジ。
麻雀AIを作ってたときからNNで遊んでいたので、あまり時間をかけずモデルを作れた。

すると、LightGBMより調子がよくスコアがどんどん伸びていく。 基本的な前処理を丁寧に行い、アーキテクチャのチューニングをしたら、特に新しい特徴量をほぼ作らないまま、シングルモデルで0.695までいった。
しかもアイデアはまだまだある。これは来たと思った。

はじめてのチームマージ

シングルモデルが0.695までいった時点で、複数のNNのブレンドで0.697、LightGBMと合わせると0.698になった。(その時点で、20位台前半)

金メダルが見えてきた。

ここでチームマージを考えた。やはり何としても金メダルがほしい。

そして順位的にもマージしてもらいやすく、かつNNで精度が出ていることから、LightGBMだけでやってる人とチーム組んだら相乗効果が高いと判断した。

はじめてのチーム戦であり、近い順位の日本人であるyiemonさんに声をかけた。

今回のコンペで一番の功績はこのチームマージだったかもしれない。

yiemonさんはその時点で、LightGBMシングルで0.697を出していた。 チームマージ依頼に快諾していただき、初のチーム完成。
お互いのベストモデルのブレンドをサブミットしてみると、0.701!暫定7位まできた。

金メダルの可能性が一気に上がった。

スコア停滞期

チームマージ後、お互いの特徴量やアイデアの共有、ディスカッションを繰り返した。 それにより、少しずつスコアが伸びていくが、周りも伸びていく。
NNも論文読んで実装したり、色々やってみるがいまいち伸びない

また、この頃子供の夜泣きがピークで、2時間おきくらいに起きる。スコアが伸びてないからって泣かないでくれ。。

110位が130位になってもあまり気にしないが、7位が12位になるとすごく気になるんだね。。

kaggle masterへ王手

GoogleAnalyticsコンペ(通称Rコンペ)の結果が出る。
このコンペも語ると長くなるが、とりあえず色々省略し銀メダルだった。これで今回金メダルをとればkaggle master!!
Rコンペのメダル込みでMasterでいいの??っていう心の声は聞こえたが、いったん抑え込む。

一人合宿の始まり

3月の頭に嫁と子供が友人の結婚式のため実家に帰り一人暮らしが始まった。
またコンペ終盤だったので、そのまましばらく実家にいるという配慮もしてくれた。 嫁への感謝と寂しさと共に、生活をkaggle中心に切り替える。

さすがに取り組める時間が一気に増えた。 一人暮らしってこんなにkaggleできるのね。

特徴量探し

この頃、コンペ上位にonoderaさんやnyanpさんといった強い日本人kagglerたちが一気に上位にきていた。
何でそんな少ないサブ数でそこまでいけるんや。。

チームディスカッションの結果、これは重要な特徴量が何かあると推察し、EDA、特徴量探しにチームで努めた。

ついに神特徴量の発見

EDAのグラフをひたすらslackに貼って議論を繰り返したが なかなか見つからない。。

そしてコンペ終了10日前、 前日夜遅くまで直接ディスカッションをやったかいあって(多分)、yiemonさんがついに神特徴量を発見する。

特徴量としては、該当日のカテゴリのシェアやその変化率など。
私が見つけたわけではないので詳細は割愛。

そこから約1週間、その派生で特徴量を増やし、LGBMシングル0.707、NNシングル0.706を達成。

それぞれのシングルモデルどちらも金メダル圏内。

これは勝った。
金メダルというか賞金も現実的になった。

ちなみに残りサブ数は限られていたので、特徴量のパターン追加やFFM系のモデル作成などに出来るだけサブミットは使い、 ブレンドはぎりぎりまでしなかった。

ついにLB1位を達成

最終日前日、ここで神特徴量発見後、初のブレンドを行う。 LGBM同士ブレンドしたものとNN同士ブレンドしたもののRankAverageを利用。 (CVが信じられないコンペだったのでStackingはしていない)

きたあああああああああああああ
最下位から始まり、ついにここまできた。

ちなみに数時間後に、他の日本人チームに抜かれて最終的にはPublicLBは2位で終了。

ラストスパート

最後はやはり、ブレンド勝負。
混ぜれば混ぜるほどスコアが伸びる(迷信)。
銀〜銅メダルくらいであれば、サーバコストかかるしやらないが、 Prize圏内にいるとなれば話が違う。

後悔はしたくなかったので、 これまでやってきて精度が悪くなかったいろんなアーキテクチャのNNのモデルを作る

f:id:go5paopao:20190326123450p:plain

AWS様への廃課金。 仕事でもこんなGPUサーバ立てたことない。 まぁ賞金もらえれば、これくらいすぐに清算できるしね。

そして最終順位発表

ついにメダル、Prizeが発表される14日の9時前。
最後まで議論して悩み抜いて決めた2つのサブミッション。
Prize逃しても金はとれるように選んだ2つ。

そして9時になり、ブラウザを更新する。

。。。

 

。。。

 

。。。

 

。。。

あれ、まだスコア計算中かな?
順位がバグってるぞ?

もう1回更新してみる。

F5..

 

F5..

 

F5..

 

変わらない。

順位を確認してみる。

f:id:go5paopao:20190325210659p:plain

f:id:go5paopao:20190325210854j:plain

いや、もっと呆然としてた気がする。

2位から1500位?うそやろ?全然理解できない。

しかしtwitterを見てると皆呆然としており夢ではないことに気づく。

どうやら盛大なshake downを食らったらしい。

振り返る

masterになってるはずだったのにおかしい。 。

いまだに消化できない。。。

とまぁこんな感じで絶望しながらも、少しでも消化するためにこんなブログ書いちゃいました。

メダルすら取れてないけど、最終日にPublicLBで1位、2位までいけたことは自信につながりました。

ほんとはチーム戦の楽しさや真面目な技術的な内容も書きたかったけど、そんな雰囲気じゃなくなったのでやめます。

このままでは終われないのでどこかのコンペでリベンジしてやります。

みとけよおおおおおおおおおおおおおおお