日本ディープラーニング協会 E資格 JDLA認定プログラム受講記録（その２）

[ラビットチャレンジ](http://ai999.careers/rabbit/)のＥ資格講座、応用数学に続いて機械学習です。
[![card.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318589/8e9be486-3440-a3d1-db0c-2b7866601b10.png)
](http://ai999.careers/rabbit/)

[日本ディープラーニング協会 E資格 JDLA認定プログラム受講記録（その１）](https://qiita.com/awasirom/items/6cce5ca6d9c446edb2a4)
[日本ディープラーニング協会 E資格 JDLA認定プログラム受講記録（その３）](https://qiita.com/awasirom/items/df745bc67a6ca3c24ce4)
[日本ディープラーニング協会 E資格 JDLA認定プログラム受講記録（その４）](https://qiita.com/awasirom/items/2c97f3186ffbe2466dd8)
[日本ディープラーニング協会 E資格 JDLA認定プログラム受講記録（その５）](https://qiita.com/awasirom/items/f8e9c0895f5d69fef3a2)
[日本ディープラーニング協会 E資格 JDLA認定プログラム受講記録（その６）](https://qiita.com/awasirom/items/0858abc1daddd7b33797)

---

章の構成は以下の通り。

プロローグ
第1章：線形回帰モデル
第2章：非線形回帰モデル
第3章：ロジスティック回帰モデル
第4章：主成分分析
第5章：アルゴリズム（k近傍法／k平均法）
第6章：（ここでは割愛します）
第7章：サポートベクターマシーン

#３．機械学習

##プロローグ（機械学習モデリングプロセスについて）

1. 問題設定

どのような課題を解決するのかを決める。
機械学習前提でなくてよい。ルールベースで解ければそれでよい。
機械学習の欠点として、記述的な敷居が高い（誰もが理解しているわけではない）、テストが実施しにくい、といったことがある。

2. データ選定
どのようなデータを集めるか決める。

3. データの前処理
きれいな形でデータが得られることは少ない。学習させられるようにデータを変換する。欠損値の対応、フォーマット変換、など。

4. 機械学習モデルの選定
モデル（アルゴリズム）として何を選ぶか決める。ディープラーニングも機械学習モデルのひとつ。

5. モデルの学習（パラメータ推定）
パラメータを決める。

6. モデルの評価
ハイパーパラメータの選定
モデル精度を測る
商用化出来るかの判断

##第１章　線形回帰モデル

###（１）回帰問題  

回帰問題とは、ある入力（数値）から出力（連続値）を予測する問題。
例）株価の予測

- 入力はベクトル。各要素は説明変数または特徴量と呼ぶ。　
- 出力（目的変数）はスカラー値。 
- 線形回帰はデータを直線で近似したもの。
- 非線形回帰はデータを曲線で近似したもの。

**線形回帰モデル**  

- 教師あり学習（正解データから学習）
- 入力（説明変数）とｍ次元パラメータ（$\boldsymbol{w}$）の線形結合を出力するモデル


```math
\begin{align}

パラメータ ： \boldsymbol{w} &= (w_{1}, w_{2},...,w_{m}) \in \mathbb{R}^{m}\\
予測値 ： \hat{y} &= w^{T}x + b\\
\\

\end{align}
```

**パラメータ**：特徴量（入力値）が予測値に与える影響を決定する重みの集合。最小二乗法により推定する。最尤法でも解けるが、その場合は下記の$\epsilon$を正規分布と仮定する必要がある。

線形重回帰モデルを行列で表現すると、

```math
y = X\boldsymbol{w} + \boldsymbol{\epsilon}
```
$\boldsymbol{\epsilon}$は誤差。$X$には切片（上の式で$b$）も含む。

**データ分割**:データを学習用データと検証用データに分割する。学習用データを用いてモデルの学習を行い、検証用データで汎化性能を測定する（学習データで検証しても汎化性能はわからない）。

###（２）パラメータの推定

**平均二乗誤差（Mean Squared Error, MSE）**

データと出力の二乗誤差の平均で小さいほど直線とデータの距離が近い。

```math
MSE = \frac{1}{n}\sum_{i=1}^{n}(\hat{y}_{i}-y_{i})^{2}
```
※テキストには学習データを意味する$train$が付いていたが自明なので省略。

**最小二乗法**

$MSE$を最小化するパラメータを求めればよいが、勾配が０となる点を求めればよい。

```math
\boldsymbol{\hat{w}} = arg \quad min_{\boldsymbol{w}\in{\mathbb{R}}}MSE \qquad \frac{\partial}{\partial \boldsymbol{w}}MSE = 0
```

計算すると、

```math
\frac{\partial}{\partial\boldsymbol{w}}
\Bigl\{
\frac{1}{n}\sum_{i=1}^{n}(\hat{y_{i}}-y_{i})^{2}
\Bigr\} = 0
```

行列表現で置き換える。

```math
\frac{1}{n}\frac{\partial}{\partial\boldsymbol{w}}
\Bigl\{
(X\boldsymbol{w} - \boldsymbol{y})^{T}
(X\boldsymbol{w} - \boldsymbol{y})
\Bigr\} = 0
```

```math
\frac{1}{n}\frac{\partial}{\partial\boldsymbol{w}}
\Bigl\{
(\boldsymbol{w}^{T}X^{T} - y^{T})
(X\boldsymbol{w} - \boldsymbol{y})
\Bigr\} = 0
```

```math
\frac{1}{n}\frac{\partial}{\partial\boldsymbol{w}}
\Bigl\{
\boldsymbol{w}^{T}X^{T}X\boldsymbol{w} - \boldsymbol{w}^{T}X^{T}\boldsymbol{y}
- {\boldsymbol{y}}^{T}X{\boldsymbol{w}}
+ \boldsymbol{y}^{T}\boldsymbol{y}
\Bigr\} = 0
```

$\boldsymbol{y}^{T}X\boldsymbol{w}$はスカラーなので転置しても同じ値である。
つまり、$\boldsymbol{y}^{T}X\boldsymbol{w} = (\boldsymbol{y}^{T}X\boldsymbol{w})^{T} = {\boldsymbol{w}}^{T}X^{T}(\boldsymbol{y}^{T})^{T} =
2\boldsymbol{w}^{T}X^{T}\boldsymbol{y}$
なので、

```math
\frac{1}{n}\frac{\partial}{\partial\boldsymbol{w}}
\Bigl\{
\boldsymbol{w}^{T}X^{T}X\boldsymbol{w} - 2\boldsymbol{w}^{T}X^{T}\boldsymbol{y}+\boldsymbol{y}^{T}\boldsymbol{y}
\Bigr\} = 0
```

となり、$\frac{d}{d\boldsymbol{w}}\boldsymbol{w}^{T}A\boldsymbol{w} = (A + A^{T})\boldsymbol{w}$を使って、

```math
2X^{T}X\boldsymbol{w} - 2X^{T}\boldsymbol{y} = 0
```

```math
\hat{\boldsymbol{w}} = (X^{T}X)^{-1}X^{T}\boldsymbol{y}
```

となり、推定したパラメータから、予測値$\hat{\boldsymbol{y}}$は以下のようになる。

```math
\hat{\boldsymbol{y}} = X(X^{T}X)^{-1}X^{T}\boldsymbol{y}
``` 

#### ハンズオン

線形回帰のハンズオンではBoston Housingのデータを用いて、単回帰分析と２変数の重回帰分析をscikit-learnを用いて行っている。

![Report ML Boston Housing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318589/6b79110a-271e-b1bc-6cd6-20799e70e9af.png)


##第２章　非線形回帰モデル

線形回帰は線形構造が前提。非線形な構造を捉えるには非線形回帰モデリングを用いる。

###非線形回帰モデル

- 説明変数に既定関数と呼ばれる非線形関数に掛けた（特徴空間に飛ばした）ものと、パラメータベクトルの線形結合を用いる。
- 未知パラメータは線形回帰同様、最小２乗法や最尤法により推定する。

```math

y_{i} = w_{0} + \sum_{i=1}^{m}w_{j}φ_{j}(\boldsymbol{x_{i}})+\epsilon_{i}
```

#####よく使われる既定関数
- 多項式関数
- ガウス型既定関数
- スプライン関数／Ｂスプライン関数
 
予測の方法は線形回帰と同じで、

```math
\hat{\boldsymbol{y}} = Φ(Φ^{T}Φ)^{-1}Φ^{T}\boldsymbol{y}
```
ただし、$Φ$は非線形関数の計画行列


###正則化法

- 未学習（underfitting）  
学習データに対して十分小さな誤差が得られていない状態
- 過学習（overfitting）  
学習データに対しては小さな誤差が得られたが、テスト集合に対して誤差が大きい状態
- 正則化  
過学習を回避する手段。やりすぎると未学習になってしまう。
- 汎化性能
新たな入力に対する予測性能。これを高める必要があり、そのためには未学習、過学習を同時に防ぐ必要がある。

#####正則化法
誤差関数に、モデルが複雑になると値が大きくなるペナルティ項（正則化項）を加えることにより、モデルが複雑になり過ぎないようにする。$MSE$にペナルティ項を追加した誤差関数は以下のようになる。

```math
S_{γ} = (\boldsymbol{y}-Φ\boldsymbol{w})^{T}(\boldsymbol{y}-Φ\boldsymbol{w})+γR(\boldsymbol{w})
```

$R(\boldsymbol{w})$：正則化項
γ：正則化パラメータ（平滑化パラメータ）：程度の調整。クロスバリデーション（後述）で値を決める。

#####主な正則化法
- Ridge推定量（L2ノルムを利用）  
パラメータを０に近づけるよう推定する（縮小推定）。
- Lasso推定量（L1ノルムを利用）  
いくつかのパラメータを０に推定（スパース推定）。次元削減の効果もある。

####ホールドアウト法

データを学習用とテスト用に分割し、学習用データで学習し、テスト用データで検証する方法。大量にデータがないと良い性能評価を与えない。

####クロスバリデーション（交差検証）

データをm個に分割、m-1個で学習、残りの１つでテストを行う。テストデータをずらしてm回繰り返す。各回の精度の平均をCV値という。そして、複数のモデルからCV値が良いものを選択する。


##第3章　ロジスティック回帰モデル

###ロジスティック回帰モデル

- 回帰といっているが分類問題（クラス分類）  
- 入力はm次元ベクトル
- 出力は0 or 1
- 線形結合の結果にシグモイド関数を掛けてラベルが１になる確率を求める。

```math
P(Y=1|\boldsymbol{x})=\sigma(\boldsymbol{w}^{T}\boldsymbol{x}+b)
```

$\sigma$はシグモイド関数

```math
\sigma(x)=\frac{1}{1+\exp(-ax)}
```

- $0<\sigma<1$の範囲を取る。$a$が大きいとステップ関数に近づく。
- 微分はシグモイド関数自身を使って書ける。

```math
\frac{\partial\sigma(x)}{\partial x}=a\sigma(x)(1-\sigma(x))
```

###尤度関数

- 確率は固定されたパラメータから特定のデータがどの程度得られやすいか
- 尤度はあるデータが得られたとき、特定のパラメータの値をとることがどの程度ありうるか

確率変数$Y$はベルヌーイ分布にしたがうので、

```math
P(Y=1|\boldsymbol{x})=p
```

とすると、

```math
P(Y=t|x)=p^{t}(1-p)^{1-t}
```

と書け、以下の学習セットが得られたとすると、  

```math
(\boldsymbol{x}_{1}, y_{1}), (\boldsymbol{x}_{2}, y_{2}) …(\boldsymbol{x}_{n}, y_{n})
```

それらを同時に発生させる確率は、確率変数$Y$の独立性を仮定すると、積の形で以下のように書ける。

```math
p_{1}^{y_{1}}(1-p_{1})^{1-y_{1}}p_{2}^{y_{2}}(1-p_{2})^{1-y_{2}}...p_{n}^{y_{n}}(1-p_{n})^{1-y_{n}}\\
\begin{align}
&= \prod_{i=1}^{n}p_{i}^{y_{i}}(1-p_{i})^{1-y_{i}}\\ 
&= L(w_{0}, w_{1},...,w_{m})
\end{align}
```

このように、未知変数であるパラメータの関数の形で書け、これを尤度関数と呼ぶ。そしてこれを最大化するパラメータを推定すればよい。

###対数尤度関数

尤度関数を直接最大化する点（パラメータ）を求めることは、対数尤度関数を最大化する点（パラメータ）を求めることと同じで、かつ対数尤度関数の最大化の方が簡単（積の形を和の形に出来るので）なのでこちらを使う。簡単のため符号を変えた以下の$E$を最小化する問題に置き換える。

```math
\begin{align}
E(w_{0}, w_{1},...,w_{m}) &= -\log{L}(w_{0}, w_{1},...,w_{m})\\
&=-\sum_{i=1}^{n} \bigl\{t_{i}\log{p_{i}}+(1-t_{i})\log(1-p_{i})\bigr\}
\end{align}
```

###勾配降下法（Gradient descent）

線形回帰モデルであれば最小二乗法で数学的に陽に解けるが、ロジスティック回帰モデルでは解析的に解くことは難しい。勾配降下法は反復学習により逐次的にパラメータを更新し、勾配を０に近づけていく。

```math
w^{k+1}=w^{k}-\eta\frac{\partial E(w,b)}{\partial w} \\
b^{(k+1)}=b^{(k)}-\eta\frac{\partial E(w,b)}{\partial b}
``` 

$\partial$は学習係数。パラメータの収束のしやすさを調整。
事前学習でやったディープラーニングの逆伝播と同じ考え方。微分の計算は以下のようになる。

```math
\begin{align}
\frac{\partial E(w,b)}{\partial w}&=\sum_{i=1}^{n}\frac{\partial E_{i}}{\partial p_{i}}\frac{\partial p_{i}}{\partial \boldsymbol{w}} \\
&= -\sum_{i=1}^{n}(\frac{t_{i}}{p_{i}}-\frac{1-t_{i}}{1-p_{i}})\frac{\partial p_{i}}{\partial \boldsymbol{w}}\\
&= -\sum_{i=1}^{n}(\frac{t_{i}}{p_{i}}-\frac{1-t_{i}}{1-p_{i}})p_{i}(1-p_{i})x_{i}\\
&= - \sum_{i=1}^{n}\bigl\{t_{i}(1-p_{i})-p_{i}(1-t_{i})\bigr\}x_{i} \\
&=-\sum_{i=1}^{n}(t_{i}-y_{i})x_{i}
\end{align}
```

途中、$p_{i}=\sigma(\boldsymbol{w}^{T}\boldsymbol{x}_{i}+\boldsymbol{b})$を代入しシグモイド関数の微分の性質を使った。　
$b$についての微分も同様にして以下のようになる。

```math
\begin{align}
\frac{\partial E(w,b)}{\partial b}&=-\sum_{i=1}^{n}(t_{i}-y_{i})
\end{align}
```

この方法は全データを更新するため、計算コストが非常にかかる。
解決策として確率的勾配降下法がある。


###確率的勾配降下法（SGD）

データをひとつずつランダムに選んで以下の式で更新していく方法。
勾配降下法でパラメータを１回更新する計算量で、ｎ回更新出来る。


```math
w^{(k+1)}=w{(k)}+\eta(t_{n}-y_{n})x_{n} \\
b^{(k+1)}=b^{(k)}+\eta(t_{n}-y_{n})
```

###混同行列（Confusion Matrix）

分類タスクの評価方法。

|表記|予測|結果|正解/不正解|
|:---:|:---:|:---:|:---:|
|**TP : True Positive**|Positive|Positive|正解|
|**FP : False Positive**|Positive|Negative|不正解|
|**TN : True Negative**|Negative|Negative|正解|
|**FN : False Negative**|Negative|Positive|不正解|

Positive、Negativeが予測内容で、True、Falseが予測が合っていたか。

- 正解率（Accuracy）

全件中、正解数の割合。偏りのあるデータに対して意味をなさない場合が多い。
８０％スパムメールが来るときに、すべてスパムと分類すると正解率８０％だが良い予測とは言えない。

```math
\frac{TP+TN}{TP+FN+FP+TN}
```

- 再現率（Recall）

```math
\frac{TP}{TP+FN}
```

本当にPositiveなものを出来るだけ漏らさず予測したい。$FN$を減らしたい。$FP$が増えても構わない。
例）病気の検診で病気を人を見逃したくない。健康な人を病気と判断してしまうことは許容。

- 適合率（Precision）

```math
\frac{TP}{TP+FP}
```

Positiveと予測したものは実際にPositiveであってほしい。NegativeなものをPositiveと判定してほしくない。$FP$を減らしたい。$FN$は増えても構わない。
例）スパムメールの判定で、スパムが判定できない場合は許容しても、問題がないメールがスパムに振り分けられたくない。

- F値（F-measure）

```math
\frac{2Recall･Precision}{Recall+Precision}
```

再現率と適合率はトレードオフの関係。両方を同時に大きくすることは出来ない。その調和平均を取ったのがＦ値。

###ハンズオン

Kaggleにあるタイタニックデータでロジスティック回帰の演習。12項目からなるデータで、そのうち11項目から生死を予測する。ここでは1項目だけを使った場合と2項目の場合を行っている。ここでのポイントは以下の通り。

- 欠損値の補完
- ラベルの文字列を数値化
- 新しい特徴量の作成
- データの可視化
- 予測の評価

![Report ML Titanic .PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318589/b754af3b-8a74-c576-b684-e0142e9b9402.png)



##第4章　主成分分析

- 多変量のデータをなるべく情報を減らさないように変数を減らす
- 学習データの分散が最大になる方向への線形変換を求める（ばらつきが大きいほど元の情報を多く含んでいるから）
- 分析を容易にしたり、２、３次元に出来れば可視化することができる

###解き方

学習データのベクトルを$x$、平均を$\bar{x}$とし、平均を０にシフトしたデータ行列$\bar{X}$で考える。線形変換前の分散共分散行列は、

```math
Var(\bar{X})=\frac{1}{n}\bar{X}^{T}\bar{X}
```

係数ベクトル$\boldsymbol{a}$を用いて線形変換。

```math
\boldsymbol{s}=(s_{1},...,s_{n})^{T}=\bar{X}\boldsymbol{a}
```

テキストでは$a_{j}$となっていましたが$j$は省略
線形変換後の分散は、

```math
\begin{align}
Var(\boldsymbol{s})&=\frac{1}{n}\boldsymbol{s}^{T}\boldsymbol{s}\\
&=\frac{1}{n}(\bar{X}\boldsymbol{a})^{T}(\bar{X}\boldsymbol{a})\\
&=\frac{1}{n}\boldsymbol{a}^{T}\bar{X}^{T}\bar{X}\boldsymbol{a}\\
&=\boldsymbol{a}^{T}Var(\bar{X})\boldsymbol{a}\\
\end{align}
```

これを最大化する係数ベクトル$\boldsymbol{a}$を求めるのだが、無限に解が出てきてしまうので、ノルムに制約をつける。つまり、

```math
arg\quad max_{\boldsymbol{a}\in \mathbb{R}^{m}}\quad \boldsymbol{a}^{T}Var(\bar{X})\boldsymbol{a}\\
\\
subject\quad to\quad \boldsymbol{a}^{T}\boldsymbol{a}=1 
```

これは[ラグランジュの未定係数法](https://mathtrain.jp/mlm)で解ける。
ラグランジュ関数$E(\boldsymbol{a})$は以下のように書ける。


```math
E(\boldsymbol{a})=\boldsymbol{a}^{T}Var(\bar{X})\boldsymbol{a}-\lambda(\boldsymbol{a}^{T}\boldsymbol{a}-1)
```

これを$a$について偏微分し0となる$a$を求めればよい。

```math
\begin{align}
\frac{\partial{E(\boldsymbol{a})}}{\partial{\boldsymbol{a}}} &= 2Var(\bar{X})\boldsymbol{a}-2\lambda\boldsymbol{a}=0\\
Var(\bar{X})\boldsymbol{a} &= \lambda\boldsymbol{a}
\end{align}
```

となる。これを満たす$\lambda$、$\boldsymbol{a}$は、$Var(\bar{X})$の固有値、固有ベクトルである。

線形変換後の分散は、

```math
\begin{align}
Var(\boldsymbol{s}) &= \boldsymbol{a}^{T}Var(\bar{X})\boldsymbol{a}\\
&= \lambda\boldsymbol{a}^{T}\boldsymbol{a}
\end{align}
```

と書け、制約条件より、

```math
Var(\boldsymbol{s})=\lambda
```

固有値は複数個あるが、大きい方からひとつ目を第一主成分、$k$番目を第$k$主成分と呼び、1つだけ採用した場合１次元ＰＣＡ、２つの場合２次元ＰＣＡ、…となる。なお、分散共分散行列は実対象行列なので、固有ベクトルは全て直行する。

###寄与率

- 全分散量

```math
V_{total}=\sum_{i=1}^{m}\lambda_{i}
```

- 第$k$成分の寄与率

```math
c_{k}=\frac{\lambda_{k}}{V_{total}}
```

- 第$k$成分での累積寄与率  
$k$次まで圧縮した場合、どの程度元の情報を保持しているか

```math
r_{k}=\frac{\sum_{j=1}^{k}\lambda_{j}}{V_{total}}
```

累積寄与率が十分であれば、そこまで次元削減して良いと判断できる。

###ハンズオン

乳癌検査データ。特徴量30でロジスティック回帰を行ったところ、97％の精度で分類できるモデルが構築できた。これを２次元まで削減したところ、主成分寄与率 0.43315126、第２成分寄与率 0.19586506、累積寄与率 0.62901632‬となった。

![Report PCA Cancer .PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318589/b4cecb16-2556-874d-81f3-3800a80790d9.png)


##第5章　アルゴリズム（k近傍法、k平均法）

###k近傍法（kNN, k-Nearest Neighbor method）

- 分類問題のための手法（回帰にも使えるらしい）
- ラベル分けされたデータがあり、新たなデータが与えられたとき、最も近い$k$個のデータの中で一番多いラベルを割り当てる。
- $k$が変わると結果も変わる。
- $k$が大きくなるほど、境界が滑らかになる。

###ハンズオン

- 平面上に、標準偏差１の正規分布に従う乱数でX座標、Y座標を決めた点を25個ずつ2組作成。中心をそれぞれ+1、-1だけずらしている。
- それぞれラベルを0、1と付与。
- Numpyとscikit-learnによる計算を行った。
- それぞれ、$k=1, 3, 10$で実行。

![Report kNN .PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318589/dd53628b-f7fb-9cc1-e523-90c67d0491cf.png)


###k平均法（k-means）

- 教師なし学習
- クラスタリング手法（分類とは違ってラベルが決まっていない）
- 与えられたデータをk個のクラスタに分類する。kは事前に決めておく。

####アルゴリズム
1. k個のクラスタ中心の初期値を割り当てる。
2. 各データ点を最も近いクラスタにグループ化する。
3. 各グループに属するデータ点の位置から、新しいクラスタ中心を決める。
4. 収束するまで2、3を繰り返す。

####ハンズオン

- 平面上に、標準偏差１の正規分布に従う乱数で、100個のデータを３組作成する。それぞれの中心は、(-5,-5)、(5,-5)、(0,5)。
- クラスタ数３でNumpyとscikit-learnによる計算を行った。

![Report k-means .PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318589/c0a9473c-fa95-d5e8-22e9-48436b3570c8.png)


##第７章　サポートベクターマシン（SVM）

- 線形分離
線形モデルの正負（直線のどちら側か）で２値分類する。
線形判別関数は、最も近いデータ点との距離（マージン）を最大化するように決める。
マージンにデータ点が入り込まないようにする（ハードマージン）と分類できない場合もある。多少の入り込みを許容（ソフトマージン）することにより分類できる。

- 非線形分離
カーネル関数により特徴空間へ写像し、その空間で線形に分離する（カーネル法）。

###ハンズオン

以下の場合について実施している。

- 線形分離可能な場合
- 線形分離不可能な場合（RBFカーネル使用）
- ソフトマージン

![Report SVM .PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/318589/9851a988-221d-7152-c767-a0c7a8729e55.png)