Coursera機械学習入門オンライン講座虎の巻(文系社会人にオススメ)

無料の[Coursera機械学習入門コース](https://www.coursera.org/learn/machine-learning/)を受講しました。数学に自信がない文系卒社会人の私でもだいたい理解できた(気になった)素晴らしいコースでした。
何が素晴らしいかというと**無料で体系的に基礎を学べ、わかりやすい点**です。Couseraのコースが全て良いのか知りませんが、[機械学習入門コース](https://www.coursera.org/learn/machine-learning/)は非常によく練られています。私は基本的に本で学習することが多いのですが、「オンラインコースも良いな」と感じました。
※修了証をもらうのは有料なので注意してください。


# サマリ
以下がサマリです。プログラム演習を真面目にやっていない分、時間を短縮させています。その反面、ブログに学習内容をメモしているのに少し時間をかけています。

|項目|内容|
|:-:|:--|
|目的|機械学習の基礎を学ぶため|
|期間(実績)|2ヶ月弱|
|総時間(実績)|64時間弱|
|期間と期限|全11週で1週ごとの提出期限|
|使用プログラム言語|[Octave](https://www.gnu.org/software/octave/)|
|講義形式|ビデオ・スライド・クイズ・プログラム演習<br>※基本英語だが、ビデオは日本語字幕あり|

# 学んだことサマリ
以下のことを学びました。**数式も交えて丁寧に説明**してくれます。また、**数理的に難しい部分は省略してくれます**。今まで私はつまみ食い程度に色々と勉強していましたが、**体系的に学べるとすごくスッキリ**しました。

- 教師あり学習
    - 線形回帰・ロジスティック回帰・ニューラルネットワーク・SVM
- 教師なし学習
    - K-Means・主成分分析(PCA)・異常検知
- 特別なアプリケーション・トピック
    - レコメンデーション・ビッグデータ対応
- 応用    
    - バイアス/バリアンス・正則化・アルゴリズム評価・学習曲線・エラー分析・天井分析

上記を学んだ結果、データサイエンス系の課題(例：部屋の大きさ、駅からの距離などの賃貸情報から家賃を予測)があったときにどんなアプローチで解決していくかが検討できるスキルが身につきます。ただ、Octaveという実務で使われているのがあまり聞かないプログラム言語なので、システム実装の即戦力とまではいかないです。
※ニューラルネットワークは対象ですが、ディープラーニングは対象外なので注意してください。

# 学習における注意点
## まずは
前提知識など書きますが、**どうせ無料だし提出期限過ぎても再開できるのでまずは始めたらいいんです**。気楽に始めて合わないと思ったりつまらなかったら辞めちゃえばいいです。

## 前提知識
前提知識について色々書いていますが、あくまで個人体験に基づく私感です。「こんな前提いらないよ！」や「もっと前提知識いるだろ！」って意見あると思います。

### 数学前提知識
前提知識として**高校レベルの数学は理解しておきたい**です。シグマ$\sum$のような数学記号にアレルギーがなく、**特に微分の概要(高校レベル)は理解しておかないと難しい****と思います。**統計と線形代数も知っておくと理解が深まります**。ただ、線形代数は[第1週](https://qiita.com/FukuharaYohei/items/44d97f411f0b1baaa42c#17-linear-algebra-review)に基礎を教えてくれます。統計は[「まずはこの一冊から 意味がわかる統計学」](http://amzn.to/2FwYAWZ)の本のレベルで十分で、分散・標準偏差・正規分布を知っていればいいです(導出できなくてもいい)。
数学勉強方法については、記事[「文系卒社会人が統計・機械学習を理解するための数学勉強方法【随時更新】」](https://qiita.com/FukuharaYohei/items/0a66c37091dc27c71fe6)を参考にしてください。

### 英語前提能力
**[リンク先動画](https://www.coursera.org/lecture/introduction-tensorflow/a-conversation-with-andrew-ng-nTRHI)を字幕で見て理解できるかが前提英語能力**です。基本的にはゆっくりと明瞭に話してくれますし、英語字幕・日本語字幕もあるし、わからなければ戻ることもできるのでハードルは高くないです。ただ、英語アレルギーのような人には、無理にこの講座にこだわらなくても世の中にはどこかに日本語の良い講座や勉強方法もあるはずです。
私の場合は集中しないと理解できないですし、講義中に気がそれて何度も動画や字幕を見返していました。

### プログラミング前提知識
**Octaveという言語に対する経験・知識は不要です**。JavaやC言語など何かの言語に対する経験はあった方が大いに望ましいのですが、ないと無理なのかは判断できないです。
プログラミングが体に染み付きすぎて、「自分自身が知らない状態だと」という仮定でプログラミング演習が可能か判断できなかったです。

### 機械学習前提知識
**基礎の入門コースなので、基本的に機械学習前提知識はいりません**。
とは言っても私は英語力など不安だったので[「やさしく学ぶ 機械学習を理解するための数学のきほん」](https://amzn.to/2qfN9AP)という本で事前に勉強しました。**英語に自信の無い方はこれを読んで事前学習しておくのもオススメ**。

## 時間に関する注意
**できるだけ短期間でやりきることが効率の観点からオススメ**です。課題には提出期限があって、最初の方は期限が結構厳しく感じます(期限過ぎてもやり直しできます)。**期限に余裕を持たせるために特に前半に休みを取る、祭日が多いときを選ぶなどができると良いです**。
私は1回仕事が忙しくなって挫折して、1年越しで再開して修了しました。また、修了できたときも途中仕事が忙しくなって1週間近くできない時もありましたが前半に貯金をしていたので、何とかなりました。偶然にも祭日が多い秋にやったことも幸いでした。

# 学習の進め方
講義内容はVideo、Reading、クイズ、プログラム演習の4種類です。
第6週まではVideoとReadingが基本的に対になっていて、Videoを見てそのサマリをReadingで理解するような作りです。第7週以降はVideoと対になっていたReadingがありません。
以下が学習の進め方でした。

- 学習前に週の内容をまとめてくれているブログ記事を見て概要を把握
- Videoを英語字幕で1.25倍速で見ながら理解
- Videoで約3分ごとに一時停止して日本語字幕を見て理解した内容を確認
- わかりにくい点があったらググったりして調べて理解を深める
- Videoを見終わったら理解した内容をブログにメモ
- プログラム演習は基本的にGitHubにある内容でカンニング(演習内容自体は理解した)

**プログラム演習は、カンニングという手段で省略**しました。Octaveという実務で使わなそうな言語だったのと、私が概要レベルでまずは理解したかったので重視しませんでした。**もっと深いレベルで復習したいと考える状況になったら再度挑戦したい**と思います。

# 学習内容と時間
## 学習内容のキーワード
どこで学習したかを振り返るため週とそこで学んだ内容のキーワード一覧です。

|週|内容|キーワード|
|:-:|:--|:--|
|1|Introduction|機械学習定義・機械学習の種類・FAQなどコースの使い方|
|1|Linear Regression with One Variable|線形回帰・コスト関数・平均二乗誤差・最急降下法・学習率・局所最適化|
|1|Linear Algebra Review|線形代数の基礎|
|2|Linear Regression with Multiple Variables|Ovtave/Matlab環境設定・重回帰・Feature Scaling・多項式回帰・正規方程式(Normal Equation)|
|2|Octave/Matlab Tutorial|Octave/Matlabチュートリアル|
|3|Logistic Regression|分類・ロジスティック回帰・二値分類・他クラス分類・決定境界・共役勾配法(Conjugate gradient)・BFGS・L-BFGS|
|3|Regularization|過学習・ハイバイアス・ハイバリアンス・正則化(Regularization)|
|4|Neural Networks: Representation|ニューラルネットワーク・非線形・ニューロン・隠れ層・フォワードプロパゲーション・One-Hot Encoding|
|5|Neural Networks: Learning|誤差逆伝播法(バックプロパゲーション)・Gradient Checking・Random Initialization・Symmetry Breaking・自動運転|
|6|Advice for Applying Machine Learning|データ分割・交差検証(クロスバリデーション)・バイアス・バリアンス・正則化・学習曲線|
|6|Machine Learning System Design|エラー分析・不均衡データ(Skewed Data)・正答率(Accuracy)・適合率(Precision)・再現率(Recall)・F値|
|7|Support Vector Machines|SVM・カーネル・ガウシアンカーネル|
|8|Unsupervised Learning|クラスタリング・K-Means|
|8|Dimensionality Reduction|次元削減・主成分分析(PCA)|
|9|Anomaly Detection|異常検知・ガウス分布(正規分布)・多変量ガウス分布|
|9|Recommender Systems|レコメンデーションシステム・コンテントベース・協調フィルタリング(Collaborative Filtering)・平均標準化(Mean Normalization)|
|10|Large Scale Machine Learning|確率的最急降下法(Stochastic Gradient Descent)・ミニバッチ最急降下法(Mini-Batch Gradient Descent)・オンライン学習・MapReduce・並列化|
|11|Application Example: Photo OCR|OCR・パイプライン・スライディングウィンドウ(Sliding Windows)・データ水増し(Data Augmentation)・天井分析(Ceiling Analysis)|


## 各実績時間グラフ
各週の単元にかけた時間をグラフ化しました。棒グラフが各週の単元にかけた時間で、折れ線が累計です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/2643fb33-c5d1-da95-7550-011452988157.png)

- 9週目(異常検知・リコメンデーション)は仕事が忙しく、なかなか時間が取れなかった期間なので時間がかかっています。
- 10週目と11週目はプログラム演習がないので時間が少ないです。
- 4週目のニューラルネットワークは事前にある程度知っていたので時間が少な目です。
- あまり実績時間が増えなかったですが、5週目の「ニューラルネットワークと誤差逆伝播法」は難しくて鬼門に感じました。ここで挫折する人多いのでは・・・
- 私はブログ記事としてメモしていたので、特に数式を書くなどの作業で時間をかけてしまっていましたが、紙のノートにかけばもっと時間短縮できたはずです

各目安時間(オレンジ)と実績時間(青)の比較グラフです。目安時間は、単純にVideoの時間だったりするので当然それより実績時間の方が多いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/354d831f-581e-1707-2889-b9920225202d.png)


# 修了証
コースが素晴らしく、敬意を表して8500円程度で購入しました。別に買わなくてもいいです。
クレジット会社からUSで支払ってるけど不正使用じゃないか確認電話が来ました(笑)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134273/d53f0ecf-ef7b-af40-66a7-d62a7bd31da4.png)

# 参考リンク
以下のサイトにお世話になりました。

- [数学の苦手なバイオの学生がCourseraの機械学習コースを修了して気づいたこと](https://qiita.com/katsu1110/items/423fc9ac567710a1bd9b)
- [備忘録～忘れなそう？～](http://forgetzimbnot.com/category/%e6%a9%9f%e6%a2%b0%e5%ad%a6%e7%bf%92)
- [演習カンニング用GitHub](https://github.com/atinesh-s/Coursera-Machine-Learning-Stanford)

# 記事リンク
基本、自分用メモなのでしょぼいですが各週の記事リンクです。

- [Coursera機械学習入門コース(1週目 - 線形回帰と線形代数)](https://qiita.com/FukuharaYohei/items/44d97f411f0b1baaa42c)
- [Coursera機械学習入門コース(2週目 - 重回帰、多項式回帰、正規方程式)](https://qiita.com/FukuharaYohei/items/bcd676691f61dac8d0c8)
- [Coursera機械学習入門コース(3週目 - ロジスティック回帰、正則化)](https://qiita.com/FukuharaYohei/items/270c629fd74a7da4b9da)
- [Coursera機械学習入門コース(4週目 - ニューラルネットワーク)](https://qiita.com/FukuharaYohei/items/6337dd992ebde6a744fa)
- [Coursera機械学習入門コース(5週目 - ニューラルネットワークと誤差逆伝播法)](https://qiita.com/FukuharaYohei/items/e7d60e371c076a0c215a)
- [Coursera機械学習入門コース(6週目 - 様々なアドバイス)](https://qiita.com/FukuharaYohei/items/25a76132b420cea901f2)
- [Coursera機械学習入門コース(7週目 - SVM)](https://qiita.com/FukuharaYohei/items/a67a8ae381b54e4ee0ea)
- [Coursera機械学習入門コース(8週目 - 教師なし学習(K-MeansとPCA))](https://qiita.com/FukuharaYohei/items/7a71be58818719cdf73c)
- [Coursera機械学習入門コース(9週目 - 異常検知、レコメンデーション)](https://qiita.com/FukuharaYohei/items/32caeaca6f77bf6f92dd)
- [Coursera機械学習入門コース(10週目 - ビッグデータ対応)](https://qiita.com/FukuharaYohei/items/1e33cb05a5833d22fe4b)
- [Coursera機械学習入門コース(11週目 - 写真OCR)] (https://qiita.com/FukuharaYohei/items/46c60cf591223915e6b4)