社内でKaggleの布教活動をやっている話

最近、社内勉強会で機械学習についてエンジニアに説明する機会があり、その際にKaggleについても説明しました。一方で

という話もあり、(特にデータサイエンティスト以外の職種の人が)Kaggleをやる意義/メリットについてまとめてみました。ガッと勢いで書いたので、項目に結構被りがあります。なお、書いている本人はKaggleほぼ初心者であまり説得力がないです。Kaggle Masterの人がもっといいエントリを書いてくれるのを期待しています、議論の叩き台エントリです!!

Kaggleをやる意義/メリット

様々なデータセットを触ることができる

Kaggleには開催中/終了したものを含め様々なコンペがあり、データセットも多種多様です。データサイズがかなり大きいものもあります。

「新しい機械学習機能ができるか社内で検討したいが、手元には手頃なデータがまだない(あっても少量)」といったときに、Kaggleのデータセットを使ってあれこれ試してみることができます。例えば、はてなであれば画像関連のタスクはまだ経験がほとんどなくアノテーションデータも特に存在しませんが、画像を使うとどういう機能ができそうか/どのくらいの精度でできるのか、といったことを試せるといった具合です。どのくらいできるかも分からない状態でいきなり仕事でやるのはなかなかリスクが高いので、Kaggleで練習できることは仕事でのリスクを下げることにも役に立つと思います。最近見かけた参考になりそうなタスク、面白そうなタスクを少し紹介してみます。

  • Toxic Comment Classification Challenge | Kaggle
    • 嫌がらせのようなコメントを識別する典型的なNLPの練習になりそうなタスク
    • CGMを運用しているサービスではどこでも悩むことだと思うので、Kaggleの人がどういったアプローチで取り組んでいるのか参考になることが多そう
    • 単純に2値分類ではなく、toxic, severe_toxic, obscene, threat, insult, identity_hateといった複数のラベルを予測する問題になっていて、タスク設計という観点でも参考になる
  • Mercari Price Suggestion Challenge | Kaggle
    • メルカリ主催の価格推定タスク。商品名、カテゴリ、descriptionなどが与えられた状態で価格を推定する典型的な回帰のタスク
    • 特徴としては学習と予測もサーバー側でやる制約。サーバーのスペックや計算時間に制約があるというのは製品開発ではよくある話なので、そういった制約がある状況でどういうアプローチを取っているかは参考になりそうですね
    • 一位の人のコード: pjankiewicz/mercari-solution: Mercari 1st place solution (kaggle)
  • Text Normalization Challenge - English Language | Kaggle
    • 口語表現などを含むテキストが与えられたときに正規化するNLP系のタスク
    • CGMのテキストを入力として何かをやろうとするとき、各社正規化を頑張ることが多いと思う。その必要が大きい場合、こういったコンペを覗いてみると発見があるかも
  • Planet: Understanding the Amazon from Space | Kaggle
    • 航空写真が与えられ、どの地域が違法に密林を伐採されている区域かなどを当てるタスク
    • 素人目から見ると違いが全然分からんな...という気持ちになるし、画像タスクでどう取り組んでいけばよいかを考えるよい機会になりそう
    • データも圧縮済みで数十GBあるので、(半強制的に)データハンドリングをどうするかなどの勉強にもなる
    • Kaggle まとめ: Planet, Understanding the Amazon from Space - Qiita

自分もCTR予測のタスクの練習がしたかったので、Kaggleで練習した話を先日書きました。

こういった練習を繰り返すことで

  • どういった特徴量をDBやログに吐いておくと機械学習的観点でよいか
  • 有効な特徴量を継続的に保存していくためのデータ基盤はどうなっているとよいか

といったことも少し検討が付いてきたというのはよい発見でした。

kernelでデータ分析のやり方を知れる

Kaggleにはkernelというページがあり、他の人がどういうモデルや特徴量を作ったか、その特徴量を作るに至るにはどういった分析を行なったかを見れることができます。こういった試行錯誤は探索的データ分析(EDA: Exploratory data analysis)と呼ばれ、参加者は大体やっているのではないかと思います。

機械学習をproductionで使う際には「この特徴量や前処理はこういった側面から必要で入れている」といった説明をチームメイトに行なう必要がある場面が度々あると思います*1。こういった際にどういう分析や可視化を行なうと効果的なのか、事例をたくさん見ることができるというのは大きなメリットであると言えると思います。

場数を踏める

データ分析/機械学習案件を受けるとしましょう。案件に対して正確に早く動けるかどうかは機械学習に関する教科書的/理論的な知識も重要ですが、やはり踏んだ場数は成功に欠かせない要素だと思います。場数を踏まないとなかなか分からない具体例としては、例えば時系列データの学習データ(train)と検証用データ(dev)の分割の話があると思います。経験が少ないと意図せずleakしてしまい、テストデータでうまくいかないといったことがよく起きます。自分もついこないだやってしまいました...。

社内でたくさん機械学習プロジェクトが走っているならばそういった経験が積めるのでよいですが、そうでない場合にはなかなか経験を積むことが難しいです。Kaggleをやると、ある程度リアルな(多少ノイズを含むデータだったり、巨大なデータだったり)データをいじることになるので、場数を踏むことができます。仕事でぽんぽん失敗するのはなかなか辛いですが、Kaggleだと失敗してもあまり痛手ではありません。そのため、どんどん場数を踏むことができ、結果として仕事の案件でのスピードアップや正確性の向上に寄与することができるのではないかと思います。

様々な評価指標について知ることができる

一つの分野のタスクばかりやっていると、評価指標も同じものを使ってしまいがちです。Kaggleのコンペでは評価指標も様々なものがあります。これまで自分が知らなかった評価指標を使ってみると

  • どのタスクにそもそもどういった指標が使われうるのか
  • どういうときにどういう指標が向いているのか

といった知見が溜まってきます。その結果、数ある評価指標の中から適切な指標を選べるようになり、仕事にも役に立ってくるのではないかと思います。不適切な指標に対してチューニングを頑張っても、productionに出したときに泣くことになります...。

実験のログや再現性について気を使えるようになる

Kaggleのコンペは2-3ヶ月の長期戦です。あるとき自分がsubmitした2週間前の結果がよかったので、手元で再現したいということはよくあります。実験設定について何も記録していないと、よかった結果がどういう条件で出てきたのかがあっという間に分からなくなります。Kaggleをやっていると、どういう設定で実験を行なったのか(ハイパラ/データ数やデータ分割方法/特徴量の種類など)ログを取る重要性を身を持って学習できます。また、実験設定だけあっても結果が再現できないと意味がないので、実験の再現性についても気を使えるようになります。

実験設定の記録や再現性は機械学習のサービス開発でも難しい部分であるというのは以前エントリに書きましたが、こういった点について自然と対応できるようになってくるというのはKaggleのよいところであると思います。

自分の実力が客観的に分かる

Kaggleのコンペはよくも悪くも客観的な数値で自分の成績が分かります。社内で一人で機械学習を進めている状況だと「自分のやっているアプローチは正しいのだろうか。この方法で出ている性能は客観的に見ると高いんだろうか/低いんだろうか」と悩むことも少なくないと思います。Kaggleでは、自分の提出したもののスコアがよければ自信になりますし、思ったよりも悪ければKernelやディスカッションを見てどういう改善ができそうか探ることができます。

楽しい

精度が上がった下がったで一喜一憂するのは、まあ結構楽しいです。ISUCONなどで地道にスコアを改善するコンペが好きな人は趣味としても楽しめるし、仕事に役に立つ要素もあるので一石二鳥では?!と思います。

賞金がもらえる

まだ賞金がもらえるようなランクに行ったことがないので、省略します!!!もらったことがある人が書いてくれ!!!

まとめ

Kaggleの上位に入るためには、最近だとアンサンブルやハイパラチューニングが必須になってきています。しかし、そういったインクリメンタルな改善の要素以外にも、これまで書いたようにKaggleには自分の実力を正しく計測したり、力を向上させられる要素がたくさんあります。データサイエンティストに限らず、色んな人がKaggleに挑戦してもらえると自分もうれしいです。

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

Pythonではじめる機械学習 ―scikit-learnで学ぶ特徴量エンジニアリングと機械学習の基礎

*1:不必要な特徴量はメモリや計算時間も無駄になるだけですし、その特徴量を取るために複雑性も増してしまいます。なるべく取り除きたい