シナモンが金メダルを3つ取ってKaggle Masterになるまでにやったこと

どうも、Kaggle界のシナモンです。https://twitter.com/mamas16k 

シナモンはKaggleを一旦やめる予定です。これを機に、これまでやってきたことをまとめようと思います。

 

機械学習を始める前(高校~学部1年の夏まで)

シナモンは早稲田の付属高出身で受験もなく、毎日ネトゲやエロゲをして遊び暮らしていた。

シナモンは少し囲碁が打てる(当時KGS6d, 東洋囲碁7段)のだが、AlphaGoの台頭には非常に大きく衝撃を受けた。というのも、ちょうどその時の強いMCTSベースの囲碁BOT (Zen19シリーズ) はシナモンと同等か多少弱い程度の強さであり、プロ2段であるfanhuiに突然BOTが勝利したのはあまりに急激な進化であったからである。

その後AlphaGoはセドル、そしてke jieすらもボコボコにしてしまい、もう「囲碁は人間がやるゲームではない」という認識を持つと共に、機械学習の強力さを思い知らされた。

 

機械学習を始める & 勉強期間(学部1年の夏~学部2年の2月)

シナモンは応用物理学科に入学した。大学に入ってから何をやればいいのか迷っていたシナモンは、友達に誘われてとある学生団体に入り、プログラミングと機械学習を始めた。友達と一緒に勉強するのは非常に楽しい日々だった。当時はコンペに出ていなかったため学業との両立に関するプレッシャーも少なかったというのが大きかったと思う。

 

ALBERTでバイトをする(学部2年の2月 ~ 10月)

シナモンはgitの使い方すら怪しい初心者ではあったが、団体の先輩に誘ってもらい、ALBERTという企業でアルバイトを始めた。当時はsshの使い方すら知らなかったので多大な迷惑をかけてしまったが、業務をしながら多くのことを学ぶことが出来た。

もちろん詳しくは言えないが、この年の (確か) 10月までimage classification & image segmentationに関するタスク等に従事していた。

 

初めて機械学習コンペに出る(学部2年の4月 ~ 7月)

シナモンはバイトの業務で多少画像の扱い方には慣れていたので、機械学習コンペに出ることにした。ただ、言語の壁もあるし、いきなりKaggleで上位に入るのは厳しいだろうということで、SIGNATE(当時はoptという名前だった)の大会に出ることにした。これが「3連靴下*1」で有名なユニクロコンペであり、テーマは画像の色分類である。

シナモンはこのコンペのために1080Ti × 2のマシンを自作したのだが、結局色々あってあまりNNは使わなかった。(正直言い訳になってしまうが)コンペ終盤が大学の試験と被ってしまったこともあってシナモンは体力的に参ってしまい、最終的にあまり良い結果を出すことは出来なかった。結局6位/517人で、特別賞で10万円をもらった。

f:id:mamastan:20190419011224p:plain

結果は芳しくなかったが、このコンペでシナモンは非常に多くの手法を試し、おかげでかなり機械学習に慣れることが出来たと思う。

何よりも良かったのは、表彰式で多くの方と知り合うことが出来たことである。

(@shunk031さん、@odan3240さん、@threecourseさん等)

特に、その後threecourseさんには(何も実績もないにも関わらず)ユニクロコンペにおける手法の面白さを買われて(?)10月のkaggle meetup(https://connpass.com/event/66431/)に登壇者として招待して頂いた。これが当時のスライドである。

 

 

2回目の機械学習コンペに出る(学部2年の10月 ~ 11月)

 うちの学科の学部2年の勉強は本当にキツく、自分はバイトを続けていた上でコンペをやっていたため、この時期は本当に地獄だった。更にKaggle Meetupの登壇のための発表準備等もあったため、本当に寿命を縮めたと思う。

その甲斐もあってか、2回目のコンペであるSIGNATE引っ越しコンペではPublic/Private共にダントツで優勝し、賞金30万円を得ることが出来た。正直ユニクロコンペの1/5もこのコンペには時間をかけてはいないのだが、テーブルコンペは「気付き」で簡単に勝ててしまうのが面白いところである。

これは引っ越しの需要を予測するコンペであり、単変量時系列に対するseasonalityやtrendの処理がテーマとなるコンペであった。(このためにARIMA等の時系列解析の勉強もした)

f:id:mamastan:20190419012154p:plain

 余談だが、シナモンは無理が祟って結局2年後期の試験で倒れてしまった。が、負けず嫌いでキレる若者のシナモンは決して止まらない。まだKaggleにすら参加してないのである。

 

Kaggleに初めて出る(学部2年の3月 ~ 学部3年の5月)

 メモリ128GBのマシンを組み立て退路を断ったシナモンは、ついにKaggleに挑戦することにした。

 https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection/overviewである。

当時のシナモンはまさに狂気であった。ありとあらゆる特徴を試し、実験を高速に繰り返し、睡眠時間はモデルの学習時間に合わせて決めていた。最終的には、特徴が肥大化したため、GCPでストレージ15TBとメモリ1.4TBのインスタンスを使って戦っていた。シナモンは途中から@actu3さん、Michael Jahrer、Danijelの3人の素晴らしいチームメイトと組んで戦った。しかし、シナモンの狂気とチームメイトの努力も空しく、shakedownにもあってしまい、最終的には5位/3951チームで終わってしまった。

f:id:mamastan:20190419014346p:plain

この結果にはシナモンは今でも全く納得していない。おそらく今であればduplicates problem*2にも気付けたはずだし、LightGBMの気持ちをより理解している今ならもっと違う戦い方が出来たはずである。

ちなみにソロスコアは0.9836で、アンサンブルして0.9840まで上がったのだが、6位とのgapが大きすぎて結局順位に差がなかった(泣)

自分のsolution、@actu3さんのsolutionは以下を参照して欲しい。

https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection/discussion/56406#latest-329920

https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection/discussion/56319#latest-326575

まあ、過ぎたことは仕方ない。シナモンは気を取り直して次のコンペに向かうのであった。

 

DeNAでバイトする(学部3年6月~学部3年9月まで)

シナモンはあの@0verfit氏に誘われ、DeNAでバイトをすることになった。あまり詳しくは言えないが、自分は主に野球関連のタスクに従事しており、特には@0hnishiさんには本当にお世話になった。サマーインターンの@lyakaapさんであったり、色んな優れた方々と同じ職場で仕事をすることが出来、本当に楽しい日々であった。ちなみにシナモンはホークスファンである。

 

2回目のKaggle(学部3年10月~学部3年12月)

シナモンは応用物理学科なので多少物理のことが分かる。ひょっとしたら知識を生かせるかもしれないと思い、巨大望遠鏡を用いて観測したmulti-bandの光束の時系列データを分類するコンペに出場した。(https://www.kaggle.com/c/PLAsTiCC-2018)このコンペでも@nyanp さん, yuvalという素晴らしいチームメイトに恵まれ、shake-downするもなんとか3位/1094チームとなり初めてKaggleで入賞することが出来た。チームメイトと自分のsolutionについては以下を参照して欲しい。ちなみに優勝チームは超新星の専門家であり、ボコボコにされてしまった・・・。

https://www.kaggle.com/c/PLAsTiCC-2018/discussion/75116#latest-443479

https://www.kaggle.com/c/PLAsTiCC-2018/discussion/75131#latest-443356

https://www.kaggle.com/c/PLAsTiCC-2018/discussion/75222

f:id:mamastan:20190419020147p:plain

 ちなみに、このコンペでは5位と6位のスコアの差が異常に大きく、talkingdataと同じく実質5チームで戦っている気分であった。

 

3回目のKaggle(学部4年3月~学部4年4月)

シナモンはもう研究室配属も決まり、もうKaggleには出られないと思っていた。Kaggle Masterの要件は金メダル1個 & 銀メダル2個であるため金メダル2個の自分はMasterにすらなれずに終わりか、と思っていたのだが、突然見知らぬ人から謎のSlackが飛んできた。

f:id:mamastan:20190419020828p:plain

なんと、コンペに参加していない自分に対してチームマージ申請が来たのである。正直どれだけ貢献出来るか不安であったが、Kaggleコンサルとしてコンペに出ることに決めた。基本的にはたまにskypeで議論するという形でコンペに参加していたので、主戦力だったわけではないが、議論によって生まれたアイデアでスコアが上がったときは本当に嬉しかったのを覚えている。

是非、nagiss君の記事も読んで欲しいです。

https://nagiss.hateblo.jp/entry/2019/04/18/225459

最終的にDeNAの時に同じ職場で働いていた@ihcgT_Ykchiさん、Vicens、Graseckともチームを組み、shake-upのおかげもありなんとか9位/8800チームになることが出来た。自分はそこまで大きく貢献出来たわけではないが、チームメンバーの努力、そして何よりnagiss君の素晴らしいNNには本当に感謝しかない。是非nagiss君のsolutionを読んでいただきたい。まあこのコンペの意義は謎だけどな!

https://www.kaggle.com/c/santander-customer-transaction-prediction/discussion/89302#latest-516440

f:id:mamastan:20190419021713p:plain

そして、このコンペで3つ目の金メダルを獲得した自分はnagiss君やチームメイトと共に晴れてKaggle Masterになることが出来た。

また(3年終了時なので正確には確定ではないが)、4月に入って学科で首席であるという連絡を頂いた。色々なアクシデントもあったが、Kaggleと学業を両立することが出来たのは自分の誇りである。もちろん、実際は見せかけの成績であり、自主的に物理/数学に関する勉強をしている同期の方々と比べると全く実力は伴っていない。が、それでも勉強は(特に数学系の科目が)ある程度楽しかったし、大学においても多くのことを学ぶことが出来たと感じている。

 

これから(学部4年4月~)

研究はkaggleと両立できるほど甘いものではないと思っているため、これからは基本的には研究に集中する予定である。ただ、少し迷っている点があるのも事実である。というのも、研究にリソースを割かなければ最悪でも学生中(運が良ければ学部生中)にKaggle GrandMasterになれる自信はあるし、研究とどちらが自分にとってプラスなのかわからないからである。

 

最後に

LBで競ったKagglerの方々とtwitterで煽り合ったkagglerの方々、支えてくれた家族、彼女には感謝しかないです。

いつになるか分からないですが、また皆様と一緒にKaggleが出来る日を期待しています。ここまで読んで頂きありがとうございます。

 

 

 

*1:https://speakerdeck.com/mamastan/deep-learningyi-wai-falseshou-fa-deyunikurokonnican-zhan-sitemita-kaggle-meetup-number-3参照。笑える

*2:これに気付いていれば優勝していた。https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection/discussion/56268#latest-327229