AD-TECH
Lab BLOG
RCO アドテクLab ブログ

kaggle初心者の私が3ヶ月でソロゴールドを獲得した方法

2018/05/31pigimaru

このエントリーをはてなブックマークに追加

こんにちは。今年2018年4月より新卒でRCOに入社した松田です。

kaggle というデータ分析のコンペティション運営サイトが昨今世間に注目されていますが、 今回 TalkingData AdTracking Fraud Detection Challenge において2月にkaggleを始めた私が単独で金メダル(ソロゴールド)を獲得できたのでそれまでにやったことなどをシェアしたいと思います。

図: kaggleサイト( https://www.kaggle.com/ )のプロフィール画面より

図: kaggleでの活動ログ。中2ヶ月はやってないので実質の活動期間は1ヶ月ほど

コンペの具体的内容やテクニックの話は 別記事 にまとめたので、 ここではゆるふわに勉強法や経緯をシェアします。 これからkaggleを始める人が効率よくノウハウを得るのに役立てば幸いです。

前提

まずkaggle参加前の私のステータスは以下の通りです。

  • 大学では理論物理(素粒子)専攻でプログラミングやデータ分析とはほとんど関係ない
  • 機械学習は自習したが実践経験はあまりない
  • 英語・数学に苦手意識はない
  • kaggleは1年くらい前に知ってアカウント作ったけど何から始めていいかわからず放置していた

結論

以上を前提にまずは記事のタイトル「kaggle初心者の私が3ヶ月でソロゴールドを獲得した方法」の答えをまとめると次のようになります。

以下絵日記形式でこれらが具体的にどう役立ったのかを説明します。

絵日記

25 ~ 213 メルカリコンペに参加

RCOでは年に何回か開発合宿をしているらしく、2018年2月当時内定者だった私も参加していいよと言われたので「無料で旅行行けてラッキー!」ってノリで参加しました。

開発合宿のテーマはほぼ自由だったので私は内定者同期の2人に誘われて当時開催されていたメルカリコンペ (Mercari Price Suggestion Challenge) に参加することでkaggleデビューしました。

図: kaggleのサイト( https://www.kaggle.com/c/mercari-price-suggestion-challenge )より

合宿は1泊2日でその間ではデータを眺めてKernel見ながら基本的な手法を試すだけで終わりました。 合宿後も結果を提出する度に順位が上がっていく快感の中毒になってしまい、ひたすら試行錯誤してました。 既に締め切り約1週間前だったのですが序盤に思いついた特徴量が結構良かったみたいで銀メダルを獲得できました。

図: 109位で銀メダル圏内。徹夜したかいがあった。

そこで学んだことをまとめると以下の3点です。

  • データのダウンロードからsubmissionの仕方
  • とりあえずKernel読むべし
  • モデルはLightGBMが強力なので主な作業は特徴量エンジニアリング

経験者とチームを組むことでコンペの一連の流れや最近の主流を1日で知ることが出来たのはとても効率が良かったです。 あとkaggleを始めたいと思っても何か背中を強く押してくれるきっかけが無いと中々始められないので、合宿というのはちょうど良かったです。

まだまだ試したいことが残っていて最後時間が足りなかったので、次は早めにコンペに参加しようと誓いました。

2月中旬から4月中旬 ~ TalkingDataコンペ参加まで

メルカリコンペが終わった後は大学の研究や知り合いに頼まれたWEBアプリ開発などで忙しく結局コンペに参加出来ないまま4月になりRCOに入社しました。 RCOではエンジニアが働きやすい環境を重視していてそれが様々な制度として実施されていることに感動しました。個人的には特にきっちり業務をこなしていれば勤務時間が自由であることが気に入っています。

図: オフィスの写真。お菓子や飲み物が取り放題。写り込み注意。

始めの業務はgolangで遊ぶくらいで業務以外の時間でもAWSやGCPなどのクラウドを勉強することにハマってしまいkaggleとの接点がありませんでした。 しかしRCOの 「kaggle部」 の活動がGW後に開始すると聞いて、その前にソロでどこまでいけるか1回試したかったので締切が5/7でちょうどGWに集中して作業できる TalkingData コンペ に参加することにしました。

図: kaggleのサイト( https://www.kaggle.com/c/talkingdata-adtracking-fraud-detection/ )より

422 ~ 427

まずデータをダウンロードしてsample_submission.csvを提出してみたのが4/22。

続いてシンプルにLightGBMを実装しているものを写経してsubmitしたのが4/25。

情報収集している中、tkmさんという日本人の方が kaggleの解説動画 をyoutubeに上げているのを発見。 こういう技術系の解説動画は Cloud AcademyUdemy などでよく利用してたのですが、Udemyでは日本語のコンテンツよりも英語のコンテンツの方が圧倒的にqualityが高いので日本人による解説動画でしかも無料なんで期待せずに見始めました。

ところがどっこいわかりやすいし中身もあるしスライドとかじゃなくハンズオン形式でとても参考になりました。 具体的には経験者が使うツールを見れたこと、データのダウンロード・前処理・訓練・予測・提出までの一連の流れを復習出来たことによって残りの短い時間を有効に活用出来ました。

身近にkaggle経験者がいない人でもこの動画を観ればスタートダッシュをきれると思います。

(ちなみにtkmさんがRCO出身であることを後で知りました)

428

GWが開始したので本格的に分析を開始しました。 コンペもかなり終盤だったためKernelやDiscussionにかなり情報が蓄積されていたのでとりあえずHotnessが高いものを一通りチェック

良さそうな特徴量をいくつか真似して取り入れて少し工夫を加えることで情報にキャッチアップすると同時にスコアを上げていきました。確か当時の銅メダル圏内には入れました。

429, 430

Kernelの特徴量がなぜスコアに寄与しているかを考える中で、学習の前処理に補足データを使うべきだと気づきました。

少し面倒な実装でしたがスコアが上がるのを楽しみに朝まで作業して提出。 生活リズムを犠牲にスコアを伸ばすことができ、当時のシルバーメダル圏内に入れました。

図: 嬉しくて当時の順位をスクショしたのがありました笑

51, 52

平日だったので出社。 有給をとってる人も多かったですが私は温存しました。

業務の隙をうかがってちょこちょこ計算を回し検証したかった特徴をいくつか試しましたが、もともと優先順位の低いものだったのであまりスコアは上がりませんでした。

ここで同期にcourseraの How to Win a Data Science Competition: Learn from Top Kagglers | Coursera が良いと教えてもらったので夜に家で観ることにしました。

図: courseraのサイト( https://www.coursera.org/ )より

この講座で得た知見がこの後スコアを伸ばすのに効いていきます

締切の5/7まで時間に余裕は無さそうだったので目次で関係ありそうな項目を選抜しさらに基本2倍速で聞き流し自分が気になったところだけ等倍速で繰り返し観てました。

53, 54

courseraの講義でtarget encodingという手法を学んだので実装。 Kernelにも似たような手法を試しているものがありましたが、自信がなかったため見送っていました。

更にcourseraの講義でkaggleの猛者によるハイパーパラメタの経験論を聞いたのでそれをもとに少し調整。 合わせてスコアがまあまあ伸びました。

Neural Networkをtensorflowで組んでみましたがメモリが全然足りないのでとりあえず諦める。

そろそろコンペ終了までの時間が気になり始め、確かtkmさんの動画で計画的にやることは重要みたいな事を言ってたので残り時間から逆算してTODOリストを作りました。

戦略としてはこれ以上の特徴量エンジニアリングを捨てて、確実にスコアの伸びるパラメーター調整とモデルの配合(ensemble)をやることにしました。 courseraの動画でパラメータを変えたモデルを配合するだけでスコアが伸びることが多いと学んだのでそれを試してみたかったのです。 今回のコンペで力技の計算環境を整えることで次回以降にも活きると思ったという事情もあります。

55, 56

立てた戦略の準備的部分をこなしていきました。 モデルの配合が何種類でも配合割合を自動で最適化できるようにコードを編集しました。

計算環境ですがGCPを勉強していたのでサクサク作ることが出来ました。 残り時間も少ないので金に糸目をつけずにメモリ約100GBの16coreインスタンスを4つ作って計算を回していました(申請しないと合計64coreが最大だったので)。

計算している最中に前処理を変えない範囲でモデルの数を増やしてみました(結局使ったのはlightGBMとxgboost)。

使う学習データを増やしたこともあって単独モデルでもスコアが伸び、 試しに2つのモデルを配合したものも無事スコアが伸びました。

順位が当時の約4000チーム中30位程になり、これは17位以内のゴールドメダルも狙えるのでは?と思い始めました。

最終日 57

5/7月曜日。出社してまず先輩に一言。

私「今日kaggleコンペ最終日なんで業務はやりません!!」

先輩「お、おう」

快く承諾を頂き計算を回し続けました (注: 業務はキリが良いところまで前倒しで終わらせていていて関係者の確認待ちだった)。

計算を回すだけとはいえど4つのインスタンスでパラメーターを変えながら結果を配合用に整理するのだけで忙しかったです。

深夜になるころは作業にも慣れて来たので計算の合間にニューラルネットワークのモデルも組んで残り時間と相談して学習データを絞って学習させました。

残り2時間を切ったので数十個の学習済みモデルから10数個選抜して配合した渾身の結果を確認

まるで成長していない………

失望と共に眠気が襲ってきましたが諦めたらそこでコンペ終了なのでニューラルネットワークの計算が終わるのを待ちました。

残り時間20分ほどで学習が終わったので配合割合は直感で決めてギリギリ2つを提出しました。

最終日あまりスコアが伸びなかったのであまり結果は期待してませんでしたが終了画面を見てビックリ。 なんと17位でギリギリゴールドメダルに入っていました。

節約のためGCPのインスタンスを消してからとりあえず寝ました。 後日恐る恐る計算にかかった費用を確認すると5万円弱でした。 人次第ですが勉強にもなるしスキルの証明にもなるのでコスパは良いはずです。

最後に

kaggleでは高精度のモデルを構築するテクニックを効率良く勉強でき、特に6月以降はkaggle部として会社の計算環境をお借りできるとのことなのでまたコンペに参加したいと思います。

実際の業務ではどうやってデータを管理してどのデータを使ってどんなアウトプットを出してどのようなシステムを構築するかなどkaggleでは学べない重要なことも沢山あるので、それらに関してはRCOでの業務を通して経験・スキルを身につけていきたいと思います。

広告

RCOアドテク部では優秀なエンジニアを募集しています。

採用ページ