『データサイエンティストとマシンラーニングエンジニアはKaggleやれ』というのは何故なのか

この記事は将来的に自身の[ブログ](http://marubon-ds.blogspot.jp/)にも載せる予定（許可なき転載とかではない）

#概略
データサイエンティスト、マシンラーニングエンジニアがどのように勉強を進めるべきか、始めるべきかという問いに対して、『Kaggleやれ』というのはよく聞く答えだ。 
なるべく早い段階でKaggleのコンテストに参加するべきだというのは僕も個人的に賛成だ。 
実際に、なぜ、Kaggleに参加すると勉強になるのかという点を実際にまとめていく。 

#Kaggleとは？
Kaggleとはデータサイエンスのコンペティションサイトだ。賞金のかかっていたりいなかったりするコンペが集められており、規約に同意すれば個人でも団体でも自由に参加することができる。 
さて、数は少ないが日本独自のデータサイエンスコンペティションサイトもないことはない。[DeepAnalytics](https://deepanalytics.jp/?tc=menu)などはその例だし、コンテストサイトでなくてもデータサイエンス、マシンラーニング系のコンテスト自体は定期的に催されている。そのような中であってもとくにKaggleが学習においては優位性を持っている。それは以下の点によるものだろう。 

* コンペに関するユーザー同士のコミニケーションが可能
* jupyterファイルなどを閲覧可能な形でアップロードし、コメントを受け付けることが可能
* 全世界にアクティブな参加者がおり、的確な質問をすれば良いレスポンスが望める

Kaggleは単なるコンペティションサイトではなく、コンペティションの内容に関するユーザー同士のコミニケーションが取れるサービスになっている。 
基礎集計、モデリング、マジックナンバーハックなど、様々な側面について、jupyterファイルなどを通して実際の結果を見ながらコミニケーションを取りつつ他者のアプローチを勉強することができるのだ。 

#なぜ『Kaggleやれ』なのか？
概略の部分でも書いたように、データサイエンスやマシンラーニング部門の勉強方法について、『Kaggleやれ』というのは一定割合聞かれる。では、なぜKaggleに参加することがそんなに重視されるのか？ 
理由はいくつかある。 

##本やネットでは全過程のうちの一部しか紹介されていない
この数年、統計やマシンラーニングに関する本は多く出版された。ネット上での情報も充実しており、少ししっかりしたことをやろうと思っても論文を読めば実装までいける。非常に勉強をしやすい環境になったと言えるだろう。とはいえ、これは***全過程の一部を切り取ったものについてしか説明をしていない***。 
ネット上でも本でも、ライブラリを用いたモデリング部分についての情報は多く見られるが、データの前処理にきちんと言及しているものになると一気にその数が減る。モデル作成の文脈のなかできちんとデータの基礎集計について説明がなされてるものになるとさらにその数が減る。  
モデリングの部分についても、複数のアルゴリズムを組み合わせる方法などに関してはあまり語られてもいない。 
これらの言及されにくいエリアが、実践的な場面で必要ない知識であるのならば問題はないが、これらは実際の場面では必須な知識だ。 
Kaggleではkernelの共有を通して、他の参加者がアップロードした基礎集計や前処理、それに対するコメントなどを確認することができる。既に一定の経験値を積んでいる人間が実際に辿っている手順を手取り早く確認して自分のものにすることができるのだ。 

##スコア、順位が出る
コンペに参加せずに自分で勉強している時にもlossやaccuracyからモデルを評価し、より良いモデルを作るための勉強をすることはもちろんできる。とはいえ、それは常に、比較対象となるモデルも自分が作成したものになるため、どれだけ、モデルを作成してもそれでわかるのは『そのモデルが自分が以前に作ったモデルよりイケてるかどうか』ということだけになる。このデータに対するモデルとして、そのモデルの素晴らしさがどのようなものなのかというのはやはり他者の作ったモデルとの比較の中だとより明確になる。 
加えて、順位、スコアが出ることで自分の成長が一目でわかる。全く成長が見られないようであれば、それは勉強するべき内容が何かおかしいと判断して新しい試みを行うことができる。 

#実際にどの段階でKaggleに参加するべきか？
ここまで『Kaggle素晴らしい』ってことでアピールポイントを書いてきたわけだが、実際にどの段階で参加するべき、参加できるのか？  
ここでは前提として『機械学習は線形代数、微分積分、確率論、統計論を勉強した人間がPRMLを読んでアルゴリズムの数理を理解し、実践のためにKaggleに挑む』というルートは考えずに、『とりあえず、最低限の知識を手に入れて、手っ取り早く入り口を通ってKaggleを通して学んでいきたい』というルートを設定するものとする。（別に前者のルートでも良いといえば良いのだが、さすがに人を選びすぎるので今回は後者のルートを前提としておく。） 
Kaggleに挑むために必要な最小の知識は以下の二点にまとめることができる。 

* 前処理ができるレベルのプログラミング知識
* 機械学習ライブラリに関する知識

##前処理ができるレベルのプログラミング知識
###言語選択
まず、データサイエンス、マシンラーニングに取り組むのであれば、現在だと以下の言語のどれかができるのが好ましい。 

* R
* Python
* Julia
* C++

一応4つあげたが、2017年前半の現在ならPythonが非常に優勢だ。Kaggleのkernel共有の場でもアップロードされているコードのほとんどはPythonのコードだ。もちろん、それぞれの言語が良い特徴を持ってはいるし、目的に合わせて選択をしていくべきではあるが、『Kaggleを通して学んでいく』ということならPython一択になる。これが『本を通して学んでいく』ならばRかPythonになる。 

###求められるレベル
実際にプログラミング技術が問われるのはデータの前処理の部分になる。もちろん、モデルをフルスクラッチでガツガツ書いていくなら話は別だが、今回はそこは割愛。 
難しいか簡単かの二つで、必要なレベルを断ずるのは適してはいないが、『効率とか美しさとかは気にせずに、モデルを作成するため前処理をどうにか行えるレベル』のプログラミング技術があれば、目的は達せられるわけで、そのラインを超えるのはそう難しいことではない。 
それこそ、Pythonであれば[みんなのPython](https://www.amazon.co.jp/dp/B01NCOIC2P/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)で全然大丈夫だ。  
効率的に進めたい時や、重いコンテストを選択した時には、並列化やCythonの知識が必要になることもあるが、それは慣れてきたら考えれば良い。 

##機械学習ライブラリに関する知識
まず、知っておく必要がある事実として、***機械学習のアルゴリズムをフルスクラッチで書くことは、ライブラリ使用に比べればその頻度は著しく低い***。もちろん、慣れてくれば、自分のやりたいこととライブラリがマッチせずに、自分でアルゴリズム部分を書くことはあるが、それでも基本的には機械学習のアルゴリズム部分はライブラリを使用することが多い。 
それゆえに、機械学習アルゴリズムに関するライブラリはきちんと把握しておく必要がある。Pythonなら[scikit-learn](http://scikit-learn.org/stable/)などがそれにあたる。いきなり、ライブラリの公式ページを見ても、使用状況などを判断するのは実際のところ難しいので、[Python 機械学習プログラミング](https://www.amazon.co.jp/dp/B01HGIPIAK/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)あたりでサクッと必要最小限の知識をいれるのがおすすめだ。 

#最後に
簡単に、Kaggleの素晴らしさとそれに参加する段階、知識についてまとめた。しかし、大切なこととして***最小限の知識を身につけて、Kaggleに参加すればそれだけで良いというわけではない***。 
早い段階でKaggleに参加することで、実践的なハック、高いモチベーション、手法の妥当性などを極めて早い速度で獲得することができる。その一方で、Kaggleでは獲得できない知識はもちろんある。アルゴリズムの数学的な側面などはその最もたる例だろう。 
早めにKaggleに参加し、それと並行して、土台も強固なものにしていきたい。 
***特に、数学の知識はどんどん出てくるアルゴリズムへの理解とその利用のためには必須だ。***