ML_BearのKaggleな日常

元WEBマーケターのMLエンジニアがKaggleに挑戦する日々を綴ります

Kaggle参戦記 〜入門からExpert獲得までの半年間の記録 & お役立ち資料まとめ〜

これはなに?

  • デジタルマーケター 兼 プロダクトマネージャー 兼 データアナリスト (肩書長い…) の私が Kaggle に挑戦した約半年間の記録です。現時点で2つのコンペに真面目に取り組んで2つの銀メダル(入賞)を獲得出来ています。
  • Kaggle挑戦期間を通して、有識者の素晴らしい資料に助けられたのでとても感謝しています。同じような志を持つ方に自分の記録が少しでも役に立てばと思い、有用な資料のリンク集に私のKaggle参戦記ポエムをつけてまとめてみました。
  • 自分の得意領域で勝負しようと思ってテーブルデータのコンペばかり選んでいるのでDeepLearning系の話は全然ないです、すみません。

目次

プロローグ

初ガチコンペデビュー

スランプ → 一転して銀メダル獲得

2回目のコンペ挑戦

2個目の銀メダル獲得とその先

おまけ

('20/03/20追記) 入門に役立つ本

  • このブログ記事を書いた後に、入門に役立つ本が出版されました。この入門記事ではkaggle-couseraをやる、と書いていますが、今から入門される方はまずはこの本で入門するのが良いかと思います。
  • 上記の本で入門した後は、以下の本で実力を伸ばすのが良さそうです。

プロローグ

Kaggleへの興味の芽生え (2018年7月ごろ)

  • 私はデジタルマーケティング畑の出身です。デジタルマーケは大量のデータを扱うことが要求されるので、データ分析やプログラミングのスキルは自然と身につきました。そのスキルを活かして一時期データアナリストもやってました。
  • Kaggleのことは元々なんとなく知っていましたが、なんか凄いアンサンブル世界大戦が繰り広げられているだけの場所だと思っていました。そんなある日、「kaggle初心者の私が3ヶ月でソロゴールドを獲得した方法」というブログ記事を見つけました。
  • このブログにはどのような流れでKaggleを勉強していったか、どんな資料が役に立ったか分かりやすく書かれていました。
  • その後、このブログで知った「tkmさんのYoutube動画」を見て、なんとなくとっつきにくかったKaggleに一気に興味を持ち、ちょっとやってみっかーと思いたったのが2018年8月頃でした。

※ 自分はこの時点ですでにPythonや機械学習の基礎知識がありましたが、無い方はこの記事の末尾につけたような初心者本を一度読んでからやるのが良いかと思います。

初参戦 → 即撤退 (2018年8月)

  • 2018年8月頃はHomeCreditというコンペがとても盛り上がっていました。
  • データもなんとなく面白そうだったので、とりあえずKernel(参加者が自分のモデルを公開して議論する場所)からモデルをパクってきて参加してみました。
  • ただ、モデルを改善するにあたり何から手をつけたらいいのかよくわからなかったので、全然手が進みませんでした。
  • そのまま手探りで進めてみても良かったのですが、これでは良い結果は絶対に出ないだろうなと思い、まずはきちんと勉強することにしてすぐ撤退しました。

ガチ参戦に向けた修行 (2018年8〜10月)

  • 自分自身の転職と被ってバタバタしていたので、以下の資料を使って3ヶ月ぐらいゆっくり勉強を進めました。
  • How to Win a Data Science Competition: Learn from Top Kagglers
    • Coursera の Kaggle 講座で、おすすめ資料として各所で常に話題に上がります。実際にKaggleで優勝している方々が講師をされており、非常に実践的な内容を知ることが出来ました。(これ無しで銀メダルを取れたイメージは全く湧きません)
    • Validationに対する考え方や、過学習の避け方、木モデルと線形モデルに対する特徴量エンジニアリングの違いなどはこのコースを見ないと気づくことすらなかったと思います。
    • いつかまとめたいと思っているのですが、自分の雑記メモはこの後も何度も見返しました。
  • kaggle初心者ガイド
    • Kaggler-jaというSlackグループの有志による初心者ガイドです。ここに載っている記事は一通り読みました。
    • また、Kaggler-jaのSlackで話されている内容も示唆に富むものが多いのでぜひこちらから参加されることをおすすめします。
  • Kaggle Meetup Tokyo #4 動画
    • MeetupのLT動画です。通勤の電車の中などで何度も見ました。
    • 第4回目以外の他の会は動画が見つからなかったのでスライドを漁って全部読みました。(#5 / #3 / #2 / #1)

初ガチコンペデビュー

初ガチコンペ…、のはずが。(2018年10月)

  • 3ヶ月ぐらい勉強したところで、ちょうど良いコンペを見つけました。
    • Google Analytics Customer Revenue Prediction」です
    • 仮想のGAのデータが与えられて、売上予測せよというものでした。
    • 私の出自はマーケターでGAチョットワカル( ̄ー ̄)ニヤリなのでこれは好都合だと思って喜び勇んで始めることにしました。
  • しかし、データ眺めてさぁ始めようとおもったら

  • その2日後にリーク(コンペ設計のミス)が発覚して

  • わずか10日後にコンペが大幅に変わってしまいました

  • そのまま続けても良かったのですが、Leader Board (コンペ期間中のランキング表) が全く機能しないので、面白くなさそうだなと思って回避しました。
  • Twitter界隈では年末ジャンボ宝くじと言われていましたが、真面目にやればそこそこ良い感じの結果が出たそうです。しかし、いま考えてもはじめてのガチコンペとしては回避して良かったと思います。

初ガチコンペ参戦 (2018年11月下旬)

  • どうしたもんかねぇと思っていると、ほどなくして「Elo Merchant Category Recommendation」というコンペが始まりました。
  • クレジットカードの購買データを用いて顧客ロイヤリティ的な数値を当てるコンペでした。
    • マーケで使うLTVの概念とか流用できるかなー、と思ってよく考えずに参戦しました。
    • 最後まで何を予測してるのかよく分からないコンペでしたが笑、結果としては以下の観点から初心者としては良いコンペでした。
      • データサイズが大きくない
      • Validationが難しくない
      • 特別なドメイン知識を必要としない

ベースモデル作成(12月初旬)

  • コンペ序盤はデータを眺めつつ、ベースとなるモデルを組んでいきました。
    • データを眺めるのはpandas-profilingが圧倒的に便利でした
    • ざーっとデータを見たあとはほぼマーケの実務と同じ感じでデータ分析しました
      • データはすべてBigQueryに投入→粛々とSQL書いてデータ抽出
      • 気になったところがあればExcelでコネコネ
  • ベースモデル作成はKernelの写経から始めました。
    • このKernelを改変したものをずっと使っていました
      • はじめてコンペに参加する際は、KernelにめっちゃUpvoteがついているものを選べば大怪我はしないと思います。
    • EloはValidationを気にせず↑のモデルのままで何も問題がなかったので、ある意味初心者に良いコンペだったと思います。
      • 次のMalwareコンペに参戦したときに Validation すら作れず大変苦戦しました…。
  • 後々のことを考えてGCEにJupyter notebookを立てて作業していました
    • 最初は8コアから始めて、最後の追い込みのときはは64コアとか使っていました。
    • 64コアとはいえpreemptiveインスタンスだと非常に安く、GCPの無料体験枠で十分に収まりました。
    • 参考になった記事: jupyter notebook on GCE

特徴量エンジニアリング(12月初旬〜中旬)

特徴量選択(12月下旬)

  • 特徴量作成も一段落ついてきたある日、Less is more というスレで高度な特徴量選択の有用性を知りました。
    • その頃、簡単に思いつく特徴量はだいたい作って特徴量が300-400個ぐらいになっていました
    • 減らしたほうが良いのかなと思って手を付けてみました
  • 結果的にはうまく行きませんでした
    • boruta / eli5 を使ってみましたが、CVにoverfittingしてしまうイメージでした
    • 特徴量が300個ぐらいだと不要だったのかもしれません
      • 次のMalwareも特徴量が200個ぐらいだったので使わなかった
  • 参考になった記事

ブレンディング(12月末)

  • 特徴量選択に一通り失敗したあと、3つのモデルを混ぜ合わせて スコアを上げるKernelを参考にしつつ、特徴量エンジニアリングだけじゃないスコア改善にトライしました。
    • 各コンペの内容に合わせていろいろなモデルの混ぜ方を出来るようになると上位安定しそうです。
    • Eloの場合も上位解法見てるとそれぞれ工夫されていました。
    • 自分は↑のKernelと同じようなやり方しかしてなかったので金に届かなかったのかなとも思います。
  • 後で見返してみたらこの時点で既に銀メダルを取れるスコアを出せていました

スランプ → 一転して銀メダル獲得

スランプ(2019年1月)

  • 年が変わった頃から長いスランプに入りました。
    • 基本的な特徴量をだいたい作りきったからか、全然スコアが上がりませんでした。
    • この時期は何したかあんまり覚えていません笑
  • 飽きてる

  • TargetEncoding失敗して凹んでる (今思えば避けられるだろ、っていう)

アンサンブル(1月末)

  • 特徴量エンジニアリングに飽きてきて気持ちが切れたので「後で使うもの先に作っておくか」と開き直ってアンサンブル(Stacking)のコードを書き始めました。
    • 通常はコンペ1週間ぐらい前からやる作業だそうです
    • EloではシンプルなAveragingはあまり効かなかった印象なので(異常値が丸め込まれちゃう?)、初コンペ参加者としてはこの時点でコードを書いておいたのは良い判断だったと思っています。
    • 停滞していたスコアが如実に伸びてビックリしました
      • 「コンペ序盤にアンサンブルで小手先のスコア向上しないほうが良いよ」(≒アンサンブルとかどうせみんなやるから、時間あるならオリジナリティがあることやれよ。)というセオリーの本質が少し理解できました。
  • 勉強にはKAGGLE ENSEMBLING GUIDEを使いました。
    • アンサンブルの基礎から応用まで丁寧に説明してくれている記事で、バイブルと言われているとのことです。
    • 実際に学ぶべき点が非常に多く、次のコンペの時も合わせて何度も読み返しましたが、まだ2割程度しか理解できてない気がします笑
  • その他に使った資料

Malwareコンペに浮気(2月初旬)

  • Eloに完全に飽きたので他のコンペ(Malware)を覗き始めました

  • この後すぐEloコンペ再始動するのですが、その後も毎日少しづつMalwareコンペのKernel/Discussionに目を通し続けてました。
    • その中でMalwareで使うベースモデルやアンサンブルモデルのKernelを見つけられました。
    • そしてMalwareの銀メダルにつながってたので結果オーライでした
  • 浮気用に使った資料

神Kernel現る(2月7日)

  • 浮気した矢先にGrandMasterのraddarさんによる衝撃的な Kernel が現れました

  • Eloコンペではいくつかの特徴量が謎の数値になっていました
    • raddarさんはそれをリバースエンジニアリングしてキレイな数値にしてみせました
    • 当時の感動を伝えられる語彙力が無いのが歯がゆいですが、世界トップクラスのデータ分析力を目の当たりにしてクラクラしました。

Eloコンペ再開 (2月中旬)

  • raddar-Kernelにより今まで失敗していた特徴量(購入金額系など)の特徴量エンジニアリングに目処がつき、やる気が復活しました。

  • SQLで特徴量をごりごり作りました

  • raddarイベント以降、とてもはかどりました。

初の銀メダル獲得(2/26)

  • その後、(個人的には)滞りなくコンペは進み銀メダルゲットできました。(しかもTOP2%圏内でビックリ)

  • 最後の10日間ぐらいはほとんど何もできず、ただ下がっていく順位を眺めていました。
    • みんなpublic LBにoverfittingしてるに違いないと自分に言い聞かせる日々でした
    • 最終的には暫定130位まで落ちたが→43位(その後42位に)でフィニッシュでした
    • 金圏にはかなり遠いかなと思っていたのですが、あと0.004で金でした
      • 結果発表直後は「金圏、意外と近いな」と少し慢心してました(爆)
      • が、その後上位解法を読んで「近くて遠いとはこのことか」と無事、謙虚に戻れました笑。

2回目のコンペ挑戦

2回目のコンペ参戦

  • Eloはソロ銀取れたのですが最終の順位変動が結構大きいコンペで、Kaggleの実績がほとんどない自分はフロックっぽくて嫌でした。
  • なので、フロック疑惑を晴らすのも兼ねて、Elo終了後の2週間で(それまで浮気していた)Microsoft Malware Predictionにチャレンジすることにしました。
  • 結果としてはMalwareでもTOP2%で銀メダルを獲得できたものの、Elo以上に激しい順位変動があるコンペだったのでフロック疑惑は晴らせませんでしたw
  • が、EloよりKernel/Discussionが充実しており大変勉強になったコンペでした。
  • 細かい内容は振り返りにまとめた & 新しい資料少なめなので以下はサラッとです。

序盤から大苦戦 (2月下旬)

  • Eloが終わる10日前ぐらいからEDA→初歩的なFEを実施していました
  • Eloが終わったときからベースモデルを作成してテストしました
  • Eloとの違いに大苦戦しました
    • Validation: CVとLBが合わない…

    • データ量: 計算全然終わらない…

      • 特徴量エンジニアリングなどはTrainデータの一部で行ってました
      • Trainデータ全量での計算はコンペ終了1週間前ぐらいから始めてました
  • ↓全然楽じゃないことをまだ知らない少年だった頃の私のツイート

ベースモデル作成と特徴量エンジニアリング(2月下旬〜3月初旬)

  • 振り返りの内容と被るので割愛します。
  • あまり時間もなかったので特に新しい資料などは探さず、ここまでに書いたものやコンペのDiscussionを読んでました。

Parameter Tunings

  • MalwareコンペではLightGBMのパラメータチューニングが効きました
    • Eloでも行っていたがあまり意味がなかった(なんかのKernelで凄く良いパラメータを引いていたようです)
  • 使った資料
    • 公式Docs
      • LightGBMの公式資料は実践的でわかりやすかったです
    • はじめてのKaggle体験記
      • LightGBM関連の資料がたくさん載っていたので一通り「読み」ました (全て理解できたとは到底言い難い…)
    • Kaggle Coursera の Week4
      • 参考にはしましたが、後述するoptunaで自動化したのであんまり参考にはなってません…。
    • CPMPさんのDiscussion

  • ライブラリ
    • optuna が非常に使いやすく、他のライブラリは検討もしませんでした
      • 公式サンプル を多少変えただけで使えました
      • 私は基本的にpreemptiveインスタンスなので(強制シャットダウンされたときも)最適化を途中から再開できるのも助かりました
    • チューニング前後は以下の感じです

チューニング前

'num_leaves': 300,
'min_data_in_leaf': 75,
'boosting': 'gbdt',
'feature_fraction': 0.2,
'bagging_freq': 3,
'bagging_fraction': 0.8,
'lambda_l1': 0.1,
'lambda_l2': 0.1,
'min_child_weight': 50

チューニング後

'num_leaves': 1638,
'min_data_in_leaf': 1819,
'boosting': 'gbdt',
'feature_fraction': 0.202,
'lambda_l1': 50.300,
'lambda_l2': 41.923,
'min_child_weight': 8.56,

データ全量でのテスト(3/7〜)

  • Malwareコンペのデータは重かったのでコンペ初〜中盤まではtrainデータを1/4ぐらいに絞っていろいろテスト
  • trainデータ全てを使い始めたのはコンペ終了のわずか1週間前
    • 自分は終了日を1日勘違いしてたので体感的には6日前
  • 全量で回すとすぐにBest公開Kernel超えられたのでホッとしました

アンサンブル (3/8〜)

  • 評価指標に合わせてアンサンブルの方法を変える必要があることをDiscussionで知りました

  • アンサンブル詳細は振り返りに書いたので以下サマリーです
    • はじめはパラメータを変えたLightGBM3つでStacking: LB 0.698
    • Kernelのdeep系FMをそのままStacking: LB 0.700
      • DeepFactorizationMachine
      • 喜びのTweet
        • 危うさ: Kernelでは何も特徴量の前処理をしていなかったため、publicLBにoverfittingする可能性があると思っていた (実際していた)

  • Kernelのdeep系FMの特徴量を自分のものに置き換えてさらにStacking: LB 0.701
  • Kernelそのままのdeep系FMは消してRankAveraging: LB 0.700
  • ファイナルsubmitには後ろ2つを選択

2個目の銀メダル獲得、そして…。

2個めの銀メダルでExpertに (3/14)

今後は: 目指せKaggleMaster

  • デジタルマーケやPMの業務に使えると思って機械学習の勉強がてらKaggleやり始めましたが、2つのコンペを経てKaggleそのものがとても楽しくなってきてしまいました。
  • Kaggleについてはカレーちゃんさんのこのツイートが秀逸でした

  • 幸いにもあと金メダル1個とれれば Kaggle Masterの称号が貰えるので、Master目指してやっていこうかと思います!
    • って書いたけど金メダル簡単に取れたら苦労しませんw
    • ということでこれからも自分のペースで頑張っていきます!

おまけ

まだ使ってないけど役に立ちそうなもの

機械学習の基礎を勉強する時に使ってたもの

Kaggle初参戦する以前に勉強していた時に役立った本リスト

Python機械学習プログラミング

  • 機械学習の基礎の基礎から勉強できるテキストです。
  • 実際にscikit-learnを用いたサンプルコードもほぼすべて載っているので、こちらで基礎固めを行いました。
  • この本の内容が概ね理解できない、コード書けない、だと厳しいと思います。

PythonとKerasによるディープラーニング

  • ディープラーニングに勉強のためにこの本を買いましたが、機械学習全般の話がとても平易な文章で書かれており、ディープラーニングよりも機械学習の全体の流れの勉強になりました。
  • 高度な機械学習が行えるディープラーニングだからこそ、まずは簡単な手法でベースラインを作ってみる、などは、ディープラーニングに限らず様々な場面で基礎として有用だなと。

scikit-learnとtensorflowによる実践機械学習

  • こちらもtensorflowを触ってみようと思って買ったのですが、前半の、scikit-learnを用いた機械学習の話のほうが役に立ちました
  • アンサンブルの基礎的な考え方もこの本で学びました。

おわりに

  • 超長文読んでいただきありがとうございました。(はたしてこの箇所まで読む人いるのだろうか…)
  • 冒頭にも書きましたがKaggle界隈には有用な資料がたくさん転がっており、独力であっても勉強して結果を残すことが出来ると思います。
  • 一度ハマれば勉強にもなるし楽しいし一石二鳥の趣味になると思います。
  • この記事を読んでKaggleに興味を持ってくれる人が一人でもいて、どこかのコンペでお会いできたりすればこれ以上幸せなことはありません笑。