JDLA_E資格の機械学習「非線形回帰」


#1 非線形回帰

###1.1 非線形回帰モデルとは

線形の事象に対して、複雑な非線形の動きをする事象を表すためのモデルが非線形回帰モデル。

線形回帰（単回帰／重回帰）は

~~~math
y=w_0 + w_1 x \\
y=w_0 + w_1 x_1 + w_2 x_2 + ...+w_m x_m \\
~~~

非線形回帰では、線形回帰のx のところが、$\phi{(x)} $になる。
この$\phi{(x)} $を基底関数という。
しかし、係数wに関してはあいかわらず線形であることにかわりはない。
機械学習ではこの係数wが重要で、この点においては線形回帰と変わらないともいえる。

~~~math
y=w_0 + w_1 x + w_2 x^2 + w_3 x^3\\
y=w_0 + w_1 \sin{(x)} + w_2 \cos{(x)} + w_3 log{(x)} \\
\hat{y} = w_0 + w_1 \phi_1{(x)} + w_2 \phi_2{(x)} +.....+ w_m \phi_m{(x)} \\
~~~

###1.2 基底関数による非線形回帰モデル

前節で出てきた基底関数$\phi$ を使い、目的変数 $y_i$を　$ \sum$ を使って表現すると、

~~~math
y_i = w_0 + \sum_{j=1}^{m} w_j \phi_{j}(\boldsymbol{x}_i) + \epsilon_i \\
~~~

となり、係数wは、線形とおなじく最小二乗法で推定。
上記の基底関数にはいろいろ使える。

#### 1.2.1 基底関数（多項式）

~~~math
\phi_{j} = x^j
~~~

上記の多項式を基底関数として使うと。

~~~math
\hat{y}_i = w_0 + w_1 \phi_1{(x_i)} + w_2 \phi_2{(x_i)} +.....+ w_9 \phi_9{(x_i)} \\
= w_0 + w_1 x_i + w_2 x_i^2 + ......+ w_9 x_i^9 \\
~~~

上記は9次の近似であるが、あまり次数を上げても、同じような曲線が出来上がるだけで、計算上無駄であるので、適切な次元までを扱うようにしよう。これが、**「オッカムの剃刀」**という哲学上の無駄なことをするなという指針。

![近似曲線.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/88576f32-7cbe-e2eb-ea80-bc6e907aae51.png)



#### 1.2.2 基底関数（ガウス型基底）

次にガウス。ガウスというとガウス分布（正規分布）で、平均値の周りにデータが集まっている分布のことである。
正規分布の確率必度関数は下記のようにかける。

~~~math
f(x) = \frac{1}{\sqrt{2 \pi \sigma^2} } exp \Biggl( - \frac{(x-u)^2}{2 \sigma^2} \Biggr)  \\
u:平均\\
\sigma ：標準偏差　\\
\sigma^2 ：分散 \\
~~~

<img width="600" alt="gaus_exp.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/2a836bf4-f95f-6d7e-a2fc-b6fe2876c11c.png">


ここで、基底関数をガウス型（っぽいやつ）として以下のように決める。

~~~math
\phi_{j}(x) = \exp \Biggl( - \frac{(x-u_j)^2}{2h_j} \Biggr)  \\

=\exp \Biggl( - \frac{(x-u_j)^2}{\sigma^2} \Biggr)  
~~~

$2h_j$ は、まとめて$\sigma^2$ にされることがある。

もとの非線形の式は

~~~math
\hat{y}_i = w_0 + w_1 \phi_1{(x_i)} + w_2 \phi_2{(x_i)} +.....+ w_9 \phi_9{(x_i)} \\
~~~

仮に$x_i$の位置が下図の場所とすると、$ \hat{y}_i$ は、$w_2 \phi_2{(x_i)} $　の特徴量を強く反映した結果が出そうである。


![gaus_w9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/6c92541e-8da9-5281-32b3-973a199b033f.png)

ここで、$\hat{y}$　を、線形回帰のように行列で表現してみる。$X$が、$\Phi$ になっているだけなので、

~~~math
y=Xw  は、\\
y= \Phi w　と表現される　\\
~~~

※　$y$ は、(n×1)の行列
※  $X$ は、(n×(m+1))の行列
※  $\Phi$ は、(n×(m+1))の行列
※  $w$ は、((m+1)×1)の行列

よって、MSEを最小化するwは、線形回帰と同様に求めることが出来る。


~~~math
\hat{y}_i = w_0 + w_1 \phi_1{(x_i)} + w_2 \phi_2{(x_i)} +.....+ w_9 \phi_9{(x_i)} \\

\hat{y}　= \Phi \bigl( \Phi^{(train)T} \Phi^{(train)} \bigr)^{-1} \Phi^{(train)T} y^{(train)}
~~~

~~~math
\Phi^{(train)} = \bigl( \phi{(x_1)}, \phi{(x_2)},...,\phi{(x_n)} \bigr)^T
~~~

上記を非線形回帰モデルの**「計画行列」**といわれる。
計画行列とは、線形モデルで使われる行列のこと。英語では、design matrix だけど、設計だとへんだから、計画行列と呼ばれるようである。

###1.3 未学習と過学習

![過学習.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/a25c7772-9be7-3414-e90a-0ebe83feb1ac.png)


####1.3.1 モデル学習時の問題
高次元の近似直線のように、次元をあげると、教師データにたいしては、適切な解を出力できるモデルが学習できる。
しかし、検証データでちょっと違うデータが入ってくると、全然使えないモデルになってしまう。
逆に次元が低いと、これも全然使えないモデルになる。
これを、過学習（overfitting）と、未学習（underfitting)という。

####1.3.2 未学習の対策
1. 次元を上げるしかない。表現力を上げる。

####1.3.3 過学習の対策
1. 学習データ
1. の数を増やす。
1. Xの無駄な次元を減らす。表現力を減らす。（不要な基底関数を削除）「オッカムの剃刀」「ドメイン知識による特徴量選択」「AICモデル選択」
1. 正則化法で表現力を減らす。（高次元のXの係数ｗを小さくして表現力を減らす）

~~~math
Y=Xw
~~~

####1.3.4 過学習の対策:正則化法


~~~math

予測値:　\hat{y} = X \hat{w} = X \Bigl( ( X^T X )^{-1} X^T y  \Bigr) \\


ここで、\\

X = 
\begin{pmatrix} 
1 &  2 & 4 \\
1 &  3 & 5.9 \\
1 &  4 &8.1 \\
\end{pmatrix}
\\
2列目と3列目がほぼ平行である。\\
このとき、(X^T X)^{-1} は、かなり要素数が多くなる。つまり\hat{w} が大きくなる\\

E(w)　= MSE + \lambda w^T w \\
E(w)　= J(w) + \lambda w^T w \\

後ろに罰則項をつける。wが大きくなると、罰則が大きくなる。L2ノルム。\\
MSEも小さくする。
~~~

~~~math
S_{\gamma} = ( y - \Phi w)^T ( y - \Phi w) + \gamma R(w) \\
~~~

上記の第一項：MSE二乗和誤差（訓練データｙと予測値の差）
上記の第二項：正則化項。罰則項（ｗが大きくなると、多くなる項）。$\gamma $は、調整ハイパーパラメータ

もともと解きたい問題は、平均二乗誤差MSEを最小化するwを求めることだが、これに、さらに正則化により高次元の無駄を省くという上限が追加される。

~~~math
min MSE ,  s.t.  R(w) \leq r \\
~~~

MSEが最小、かつ
wの正則化項が、rより小さいことが条件。

この条件は、正則化のKKT条件より

~~~math
min　 MSE+\lambda R(w)　
~~~

となる。

####1.3.5 リッジとラッソ

MSEを最小化することだけ考えてモデル学習してしまうと、過学習になりやすい。
この対策として、正則化項を加えて、モデル学習をしてwを推定してやろうというのが、リッジ推定、ラッソ推定。L2ノルムを利用するラッソ推定のほうは、角のある四角形のなかに収めようとするので、角（例えばw0がゼロになる）でMSEと交わりやすいので、項が一つ減りやすいという特徴がある。

これによって、過学習を抑えて、汎化性能の高いモデルを学習させる。

![正則化.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/1e981282-f729-83c0-d38b-a3b284f38f35.png)



ここで一つ問題はある。ハイパーパラメータの $\gamma$ は、学習によっても止まらないので、自分で適切と思われる数値を決めてやる必要がある。どうやって？



###1.4 モデルの検証

学習済みモデルの性能検証には、下図のように過学習かどうかを見てやる。

![過学習.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/a25c7772-9be7-3414-e90a-0ebe83feb1ac.png)

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

ホールドアウト法とは、最初のXX%が検証用データ、それ以外を学習用データとすること。

![モデル検証＿ホールドアウト.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/5ab252c8-6fa1-d099-e507-23356944420a.png)


しかし、欠点あり。:pensive:

【ホールドアウトの欠点】
**欠点１** ：外れ値が検証データにある場合、これにFitさせようとしてしまう。
**欠点２** ：画像分類の場合、NG画像が学習用データに入らなければ学習できない。

【欠点の解決策：クロスバリデーション（交差検証）】

ホールドアウト法を、何回か繰り返す。この時、検証用データを別のもので実施。

検証データで測定した汎化精度（MSE最小二乗誤差）を比較して、CV値（Cross Validation値）が低いモデルを採用する。


####1.4.2 交差検証方(k分割交差検証）

一般的な交差検証法。別名Cross Validation法。k分割交差検証方。

データがたくさんあるときに、データを数セットに分割し、それぞれ検証した結果を平均して精度を求める。

![モデル検証＿交差検証.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/4e61dfbf-244f-aaac-9901-897c8ee09234.png)


####1.4.3 leave-one-out 交差検証(LOOCV, 一個抜き交差検証)

交差検証のもっと細かい版。使えるデータが極端に少ない場合に使われる手法。
テストデータを事例1個レベルにして、全データに対して学習を行う。

![モデル検証＿LVOO.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/5a4bc713-cb29-cf40-6168-600a550725ca.png)



####1.4.2 グリッドサーチ法

ハイパーパラメータは、職人芸的に決めるところがある。
論文とかでもあまり書かれていない。作った人に直接聞くしかない。
この職人芸を、SW処理で組み合わせ検証して適切なハイパーパラメータを見つけるのが、グリッドサーチ。 $\lambda$　と、$ｍ $　の組み合わせのグリッドをサーチするイメージ。