Courseraの機械学習コースのススメ 前編

大晦日・お正月2日と、[Courseraの機械学習コース](https://www.coursera.org/learn/machine-learning)に取り組んで全11週のうち3週目まで終えたので、振り返りつつオススメしてみます。

# 経緯

こんな記事を投稿したら、

[2015年振り返り](https://medium.com/@mono0926/2015年振り返り-bc683453ca69)
> ## 反省
> 機械学習周りを(再)学習 → オーディオブックで[「人工知能は人間を超えるか」](http://www.amazon.co.jp/dp/B00UAAK07S?tag=mono0926-22)を聴いて良書っぷりに感動した程度

@koher さんからCourseraの機械学習コースを勧めていただき、ちょうどまとまった時間確保出来るタイミングだったので取り組んでみました。


<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/_mono">@_mono</a> おそらくご存知だとは思いますが、機械学習は Coursera の Machine Learning のコース（日本語字幕あり）がとても良かったですよ。もっと高度な内容を勉強されたいということかもですが。 <a href="https://t.co/1d3VM9hbwg">https://t.co/1d3VM9hbwg</a></p>&mdash; koher (@koher) <a href="https://twitter.com/koher/status/682225511372750848">December 30, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

今期の開講期間も2015/12/28-2016/3/21と、それもタイミングぴったりでしたので、これはやるしか無いなと思いまして(　´･‿･｀)

# Octaveを用いるのが今いち、という事前の印象

実装は、[Octave](https://www.gnu.org/software/octave/)というほぼ[MATLAB](http://mathworks.com/products/matlab)互換の言語でなされます。

機械学習といえば[Python](http://python.org)だと思っていて、言語的にもまあまあ分かるし好きなので、そちらが良かったです（´・ω・｀）

ただ、講義でも時折触れていますが、こういう事情のようです。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/_mono">@_mono</a> 確かにPythonでやりたかったのはありますね。講義の中で、最初はアルゴリズムが機能するのかOctaveで試してから、その後より一般的な言語で組むのが一番時間を節約できるって言ってるんですけど、NumPyとかあるし今はそんなことないと思うんですよね。</p>&mdash; koher (@koher) <a href="https://twitter.com/koher/status/682361271153340418">December 31, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

2008年くらいに学部の授業などでMATLABは少し触ったものの、ほぼ忘れてましたが、第2週などでなされるOctave講座で大体掴めました。
確かに、Python + NumPyなどよりかなりシンプル・直感的な記述で、もっともだなと思いました。

## Pythonは復習に使うことにした

とはいえPythonで機械学習系コード書けるようになりたいという思いもありましたが、Python版のコードが落ちているので、それ使えば良いと思うことにしました。
Python 2.7のコードだったりしますが、Python 3.5など使いたい場合も[2to3](http://docs.python.jp/2/library/2to3.html)でOKでした。

- ~~[PYTHON CODE FOR MACHINE LEARNING CLASS OFFERED BY COURSERA](http://subokita.com/2014/03/03/python-code-for-machine-learning-class-offered-by-coursera/)~~ https://github.com/subokita/mlclass のリポジトリが削除されました
    - これが一番スター多いはず
- [hobson/coursera](https://github.com/hobson/coursera)
- [zsiciarz/ml-coursera](https://github.com/zsiciarz/ml-coursera)


また、こういう記事を見つつ、復習していくのも良いなと思いました。

- [Python - Coursera / Machine Learningの教材を２度楽しむ - Qiita](http://qiita.com/TomokIshii/items/b22a3681cb17836c8f6e)
- [機械学習 - Coursera Machine Learningの課題をPythonで: ex1（線形回帰） - Qiita](http://qiita.com/nokomitch/items/a756e276cdb8c3f5035d)

第2週目からは、プログラミング課題あって、それもPythonで済ませられないかな？と思っていましたが、Octaveでお膳立てされたコード群に穴埋め式で記述していって、これまたOctaveで書かれたsubmit関数で提出、という感じなのでコース自体は素直にOctaveで進めていった方が良さそうです。

また、確かに以下の通りなので、Pythonで実装し直し(可能なら自力・難しいなら上記リンクのコードを写経)ながら復習して理解を深めていく、というのが良さそうに思いました。

<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr"><a href="https://twitter.com/_mono">@_mono</a> でも正直プログラミングのテストの部分はお膳立てされすぎててテストをこなしているだけでは身に付かないので、概念を学べる部分が一番大きかったです。この人、僕がこれまでに見た中でトップレベルに説明がうまいです。それでいて機械学習の研究者としてもトップレベルだからすごい…。</p>&mdash; koher (@koher) <a href="https://twitter.com/koher/status/682362359017390081">December 31, 2015</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

[Python 3.5の型ヒント](http://qiita.com/t2y/items/f95f6efe163b29be59af)活用したり、[Jupyter](http://jupyter.org)でインタラクティブに実行したりアレンジしながらやると良さそうです。
IDEは、[PyCharm](https://www.jetbrains.com/pycharm/)が[iPython Notebook](https://www.jetbrains.com/pycharm/help/ipython-notebook-support.html)対応していたり、[デバッグ時にNumPyのarrayを表形式で見られたり](http://blog.jetbrains.com/pycharm/2014/11/third-pycharm-4-eap-numpy-array-viewer-ipython-notebook-improvements-and-more/)と良い感じですヽ(・ω・｀）


また、このあたり調べつつ気づきましたが、さすが人気コースだけあって、Python関係に限らず、このコース受講した方達の日本語ブログもかなり多いので、参考にしたりモチベーション維持などに役立てそうです。

# 受講に必要な事前知識

線形代数の解説なども多少ありますが、基本的には数学がある程度分かっている前提に感じます。
「微積分・線形代数は習ったけど理解微妙・忘れちゃった」くらいが最低限かなという印象です。
数学的に難しいところはスキップして公式の紹介に移ったりもしますが、それでもまあまあレベル高いです。

僕は理系で院まで行って多少統計・機械学習なども学びましたが、当時理解が微妙で、さらにそれらにほとんど触れない状態で6年くらい経った状態ですが、1週目はすんなり理解出来ていたものの、今終えた3週目くらいにはけっこういっぱいいっぱいになってきた感じです。定性的理解は出来ても式の理解が追いつかない、みたいな感じですかね。

また、英語力もある程度必要です。
説明動画には日本語字幕ありますが、他は全部英語なので、技術系記事くらいはすらすら読めないとキツいかと思います。また、英語音声聴いて理解出来た方が、コースの内容自体の理解は捗るかと思います。
あと、統計・機械学習専門用語がけっこう多くて聞き慣れないのが多いのもちょっと大変です。

# 講義振り返り

[シラバス載ってます](https://www.coursera.org/learn/machine-learning)が、それらの用語に対応する日本語あると捗る、という意味も含めてざっと講義内容も載せていきます。

## 第1週目

Cousera自体の説明や、機械学習コースのイントロぽいことを交えつつ、わりと初歩的な内容でした。
プログラミングは一切無しでたまに簡単なクイズが出題されて4/5問以上正答でパスする感じです。(3回くらい間違えると8時間経たないと再回答出来ない状態になります)

- 機械学習(Machine Learning)とは何か？
    - 教師あり学習(Supervised Learning)・教師無し学習(Unsupervised Learning)
- 線形回帰(Linear Regression)
    - 最小自乗法
- 最適化問題(Cost Funciton)
- 最急降下法(Gradient Descent)
- 線形代数
    - 行列計算


## 第2週目

ようやくOctaveによるプログラミング課題が出てきました。

- Octaveセットアップ
- 重回帰分析(Multivariate Linear Regression)
    - 複数特徴量(Multiple Features)
    - 多項回帰(Polynomial Regression)
- 線形回帰周りのプログラミング課題
    - お膳立てされてる
- Octaveチュートリアル
    - 正規方程式(Normal Equation)の説明も

> 線形回帰周りのプログラミング課題

Octaveチュートリアル見てからじゃないと困難です。
なんでこういう並び順になっているのでしょう（´・ω・｀）

Octave自体興味無いのに言語学習するの億劫でしたが、まあ易しい言語なので、これで大体理解してそれに相当する関数を他の言語で調べる、という形でしっくり来ました。

## 第3週目

このあたりから、付いていくのがけっこうキツくなってきました(´・︵・｀)

- 分類(Classification)・仮説表現(Hypothesis Representation)・決定境界(decision boundary)
- ロジスティック回帰(Logistic Regression)
    - 最適化問題(Cost Funciton)
    - 簡略化された最適化問題(Cost Funciton)と最急降下法(Gradient Descent)
    - 発展的な最適化
- 多項分類(Multiclass Classification)
- 過学習(Overfitting)の解決
    - 線形回帰(Linear Regression)の正規化
    - ロジスティック回帰(Logistic Regression)の正規化

まだ3/11週なのにこれからどうなるのだろうと思っていたら、講義の最後に、「この時点でシリコンバレーの多くのエンジニアより機械学習の知識が付いたはず」というお言葉があり、なるほどと思いました(　´･‿･｀)

# 環境構築で躓いたところ

OS X(10.11.2)で主にHomebrew使って各種環境セットアップしましたが、以下の3点ほど躓きました。

## [Octave-Gnuplot-AquaTerm error: set terminal aqua enhanced title "Figure 1"...unknown terminal type" - Stack Overflow](http://stackoverflow.com/questions/13786754/octave-gnuplot-aquaterm-error-set-terminal-aqua-enhanced-title-figure-1-unk)

`/usr/local/Cellar/octave/4.0.0_5/share/octave/site/m/startup/octaverc`に`setenv("GNUTERM","X11")`追記で直りました。

## Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. 

`~/.matplotlib/matplotlibrc`に`backend : TkAgg`追記で直りました。
[osx - Installation Issue with matplotlib Python - Stack Overflow](http://stackoverflow.com/questions/21784641/installation-issue-with-matplotlib-python)

## Octave 4.0.0で課題submit時のエラー

Octave 3.8が指定されていますが、適当に`brew install octave`とすると4.0.0がインストールされてしまうので。
3.8インストールし直すのが面倒だったので、以下のやり方で直しました。
[Machine Learning - Week2 Octave 4.0で課題をする時のエラー - kegamin’s diary](http://www.kegamin.com/entry/20151116/1447681287)
4.0.1で直るらしいですが、それまで毎回上の実行するの面倒ですし、僕は[このパッチ](https://github.com/tumerbaatar/courseraml/blob/master/patch.py)を実行することにしました。

# 第3週目までやった感想

確かに分かりやすい説明で素晴らしいと思う一方、第3週目で難しくなってきてやや挫折しそうです(　´･‿･｀)
ちょっとストップして復習しようかなと思ったりしてます。

ただ、こういうのやるのは6年くらいブランクあって、鈍ってはいましたが完全に忘れきる前にまた学習する機会取れて良かったなあと感じています。

あと、学習のコツとして、けっこう動画が続いたりして飽きちゃうので、Mac・iPhone・Apple TV(これだけ字幕が映らないのつらい)で観るなど、環境変えつつ取り組んでいます。

身体動かしつつ観るのもオススメです。冬場は特に暖房切れるくらい身体温まって素晴らしいです(　´･‿･｀)
<blockquote class="twitter-tweet" lang="en"><p lang="ja" dir="ltr">この冬は、ながら作業(今だと機械学習動画とか)中に筋トレをよくしてる(　´･‿･｀)&#10;片足スクワットとか軽々出来るようになった(　´･‿･｀)</p>&mdash; M Ono (@_mono) <a href="https://twitter.com/_mono/status/683128716709343232">January 2, 2016</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

また、先日買ったもののパラパラッと見た程度で積ん読だった[ITエンジニアのための機械学習理論入門](https://www.amazon.co.jp/dp/B016Q22IX2?tag=mono0926-22)なども合わせて取り組むと理解深まるかなーと思って、並行かあるいはコース終了後などに取り組みたいなと思っています。

> 今期の開講期間も2015/12/28-2016/3/21と、それもタイミングぴったりでしたので、これはやるしか無いなと思いまして(　´･‿･｀)

というわけで、時期もちょうど良いですし明日も大体の方はお正月休みですし、興味ある方はやりましょうヽ(・ω・｀）