金欠学生がはじめる機械学習の学習(5つ方法と5つのステップ)

[機械学習をどう学んだか by 日経 xTECH ビジネスAI② Advent Calendar 2019](https://qiita.com/advent-calendar/2019/machine-learning-01)の21日目です。もうすぐクリスマスですね。プレゼントはもう決めましたか

この記事ではゼロ円から始められる機械学習の勉強方法を紹介します。

なぜ、ゼロ円である必要があるのか。

たしかに、機械学習を学び実践する上で、「kaggle本」やCourseraのkaggleコースのような評判の良い教材にお金を払うことは良い投資のように思えます。しかし、実際には良い教材は山のようにあります。一方でお金は無限ではありません。特に始まってもいない奨学金返済に今から怯えている学生にとっては。

そして、学生・社会人を問わず「できるだけお金を使わずに勉強したい」「積ん読をやめたい」「コレ！という本にお金を使いたい」という人は多いと思います。

そこで、超絶金欠学生の僕が便利だと思う勉強方法とステップを5つずつ紹介していきます。

# 5つの方法

## ①自分がいる環境を理解する (¥0)

今、どのような環境にいますか。そして、そこにいることの強みは何でしょうか。

**学生**であれば授業・研究(在籍料があるので厳密には有料ですが)以外にも、図書館や論文検索システムといった学校の設備を有効活用することができます。機械学習関連のインターンやアルバイトをすれば、実務経験がつくだけでなくお金を稼ぐことができます！これでkaggle本も買えますね！

**社会人**なら、おそらく金銭的な制約は学生より緩いかもしれません。 **特にやることがない人**は、時間が多さが最大の武器になるでしょう。

市民図書館のような無料の公共サービスは誰に対しても常に平等です。興味がある本を借りましょう。人気の本なら予約しましょう。

## ②eラーニング (¥0) 

地理的・時間的制約がある人向けです。eラーニングには中央集権型と分散型の2つがあると思っています。
**Khan Academy** (カーン・アカデミー)は中央集権型eラーニングのトップと言ってもいいかもしれません。算数から線形代数、コンピューターサイエンスまで幅広い授業をタダで受けることができます。体系化された授業システムのおかげで、基礎の積み重ねから難しい概念を理解することができます。

**YouTube**はユーザーが投稿できる分散型eラーニングの代表的な例です(カーン・アカデミーも最初はYouTube上での授業だったようです)。多くのユーザー、動画があるので質はまちまちですが、最初の取っ掛かりとしてはいいかもしれません。Twitterなどで新しい手法に出会ったときはとりあえずYouTubeで検索をかけています。

**Coursera**は部分的に無料です。

## ③Just Dive in. (¥0~)
勉強につきものなのがプラトーです。最初は新たな知識にワクワクし急速に成長できるのですが、どこかで壁にあたります。特に独学の場合、学習から得られる刺激が単一となりがちでこの壁にぶち当たりやすいと思います。

そんなときに役に立つのが**無理やり環境を変えること**です。たとえば無料の(or安い)勉強会に行きましょう。もしくはもくもく会に参加するのも一つの手です。

行動を起こせないのであれば、まずは環境を変えてしまう。とりあえず会場に行ってしまって、あとのことはその時の自分に任せましょう☕

素晴らしい出会いはどこにあるか分からないものです。徹夜で苦しんだコードを出会ったばかりの人が直してくれるかもしれません。僕の修士論文は、一期一会だった方のアドバイスなしでは完成しなかったでしょう。

## ④アウトプットする

アウトプットは、コミュニティへの貢献になるだけでなく、実力の確認・記録にもなります。そしてアウトプットは無意識にインプットの質も向上させます。

QiitaやStack Overflowなど、ユーザー同士の属性が似ているプラットフォームでは良いフィードバックを貰えるでしょう。ある程度の経験がついたらフィードバックを与える側に回っても良いかもしれません。

アウトプットというと与える側に注目しがちですが、**教えを請う**ことは効果的で(おそらく)もっとも重要なアウトプットの一つです。

## ⑤英語がわかるなら "You ARE Gonna Need It anyway"

英語を話せるなら、タダで学習する選択肢は更に広がります。

Stack Overflowを例にとってみましょう。まず、情報の量と質がケタ違いです。コミュニティの数も全く異なるでしょう。さらに、世界的に使われているサービスなのでタイムゾーンによる返信遅延が比較的小さく、返信数も多いです。僕がStack Overflowで質問したときは数時間でたくさんの返信が付き、その便利さに驚きました。

# 実践5ステップ

ステップA以降はざっくりこんなかんじに。

<img width="527" alt="スクリーンショット 2019-12-20 18.12.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186209/2177b7ba-a379-64a4-cf49-df3b8ee01299.png">

でも、まず目的(マイルストーン)を設定しましょう。

## Z. マイルストーンを決めておく

最終的に実現したいこと(大タスク)を明確にしておきましょう(株価予測、異常検知など)。

仕事、研究などですでにプロジェクトを持っている場合はそれになるでしょう。

「何か」を学びたい場合は、自分が関心を持てるテーマをおすすめします。

とはいえデータがなければ何もできないのでkaggleにあるオープンデータにあたりを付けておくのがいいでしょう。単に機械学習を体験したいのであれば`scikit-learn`にあるデータセットを使うだけでもいいかもしれません。

## A. 学ぶ手法を選ぶ

Z.で決めた大タスクを元に、学ぶ手法を選びます。ここで変な手法を選んでいる場合でも、またこのステップには戻ってこれるので大丈夫。

## B. 手法で何ができるか(完成図)をクイックチェック

YouTubeなど視覚的にわかりやすい教材をつかって大まかな完成図を把握します。

「なんかやりたいのと違う」と思ったらA.に戻りましょう。

## C. 具体的な数式・理論・実装方法のチェック

大タスクを実現するために具体的に必要な事柄をチェックします。B.と同じ教材から見つけ出せることが理想です(大体説明がついてます)。

ここで難しいと感じた場合、一度立ち止まって何が分からないかを**小タスクとしてマイルストーンにメモ**します。

マイルストーンの例としてはこのようになります。
このようなタスク管理にGitHubやNotionなどのサービスを使うとはかどります。

```
大タスク: 給与の予測
小タスク: - 線形回帰
　　　　  - 特徴量選択
　　　　  - Python/R
　　　　  - ...
``` 

難易度が高く躓いた場合の対応策としては下の2つが思いつきます。

1. その問題を学習のサブテーマ(A.における手法)として新たに学習計画を立てる。
2. 分からない部分を一旦飛ばす(ここではprocrastinating: 「プロクラ」と呼びます)

## D.実際に作業を開始する

C.にあるマイルストーンから、進捗具合を管理します。

進捗がなかなか生まれないときは以下の対応策が考えられます。

1. 原因がプロクラによる理解不足ならそちらの学習も進める
2. Stackoverflow/teratail などのQ&Aサービスを利用する
3. 学習方法を変えてみる: (例)eラーニングからアウトプットに

以上が大まかなステップになり、これらの状態遷移は以下のような図で表せます。

Cからサブテーマに飛ぶ場合はこのように表現できます。<img width="675" alt="スクリーンショット 2019-12-20 18.15.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186209/0222cd6b-08b6-9bab-75f6-d4597ba023f7.png">


# おわりに

できるだけ安く機械学習を学ぶ上でのアイデアを共有させていただきました。



機械学習においては生データを使うことがとても大切だと思います。これは英語を学ぶときに理論だけではなく実際に英語をつかってみることの重要性に似ています。そしてkaggleはそれを実現する有効な手段です。

## タダより高いものはない?

という言葉があるように、安いサービスはときに危険です。1つの情報ソースを過信してはいけません。このような情報を見極める力をつけるのも勉強の一環かもしれません。

ここまで「タダ」を強調しましたが、学習したものは何らかの形でコミュニティ・社会へ還元されるでしょう。タダの学習を謳歌しましょう！！

# おまけ

### アウトプット=究極のインプット

プロジェクトに余裕ができたとき、もしくは一区切りがついたらそこまでの進捗を記事などの形に残しておきましょう。

アウトプットには以下のようなメリットがありそうです。

- コミュニティへの貢献
- 成長(もしくは未成長)の実感
- 思考の整理、見直し→大事なインプットへ

アウトプットの例として参考になるのはkaggleの`n-th place solution`でしょう。ただ、そこまで気負わなくてもメモ書き程度のものでも問題ありません。

### 質問しよう

> あなたに起きたことは誰にでも起こりうる

オンラインでの質問ほどいいものはありません。あなたは相手の顔色を伺う必要がなくいつでも質問ができ、回答者は答えたいときに質問に答えることができます。

#### ?作法が分からない?

匿名でStack Overflowに登録し、質問しましょう。英語で書くのが怖ければ日本語を機械翻訳にかけましょう。

この方法の最悪のシナリオは機械翻訳が理解されず、回答がつかないことです。匿名ユーザーにとっては大した傷ではありません。ガンガン質問しましょう。