機械学習 ことはじめ

機械学習とは、一言でまとめると、
"データの集合から、その法則性を学ぶもの"
といえるかと思います。

機械学習を学ぶにあたって、実際に色々動かしてみるためのベースとなる環境設定を簡単にまとめてみました。
***
下記のコマンドでpythonを使用した機械学習の勉強に必要な環境は大抵入れることができます。
anacondaを使用している方はpip installの箇所をconda installと置き換えてください。
また、minicondaでも最低限必要な環境であれば揃えられるかと思います。
*但し、個人での機械学習の基礎を学ぶ場合の話です。企業などビジネスで活用するのであれば、当然この限りではありません。
```
$ pip install numpy scipy matplotlib ipython scikit-learn pandas pillow 
```
*scikit-learnはnumpyとscipyに依存しています。従って、numpyとscipyの入ってない環境でscikit-learnだけインストールしようとするとエラーが出ますのでご注意ください。

好みにもよりますが、私の場合は機械学習を勉強する環境としてはjupyter notebookが使いやすかったです。
*インストールと起動は下記コマンドです。またはjupyterをインストールした後は、jupyterのアプリを直接たたいても構いません。
インストール
```
pip install jupyter
pip install ipython[notebook]
```
起動
```
jupyter notebook
```
但し、jupyter環境で勉強しているとき、先人たちのgitにあがってるコードや参考書などを試していて、度々モジュールがインストールされてないというエラーが生じることがありました。

例えば、scikit-learnについて、確かにターミナル(windowsならコマンドプロンプトかpowershell)でpipコマンドでインストールしていたにも関わらず、下記のような不具合が表示される時があります。
```
ImportError: No module named scikit-learn
```

原因はpythonの環境変数の設定だとか、参照先が異なっているとか色々あるかと思われますが、このようなエラーが出た場合の対処法の一つとして、jupyter上でpip installしてしまうのが手っ取り早いかと思います。
```
!pip install scikit-learn
```
*ターミナル(またはコマンドプロンプト、powershell)ではなく、jupyter上で行うこと、pipの前に!がついていることに注意してください。
また、機械学習の勉強をしていると、参考サイトや書籍などでmatplotlibを使用した描画の例を表示させることがよくありますが、私の環境では、matplotlibの描画で不具合が出ることがしばしばありました。描画が上手くいってないときは、まずmatplotlibで簡単なサンプルを試してみてください。
例：
```
import matplotlib.pyplot as plt 
plt.plot([1,2])
plt.show() 
```
また、以下のサイトも参考になるかと思います。
[Pythonでmatplotlibの描画がうまく機能しない場合の対処](https://qiita.com/yoshizaki_kkgk/items/bcb45e3bc936ec49ef00)

matplotのimport時に下記のコマンドで、matplotlibで作成された図を別windowに表示することもできます。
```
import matplotlib as mpl
mpl.use('tkagg')
```

scikit-learnで何かしらの演算を行い結果を表示すると変数に_が付きます。
```
test1_: [0.3]
test1_: [0.5]
*0.3, 0.5といった値に意味はありません
```
>(Pythonではじめる機械学習(O'REILLY)より)
scikit-learnでは、訓練データから得られた属性には全て最後にアンダースコアをつける慣習になっている。これは、ユーザが設定したパラメータと明確に区別するためだ。

これらの環境を構築したら、データの集合をどういう観点で見ていくかが、最初のポイントとなります。代表的な分け方として、<b>ハードクラスタリング</b>と<b>ソフトクラスタリング</b>があります。
<b>ハードクラスタリング</b>・・1つのサンプルに対し1つのグループだけを割り当てる
例：K平均法
サンプルをK個のグループに分割。各グループの中心を決めて、各サンプルがグループ中心が自分と最も似ているグループに所属するようにする
1,K個のグループ中心をランダムに選択。
2,各サンプルを、グループ中心がそのサンプルと最も似ているグループに所属させる
3,各グループに所属するサンプルの平均値を新しいグループ中心とする。

<b>ソフトクラスタリング</b>・・1つのサンプルに対し各グループへの所属確率を割り当てる
例：混合正規分布
各グループを1つの正規分布に対応づけ、各サンプルが各グループに所属する確率を推定します。

グループ分けするときに、どの変数に着目すればよいかということが、悩みどころとなりますが、データを解釈しやすいようにする代表的な方法として、次元削減があります。
端的に言えば、変数の数が多いより少ないほうが、可視化も容易となり、データを扱いやすくなるということです。
次元というのは、この場合変数のことを指しています。つまり、次元削減は、扱う変数の数を減らすということです。

よく使われる次元削減として、主成分分析があげられます。
既存のデータからでは、どれか一つの変数に着目しても全体像がよく見えないような場合に、だったらどんな変数に着目すれば、データが理解しやすくなるだろうかと検討します。
検討の仕方としては、既存の変数それぞれに対し、係数を掛け合わせた総和の分散値が最大になるように係数を求めていきます。
(詳細な演算式は略)

pythonやRを使えば主成分分析の計算自体はそれほど難しくはありません。pythonならscikit-learnが用意してくれているPCAというものがありますし、同じくRでもprcompやprincompと言ったものが用意されています。

```
python:
from sklearn.decomposition import PCA

R:
test1.pc<-prcomp(test2)
```

多変量解析では、データのばらつきをどのように説明すればいいかが、データを理解するうえで重要なファクターとなります。分散とはデータのばらつきの総和です。主成分の分散を、既存の各々の変数の分散の総和で割った値を寄与率と呼び、この寄与率を見ることで、設定した変数が既存データのばらつきをどれくらい説明しているかを見ることができます。

まだまだ機械学習の導入部の説明にもなってませんが、あまり一つのページに詰め込みすぎるのは好きではないので、このページは一旦ここまでとし、自身の勉強に合わせてページを追加していくこととします。不定期で追加編集していくつもりです。

最後に機械学習、Deep learningの勉強にお勧めのページを紹介しておきます。
[Coursera(スタンフォード大学Andrew先生)](https://www.coursera.org/learn/machine-learning/home/week/10)
[Udacity](https://www.udacity.com/course/deep-learning--ud730)
[MIT Deep Learning Book (beautiful and flawless PDF version)](https://github.com/janishar/mit-deep-learning-book-pdf)
[Deep Learning(An MIT Press book)](http://www.deeplearningbook.org/)
[deep-learning基礎講座演習コンテンツ-公開ページ(東京大学松尾研究室)](http://weblab.t.u-tokyo.ac.jp/deep-learning%E5%9F%BA%E7%A4%8E%E8%AC%9B%E5%BA%A7%E6%BC%94%E7%BF%92%E3%82%B3%E3%83%B3%E3%83%86%E3%83%B3%E3%83%84-%E5%85%AC%E9%96%8B%E3%83%9A%E3%83%BC%E3%82%B8/)