JDLA_E資格の機械学習[線形回帰]


#1 はじめに



機械学習のモデリングプロセスは以下の通りである。
一番重要なのは問題設定であり、そもそも機械学習でやる必要性があるかどうかは重要である。
また、作業時間の大多数は欠損データの処理などの前処理である。

1. 問題設定
1. データ選定
1. データの前処理
1. 機械学習モデルの選定
1. モデルの学習（パラメータ推定）
1. モデルの評価

##1.1 機械学習モデルの概要

機械学習とは数学である。
何かのコンピュータのタスクの処理結果Aに対して、その性能指標Pで性能測定を行う。
そして、過去のデータからその性能を改善していくこと。

機械学習は大きく2種類に分けられる。

**教師あり学習**
+ インプットとアウトプット（正解）のペアのデータがある学習
+ タスク：予測、分類
+ 予測の場合のモデル：線形回帰
+ 分類の場合のモデル：ロジスティック回帰、SVM、knn（k-近傍法）
+ 評価方法：ホールドアウト法、交差検証法でモデル評価

　深層学習はあまり難しくない。バックプロパゲーションが分かればそれでOK。
　それより、機械学習のSVMが数学的に難しい。


**教師なし学習**
+ インプットデータしかない学習
+ タスク：クラスタリング、次元削減
+ クラスタリングの場合のモデル：k-means
+ 次元削減の場合のモデル：PCA（主成分分析）
+ 評価方法：評価手法が無い。ある程度の指標はある。（Sudof、ダンズインデックスなど、）


#2.線形回帰

##2.1 線形とは
線形とは、ある入力と出力が比例していること。

**例１）**

2次元、3次元の場合、以下の式の場合に線形といえる。

~~~math
y=Ax + B 　（2次元の場合) \\
z= Ax + By +C 　 (3次元の場合） 
~~~

**例２）**

ｎ次元の超平面になると、以下の表現。

~~~math
y=a_0 x_0 + a_1 x_1 + a_2 x_2 ..... a_{n-1} x_{n-1} \\
y= \Sigma_{i=0}^{n-1} a_i x_i  \\
y= \boldsymbol{a}^T \boldsymbol{x} \\
~~~


~~~math
※\boldsymbol{a} =
\begin{pmatrix}
a_0 \\
a_1 \\
:
a_{n-1}
\end{pmatrix}
\\

\boldsymbol{a}^T = 
\begin{pmatrix}
a_0 & a_1 & ... & a_{n-1}
\end{pmatrix}
\\

※\boldsymbol{x} =
\begin{pmatrix}
x_0 \\
x_1 \\
:
x_{n-1}
\end{pmatrix}
\\
~~~

##2.2 回帰問題

回帰問題とは、入力から出力を予想する問題。来店者数と売り上げみたいな。
しかし、競馬の着順予想のように、入力を血統、騎手、天候、場所などを入力として、結果をランキングとして出力もできる。
しかし、**Vapnikの原理**というのがある。
【ある問題を解くとき，その問題よりも難しい問題を途中の段階で解いてはならない】
単純にランキングを出すよりも、回帰問題で各着順の秒数の差を出すのは難易度が高すぎるという問題。無駄に難しいことを考えずに別のやり方を考えよという教訓。

~~~math
入力：説明変数:\boldsymbol{x} =(x_1,x_2,...,x_m)^T  \in  \mathbb{R}^m \\
~~~

~~~math
出力：目的変数:y \in  \mathbb{R}^1 \\
~~~

##2.3 線形回帰モデル

入力xとして部屋数、築年数があったときの家賃yを求めたい。
学習の教師データとして上記の事例データがある。
これは以下のようにあらわすが、回帰係数$ \boldsymbol{w}$は未知。これを最小2乗法で求める必要あり。

~~~math
家賃の予測値（目的変数）：\hat{y} = \boldsymbol{w}^T \boldsymbol{x} + w_0 \\
= \Sigma_{j=1}^{m} w_j x_j + w_0 \\
重みパラメータ（回帰係数）：\boldsymbol{w} =(w_1,w_2...,w_m)^T \\
入力（説明変数）：x\\

切片（バイアス）：w_0 \\

~~~

予測値yは、hatをつけて$\hat{y}$であらわす。
なお、実際の結果$y $は、実際には偶発誤差$ \epsilon$を含む。何か人気の店が近くに出来て地価があがるようなこと。これが、予測と実際の誤差になる。

~~~math
y_1 = w_0 + w_1 x_1 + {\epsilon}_1\\
~~~


**多次元の時の行列表現**

入力（説明変数）　$X$が2次元（n*(m+1)）
回帰係数$w$が1次元（(m+1)*1)
出力（目的変数）　$y$が1次元（n*1)
誤差 $\epsilon$が1次元（(m+1)*1)


~~~math
\boldsymbol{y} = \boldsymbol{X} \boldsymbol{w} + \boldsymbol{\epsilon}
~~~

~~~~math
\begin{pmatrix}
y_1 \\
y_2 \\
: \\
y_n \\
\end{pmatrix}
= 
\begin{pmatrix}
1 & x_{11} & ... &  x_{1m} \\
1 & x_{21} & ... &  x_{2m} \\
: & : & ... &  : \\
1 & x_{n1} & ... &  x_{nm} 
\end{pmatrix}
\begin{pmatrix}
w_0 \\
w_1 \\
: \\
w_m \\
\end{pmatrix}

+
\begin{pmatrix}
{\epsilon}_0 \\
{\epsilon}_1 \\
: \\
{\epsilon}_m \\
\end{pmatrix}
~~~

※x,yのに変数がある一次方程式を解くには、方程式が２つないと解けない。上記の場合は、未知の回帰係数wが(m+1)個あるので、データも（m+1)ないと解けない。線形回帰ならこの程度だが、深層学習になると、100個、200個となってくるので、データが大事となる。


##2.4 データ分割と汎化

機械学習に使えるデータは全部使ってはいけない。
未知のデータの予測できるかを見ないといけないので２つにデータを分けておくこと。

* 学習用データ
* 検証用データ

##2.5 最小二乗法でパラメータ推定

線形回帰モデルのパラメータ（係数w)を求めるときに、予測値と結果の平均2乗誤差を最小にするようなパラメータを探索する。これが最小二乗法。

![線形回帰.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/e9a1fd9a-1b9c-8d7f-bdb6-0258401a118f.png)


~~~math
\Sigma_i(\hat{y}_i - y_i )^2 \\
ここで、\\
予測値：\hat{y}_i  = w_0 +w_i x_i \\
実際の値：y_i = w_0 + w_i x_i + {\epsilon}_i
よって、　\\
\hat{y}_i - y_i = -{\epsilon}_i \\
\Sigma_i(\hat{y}_i - y_i )^2  = \Sigma_i{{\epsilon}_i}^2\\

~~~

上記の書き方をちょっと変えると、

~~~math
J(w) = MSE_{train} = \frac{1}{n_(train)} \Sigma_{i=1}^{n_train}(\hat{y}_i^{(train)} - y_i^{(train)} )^2
~~~

J(w)は、wの関数である。Mean Squre Error（平均二乗誤差）。
右辺の$\hat{y}$は、wの関数。

~~~math
\hat{y}_i^{(train)} = \boldsymbol{w}^T \boldsymbol{x}_i^{(train)} \\
~~~


ということは、この右辺は、ｗに関する二次関数になっている。下に突の二次関数なので、ｗの二次関数の頂点を求めれば、J(w)＝MSEを最小にするパラメータｗを求めることができる。

![線形回帰のパラメータ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1436941/29563f59-db04-15fb-9a33-d3f0c50c160f.png)

~~~math
やること
\hat{w} = arg min MSE_{train} \\
min：最小を求める\\
arg:最小になる入力を求める\\

~~~

MSEをwに関して微分したものが０になる点ｗを求める。

~~~math
\frac{\partial}{\partial_w} MSE_{train} = 0\\

\frac{\partial}{\partial_w} \Biggl( \frac{1}{n_{train}} \Sigma_{i=1}^{n_train}(\hat{y}_i^{(train)} - y_i^{(train)} )^2 \Biggr) = 0 \\
\\
\hat{y}_i^{(train)} を x に置き換え。
\\
\frac{\partial}{\partial_w} \Biggl( \frac{1}{n_{train}} \Sigma_{i=1}^{n_train}( \boldsymbol{w}^{T}\boldsymbol{x}_i - y_i^{(train)} )^2 \Biggr) = 0 \\
\\
wとxは逆でもよい。
\\
\frac{\partial}{\partial_w} \Biggl( \frac{1}{n_{train}} \Sigma_{i=1}^{n_train}( \boldsymbol{x}_i^{T}\boldsymbol{w} - y_i^{(train)} )^2 \Biggr) = 0 \\
\\
~~~

この sigmaの式は行列に直すことができる。
なぜなら、行列式とは掛けたものを、その後、足し合わせる処理だから、Sigmaの処理そのものである。表記方法を変えただけとも言える。

~~~math
\frac{\partial}{\partial_w} \Biggl( \frac{1}{n_{train}} ( \boldsymbol{X} \boldsymbol{w} -\boldsymbol{y})^T(\boldsymbol{X} \boldsymbol{w} -\boldsymbol{y}) \Biggr) = 0\\
~~~

ここで、$ ( \boldsymbol{X} \boldsymbol{w} -\boldsymbol{y})$を転置したものと、転置していないものをかけているのは、行と列を入れ替えることで、二乗をしている。
つまり、$(\boldsymbol{x}_i^{T}\boldsymbol{w} - y_i^{(train)})^2 $をして、その後結果を合算するのと同じ。

微分する

~~~math
\frac{\partial}{\partial_w} \Biggl( \frac{1}{n_{train}} ( \boldsymbol{X} \boldsymbol{w} -\boldsymbol{y})^T(\boldsymbol{X} \boldsymbol{w} -\boldsymbol{y}) \Biggr) = 0\\


\frac{1}{n_{train}} 　
\frac{\partial}{\partial_w} 
\Biggl( 
( \boldsymbol{w}^T \boldsymbol{X}^T  -\boldsymbol{y}^T)
(\boldsymbol{X} \boldsymbol{w} -\boldsymbol{y}) 
\Biggr) = 0\\

\frac{1}{n_{train}} 　
\frac{\partial}{\partial_w} 
\Biggl( 
  \boldsymbol{w}^T \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w}  
- \boldsymbol{w}^T \boldsymbol{X}^T \boldsymbol{y}
- \boldsymbol{y}^T \boldsymbol{X} \boldsymbol{w}
+ \boldsymbol{y}^T \boldsymbol{y}
\Biggr) = 0\\
~~~

$- \boldsymbol{w}^T \boldsymbol{X}^T \boldsymbol{y}$ と$- \boldsymbol{y}^T \boldsymbol{X} \boldsymbol{w}$ は、計算結果は同じものになる。

よって、

~~~math
\frac{1}{n_{train}} 　
\frac{\partial}{\partial_w} 
\Biggl( 
  \boldsymbol{w}^T \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w}  
- 2\boldsymbol{w}^T \boldsymbol{X}^T \boldsymbol{y}
+ \boldsymbol{y}^T \boldsymbol{y}
\Biggr) = 0\\
~~~

となり、ベクトルｗで微分すると、

~~~math
\frac{1}{n_{train}} 　
\Biggl( 
  2  \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w}  
- 2\boldsymbol{X}^T \boldsymbol{y}
\Biggr) = 0\\
~~~

なぜなら、

~~~math
\frac{\partial (  \boldsymbol{w}^T \boldsymbol{x}) }
{\partial_w} 
= \boldsymbol{x} \\

\frac{\partial (  \boldsymbol{w}^T \boldsymbol{A} \boldsymbol{w}) }
{\partial_w} 
= (\boldsymbol{A} + \boldsymbol{A}^T)\boldsymbol{w} \\
= 2 \boldsymbol{A} \boldsymbol{w} 
~~~

~~~math
\frac{1}{n_{train}} 　
\Biggl( 
  2  \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w}  
- 2\boldsymbol{X}^T \boldsymbol{y}
\Biggr) = 0\\


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

2  \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w}  
= 2\boldsymbol{X}^T \boldsymbol{y}\\

 \boldsymbol{X}^T \boldsymbol{X} \boldsymbol{w}  
= \boldsymbol{X}^T \boldsymbol{y}\\

左から逆行列をかけてやると、\\

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


~~~


これで、求めたかった回帰係数パラメータ$w$が求まった。
なので、予測値$ \hat{y}$を、検証データ　$ \boldsymbol{X}$ で求めることができる。

~~~math
予測値： \hat{y} = \boldsymbol{X} \boldsymbol{w} \\
予測値： \hat{y} = \boldsymbol{X} \biggl( ( \boldsymbol{X}^{(train)T} \boldsymbol{X} ^{(train)})^{-1} \boldsymbol{X}^{(train)T} \boldsymbol{y}^{(train)} \biggr) \\
\\
~~~

$\boldsymbol{w}$ 　は、（m+1)×1 の行列である。
そして、$\boldsymbol{w}$　の中のXの逆行列は存在するとは限らない。実務的には注意。ムーアン・ペンローズの一般化逆行列を使うなど。


**補足：なぜ二乗するのか？**
絶対値でもよいのでは？
二乗損失は、一般に外れ値（一個だけ変なところにあるデータ）が一つあると、結果がその外れ値にひっぱられる。だから、二乗を使うときには、外れ値を除外することが前提条件になる。
Huber損失。Tukye損失を使うことも検討。