Pythonではじめる機械学習　レポート②

# 2章　教師あり学習
##・クラス分類と回帰
　教師あり学習には**クラス分類(classification)**と
**回帰(Regression)**の2種類がある。

　クラス分類とは、想定される答えの中から1つを選ぶ処理である。
例えば、「このメールは迷惑メールか？」という問題に対して、
「はい」か「いいえ」を判定してくれる。

　回帰とは、ある数値を算出するような処理である。
例えば、「この人の年収はいくらか？」という問題に対して、
「学歴」「年齢」「住所」をパラメータとして設定すれば、
答えを算出してくれる。

##・汎化、過剰適合、適合不足
　教師あり学習の場合、用意された訓練データがすべてである。
訓練用のデータにのみ正確な答えを返し、
未知のデータに対して正確に答えられない状態を**過剰適合(overfitting)**という。

　過剰適合に対して、訓練データに対してすらまともに答えられない状態を
**適合不足(underfitting)**という。

　過剰適合と適合不足の間を探り、
訓練データと未知のデータの両方に適切に回答できる状態を汎化という。

##・教師あり機械学習アルゴリズム
###　・線形モデル
　**線形モデル(linear model)**とは、**線形関数(linear function)**を使って予測するモデルである。
数式は以下の通りである。

y = w[0] * x[0] + w[1] * x[1] + ... + w[p] * x[p] + b

p : 特徴量の数
w : 学習したモデルのパラメータ
x : 特徴量

　なお、特徴量が1つの場合、以下のような式になる。

y = w[0] * x[0] + b

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/41c5b7ff-3e91-a241-8b03-6e5a0ccea044.png)

#### 通常最小二乗法
　**通常最小二乗法(ordinary least squares)**は、上記の式を使って
予測値と答えの**平均二乗誤差(mean squared error)**が最小になるように、
wとbを求める方法である。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/451fe27b-1e77-c622-9a40-602330116d36.png)

#### リッジ回帰
　リッジ回帰(Ridge Regression)に用いる式は、通常最小二乗法と同じである。
通常最小二乗法との違いは、傾きwをなるべく0に近づけて、
特徴量の影響を少なくすることである。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/9ff9640d-9b1f-3062-5b60-00d657d9d1a1.png)

#### ラッソ回帰
　ラッソ回帰(Lasso Regression)は、リッジ回帰の改良版である。
リッジ回帰との違いは、**傾きwを完全に0にしてしまうことである。**

###　・ナイーブベイズクラス分類器
　ナイーブベイズクラス分類器とは、ベイズの定理を使って分類問題にアプローチするアルゴリズムである。

####　ベイズの定理
　ベイズの定理は、以下のような数式で表せる。
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/e93ce136-2f11-1b15-fac6-a4643a9d548f.png)

P(X):事象X
P(Y):数種類ある、互いに排反な事象Y
P(Y|X):推定したい事象Yが起きる確率
P(X|Y):事象Xの結果が推定したい事象Yになる確率

例)2つの袋があり、次のように黒い玉と白い玉が入っているとする。
・袋1：黒い玉4つ、白い玉1つ
・袋2：黒い玉3つ、白い玉3つ

　どちらかの袋から玉を1つ取り出すと、黒い玉だった場合の
玉が袋1から取り出された確率を求める。

　黒い玉が取り出されたという事実を事象X、
玉を袋1から取り出す事象を事象Y1、
玉を袋2から取り出す事象を事象Y2とする。

　袋は2つなので、どちらの袋が選ばれるかは、
P(Y1) = P(Y2) = 1 / 2

　黒い玉が選ばれる確率は、
袋1の場合：P(X|Y1) = 4 / 5
袋2の場合：P(X|Y2) = 3 / 6 = 1 / 2

　これをベイズの定理の式に当てはめると、
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/53134b9a-ac81-2cb5-aaf0-4f98b3c93fc1.png)

8 / 17 = 0.47となる。

　以上のアルゴリズムを使ってクラス分類するアルゴリズムをナイーブ(単純)ベイズクラス分類器という。

###　・決定木
　決定木は、「はい」か「いいえ」で答えられる質問を階層構造にしたものを学習するアルゴリズムで、
クラス分類と回帰に用いられるモデルである。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/ba3bcddd-d440-cfe3-f56c-27db0c2e1028.png)

　決定木を構築する際、すべての質問の中から、最も情報量の多いものを頂点にして階層構造を構築する。

###　・サポートベクターマシン
　サポートベクターマシンは、データを2つのクラスに分類するのに適しているが、
複数のクラスに分類するのに不向きである。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/73b97f6f-b2a1-0e76-a3d9-389fc30a1adf.png)

　学習データから、y=ax + bより上はすべて赤い三角形、
下は青い丸と同じものとみなすアルゴリズムである。

###　・ニューラルネットワーク
#####　単層パーセプトロン
　単層パーセプトロンを以下の図に示す。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/dabda6c9-ea32-a526-2abb-b5e6256755a3.png)

　単層パーセプトロンの場合出力y^が0か1かで決定とされるので、
以下のような式となる。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/cba0105f-6eb8-03f9-e2e2-f1246ef7b559.png)

　この式をグラフ化すると、以下のようになる。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/f41e81bb-cbf5-cddc-3340-d74013d817a2.png)

####　多層パーセプトロン
　**多層パーセプトロン(Multi Layer Perceptron)**は、
単層パーセプトロンの誤差を自分自身で修正するように改良されたアルゴリズムである。

　単層パーセプトロンの誤差を以下の図に示す。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/9d6ab94d-230a-747e-7884-f9cc03779f91.png)

　誤差を自分自身で少なくするには、微分可能な関数である必要があるが、
単層パーセプトロンの関数だと微分できないので、代わりに以下の関数を使用する。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/58eaaa12-4bef-9d40-6b91-69ed771f905e.png)

　この関数をグラフ化すると、以下のようになる。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/d4565152-3fc0-13e0-f282-134b2bdcd421.png)

　単層パーセプトロンの入力と出力の間(中間層)にこの関数を挟むことによって、
さまざまな関数を表現できるようになり、誤差を自分で修正できる。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/314381/be51ea7b-d828-7743-ba14-fdbd1ae59b80.png)

##・まとめ
　データに対してどのアプローチをするのか判断する際は、
線形モデルやナイーブベイズなどの簡単なモデルで試した後に
サポートベクターマシンやニューラルネットワークなどの複雑なモデルに移行することをおすすめする。