ラビットチャレンジレポート(機械学習)

#はじめに
本記事は、E資格取得講座のラビットチャレンジのレポートです。今回は機械学習の講義を受けてのレポートを提出します。

#線形回帰モデル

## 理論
　線形回帰モデルは教師あり学習の一つ。教師データを$(\boldsymbol{x}_i, y_i)$、パラメータを$\boldsymbol{\omega}$とすると、モデルは、

```math
y_i = \omega^\top \boldsymbol{x}_i + \omega_0+\varepsilon_i
```
となる。ただし、$\varepsilon_i$は誤差項である。
　ここでは、パラメータ$\boldsymbol{\omega}$の推定手法としてMSEの最小化を行う。すなわち、$\boldsymbol{\varepsilon} = (\varepsilon_1, \cdots, \varepsilon_n)^\top$としたときに、$\boldsymbol{\varepsilon^\top} \boldsymbol{\varepsilon}$を最小化する$\boldsymbol{\omega}$を推定する。これによって得られる推定量は、
$$\hat{\boldsymbol{\omega}} = (X^\top X)^{-1} X^\top \boldsymbol{y}$$
である。また、これにより得られる予測値は、
$$\hat{\boldsymbol{y}} = X(X^\top X)^{-1}X^\top  \boldsymbol{y}$$
となる。
　次に得られた推定量の汎化性能を測定する方法について説明する。線形回帰モデルに関わらず、教師あり学習においては得られたデータを学習データと検証データに分割し、
1. モデルを学習データを用いて学習
1. 1.で学習したモデルに対して、予測値を出力し、検証データの実際の値と比較することでモデルの当てはまりの良さを測定する
といった手法がとられる。
　このとき、学習データと検証データをそれぞれ一つずつ作成し、上記の手順に沿ってモデルを評価することをホールドアウト法、$K$個に分割し、学習・検証データを変えて$K$回評価し、その平均を取ってモデルを評価することをクロスバリデーションと呼ぶ。

## ハンズオン
下記にハンズオン結果を保存した。もともと提供されていたコードに加え、単回帰、2変数の重回帰、全ての変数を説明変数とした重回帰分析を行い、それぞれのモデルをホールドアウト法で評価した。(スクリプトの「実装演習」の項目)
[線形回帰モデルのハンズオン結果](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/skl_regression.ipynb)

# 非線形回帰モデル
## 理論　
　非線形回帰モデルは、複雑な非線形構造を内在するデータを説明するためのモデルである。よく使われる方法としては、基底展開法がある。基底展開法は、基底関数$\phi$を用いて、
$$y_i = \omega_0 + \sum_{j=1}^m \omega_j \phi_j(\boldsymbol{x}_i)+\varepsilon_i$$
とするモデルである。基底関数としては、多項式関数、ガウス型規定関数、スプライン関数などが使われる。また、ここでは基底関数に含まれるパラメータは全て既知とする。
このとき、MSE最小化によって得られる推定量は、
$$\hat{\boldsymbol{\omega}} = (\Phi^\top \Phi)^{-1} \Phi^\top \boldsymbol{y}$$
となり、予測値は、
$$\hat{\boldsymbol{y}} = \Phi(\Phi^\top \Phi)^{-1}\Phi^\top  \boldsymbol{y}$$
となる。ただし、$\Phi$は計画行列と呼ばれる行列で
$$\Phi = (\phi(\boldsymbol{x}_1), \cdots, \phi(\boldsymbol{x}_n))^\top$$
である。
　基底関数の決め方であるが、基底関数は単純なものであれば未学習が、複雑すぎると過学習が起きてしまうことがある。そこで、それらのバランスをとるために、正則化法を使うことがある。正則化法とは、最小化する関数$\boldsymbol{\varepsilon}^\top \boldsymbol{\varepsilon}$を$\boldsymbol{\varepsilon}^\top \boldsymbol{\varepsilon}+\gamma R(\boldsymbol{\omega})$とする手法である。$\gamma R(\boldsymbol{\omega})$はモデルの複雑さに対する罰則で、モデルが複雑であればあるほど大きい値を持つ項である。これを用いることで過学習を防ぎ、複雑さのバランスをとれるようになる。
　また、上記で基底関数のパラメータは既知と述べたが、実運用上では基底関数のモデルも推定する必要もある。このとき使われる方法がグリッドサーチとクロスバリデーションである。グリッドサーチは、パラメータの組み合わせを複数リストアップし、それらのパラメータに対してモデルを学習、クロスバリデーションを行う方法である。クロスバリデーションを実行して精度が高いモデルのパラメータを採用する。

## ハンズオン
ハンズオン結果は下記。実装演習の項目でグリッドサーチを行い、ガウス型基底関数のパラメータの選択を行った。
[非線形回帰モデルのハンズオン](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/skl_nonlinear%20regression.ipynb)

# ロジスティック回帰モデル
## 理論
　ロジスティック回帰モデルは、分類問題を解くための教師あり機械学習モデルの一つである。出力は$(0, 1)$の確率の値であり、
$$P(Y_i=1|\boldsymbol{x}_i) = \frac{1}{1+{\rm exp}(\boldsymbol{\omega}^\top \boldsymbol{x}_i + \omega_0)}$$

の形でモデリングする。
　モデルの右辺の式はシグモイド関数と呼ばれる関数である。シグモイド関数の微分については下記のような性質がある。
$\sigma(x) = \dfrac{1}{1+{\rm exp}(-ax)}$としたとき、
$$\sigma^\prime(x) = a \sigma(x)(1-\sigma(x))$$
が成り立つ。
　ロジスティック回帰モデルは最尤推定法を用いて推定することが多い。最尤推定法は尤度関数
$$L(\boldsymbol{\omega}) = \prod_{i=1}^N p_i^{y_i}(1-p_i)^{1-y_i}$$
を最大化することでパラメータを推定する手法である。実際には、対数をつけ、符号を逆にした対数尤度関数
$$l(\boldsymbol{\omega}) = -{\rm log}L(\boldsymbol{\omega})$$
の最小化を行うことが多い。
　この最小化について、解析的にパラメータを書くことができないことが多い。そのため、ニュートン法や勾配降下法などの繰り返し計算を用いてパラメータを求めることが多い。ここでは勾配降下法について説明する。
　勾配降下法は、$k$回目の更新でパラメータを
$$\boldsymbol{\omega}^{(k+1)} = \boldsymbol{\omega}^{(k)} -\eta\frac{\partial l(\boldsymbol{\omega})}{\partial \boldsymbol{\omega}}$$
として更新する手法である。また、勾配降下法を改良したものとして、確率的勾配降下法がある。勾配降下法は全てのデータに対して$\dfrac{\partial l(\boldsymbol{\omega})}{\partial \boldsymbol{\omega}}$を計算することで勾配をもとめている。しかし、大きなデータに対して、$\dfrac{\partial l(\boldsymbol{\omega})}{\partial \boldsymbol{\omega}}$を計算することは計算コストが高い。そこで、データの一部をランダムに取り出し、そのデータだけに対して$\dfrac{\partial l(\boldsymbol{\omega})}{\partial \boldsymbol{\omega}}$を計算することで最適な解を探索する手法が提案された。これを確率的勾配降下法と呼ぶ。

## ハンズオン
ハンズオン結果は下記。実装演習の項目で罰則化項があるモデルとないモデルの比較を行った。
[ロジスティック回帰モデルのハンズオン](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/skl_logistic_regression.ipynb)

# 主成分分析
## 理論
　主成分分析は、データを線形変換することで多変量データの変数を情報量の損失を防ぎながら縮約する手法である。主成分分析を定式化する。$\bar{X} = (\boldsymbol{x}_1 -\bar{\boldsymbol{x}}, \cdots, \boldsymbol{x}_n -\bar{\boldsymbol{x}})^\top $とし、線形変換後のベクトルを$\boldsymbol{s}_j = \bar{X}\boldsymbol{a}_j$とする。したがって、主成分分析は、データから$\boldsymbol{a}_j$を求めることが目的の一つになる。
　主成分分析においては$\boldsymbol{a}_j$を決める基準として、$\boldsymbol{s}_j$の分散を用いる。線形変換後の軸はデータが最も散らばるようにするイメージである。$\boldsymbol{s}_j$の分散は、
$$Var[\boldsymbol{s}_j] = \boldsymbol{a}_j^\top Var[\bar{X}]\boldsymbol{a}_j$$
となる。したがって、$\boldsymbol{a}_j^\top Var[\bar{X}]\boldsymbol{a}_j$を最大化する$\boldsymbol{a}_j$を求めればよい。ただし、このような$\boldsymbol{a}_j$は無数にあるので単位ベクトルに限定する。すなわち、$\boldsymbol{a}_j^\top \boldsymbol{a}_j = 1$の制約をつけた最大化問題とする。これをラグランジュの未定乗数法を用いて解くと、$\boldsymbol{a}_j$は、$Var[\bar{X}]$の単位固有ベクトルになる。なお、$Var[\bar{X}]$は正定値対称行列なので、直交行列を用いて対角化できる。すなわち、固有ベクトルは全て直交する。
　最後に第$k$主成分と寄与率について説明する。
　射影先の分散$Var[\boldsymbol{s}]$は、固有ベクトルと一致する。主成分分析においては、線形変換後の分散を情報として捉えるため固有ベクトルが大きい主成分は情報を大きく持っている主成分とみなす。そこで、固有値が大きい主成分から順に第1主成分、第2主成分...と名付ける。また、第$n$主成分の固有値を$\lambda_n$としたとき、

$$c_k = \dfrac{\lambda_k}{\sum_{i=1}^m \lambda_i}$$
を第$k$主成分の寄与率と名付ける。また、第$k$主成分までの寄与率の和$r_k = \sum_{i=1}^k c_i$を累積寄与率と呼び、第1主成分から第$k$主成分の累積寄与率と名付ける。

## ハンズオン
ハンズオン結果は下記。実装演習の項目で主成分得点を用いたロジスティック回帰モデルを作成した。
[主成分分析のハンズオン結果](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/skl_pca.ipynb)

# サポートベクターマシン
　サポートベクターマシンとは、2クラス分類問題を解く代表的な手法の一つ。線形の決定関数を決める手法である。これを定式化すると、データ$\boldsymbol{x}$に対して、${\rm sign}(\boldsymbol{\omega}^\top \boldsymbol{x} + b)$の値によってクラスを分類する問題となる。分類境界に最も近い各クラスのデータまでの領域をマージンと呼ぶが、このマージンが最大化するように$\boldsymbol{\omega}^\top$と$b$を決定する。
　マージンを最大化するとは、分類境界と分類境界に最も近いデータまでの距離を最大化することに他ならない。この距離は、
$$\frac{|\boldsymbol{\omega}^\top \boldsymbol{x}_i + b|}{||\boldsymbol{\omega}||}$$
と表される。ただし、$\boldsymbol{x}_i$は分類境界に最も近いデータである。また、分類の仕方を$\boldsymbol{\omega}^\top \boldsymbol{x}_i + b \geq 0$のときに$y_i=1$、$\boldsymbol{\omega}^\top \boldsymbol{x}_i + b < 0$のときに$y_i=-1$と定義すれば、
$$\frac{|\boldsymbol{\omega}^\top \boldsymbol{x}_i + b|}{||\boldsymbol{\omega}||} = \frac{y_i|\boldsymbol{\omega}^\top \boldsymbol{x}_i + b|}{||\boldsymbol{\omega}||}$$

である。したがって、サポートベクターマシンにおける最適化問題は、
$${\rm max_{\boldsymbol{\omega}, b}} {\rm min_i}\frac{y_i|\boldsymbol{\omega}^\top \boldsymbol{x}_i + b|}{||\boldsymbol{\omega}||}$$
と定式化できる。(minは分類境界に最も近いデータを表す)
これを制約条件をつけて変形することで、最適化問題は下記の形に変形できる。

${\rm min} \dfrac{1}{2}||\boldsymbol{\omega}||^2$、ただし、全ての$i$に対して $y_i(\boldsymbol{\omega}^\top \boldsymbol{x}_i + b) \geq 1$

なおこの最適化問題は全てのデータが線形分離可能なことを想定している。このような全てのデータが線形分離可能なことを仮定したサポートベクターマシンをハードマージンと呼ぶ。一方で、この仮定を緩め線形分離による分類において、多少の誤分類を許すサポートベクターマシンをソフトマージンと呼ぶ。ソフトマージンにおける最適化問題は、下記のように修正される。
${\rm min} \dfrac{1}{2}||\boldsymbol{\omega}||^2$、ただし、全ての$i$に対して $y_i(\boldsymbol{\omega}^\top \boldsymbol{x}_i + b) \geq 1-\varepsilon_i$

なお、ここで登場した$\varepsilon_i$はスラック変数と呼ばれる。
また、ここで定義した最適化問題は主問題と呼ばれるが、実際にはこれの双対問題を解く。双対問題にすることで、変数を削減できるなどのメリットがあるためである。

最後にカーネルを用いた非線形分離への拡張についてレポートする。
データの形状によっては、線形分離でデータをうまく分類できない場合がある。このような場合に、元データをより高次元に写像することで分類を可能にする方法がある。下記のような写像を考える。
$$\phi : \boldsymbol{x} \to \phi(\boldsymbol{x})$$
このとき、元のデータ$\boldsymbol{x}$に対する双対問題は、

```math
{\rm max} \left[ -\frac{1}{2} \sum_{i=1}^n \sum_{j=1}^n \alpha_i \alpha_j y_i y_j \boldsymbol{x}_i^\top \boldsymbol{x}_j  +\sum_{i=1}^n \alpha_i \right]
```
であるが、写像によってデータを変形した後の双対問題は、

```math
{\rm max} \left[ -\frac{1}{2} \sum_{i=1}^n \sum_{j=1}^n \alpha_i \alpha_j y_i y_j \phi(\boldsymbol{x}_i)^\top \phi(\boldsymbol{x}_j)  +\sum_{i=1}^n \alpha_i \right]
```
となる。なお、この式に含まれる内積$\phi(\boldsymbol{x}_i)^\top \phi(\boldsymbol{x}_j)$は計算コストの高いものとなる。そこで、内積部分を下記のようなカーネル関数に置き換えて計算コストを抑える方法を「カーネルトリック」と呼ぶ。
$$K(\boldsymbol{x}_i, \boldsymbol{x}_j) = \phi(\boldsymbol{x}_i)^\top \phi(\boldsymbol{x}_j)$$

## ハンズオン
ハンズオン結果は下記。実装演習の項目でカーネルトリックを使った場合と内積を使った場合の計算時間の差を調べた。
[SVMのハンズオン](https://github.com/StoneRIeverKS/rabbit_challenge/blob/master/np_svm.ipynb)

# 参考図書
線形回帰モデル、非線形回帰モデル、ロジスティック回帰モデルは[統計的機械学習の基礎](https://www.amazon.co.jp/%E7%B5%B1%E8%A8%88%E7%9A%84%E5%AD%A6%E7%BF%92%E3%81%AE%E5%9F%BA%E7%A4%8E-%E2%80%95%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9E%E3%82%A4%E3%83%8B%E3%83%B3%E3%82%B0%E3%83%BB%E6%8E%A8%E8%AB%96%E3%83%BB%E4%BA%88%E6%B8%AC%E2%80%95-Trevor-Hastie/dp/432012362X)が詳しい。自分は全て読み切ったわけではないが、上記の内容は全て網羅されている。ラビットチャレンジの教材には載っていないが、カーネル回帰なども載っていて回帰モデルについてはおおよそこの本から基本的なことは学べるのではないかと思う。
主成分分析については、[多変量データ解析法](https://www.amazon.co.jp/%E5%A4%9A%E5%A4%89%E9%87%8F%E3%83%87%E3%83%BC%E3%82%BF%E8%A7%A3%E6%9E%90%E6%B3%95%E2%80%95%E7%90%86%E8%AB%96%E3%81%A8%E5%BF%9C%E7%94%A8-%E8%A1%8C%E5%8B%95%E8%A8%88%E9%87%8F%E5%AD%A6%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E6%9F%B3%E4%BA%95-%E6%99%B4%E5%A4%AB/dp/4254126484)に詳しい記載がある。古い本なので若干読みにくさはあるが、私はこれで最初に主成分分析を学んだ。
SVMにおける主問題、双対問題については[線形計画法](https://www.amazon.co.jp/%E7%B7%9A%E5%BD%A2%E8%A8%88%E7%94%BB%E6%B3%95-%E5%BF%9C%E7%94%A8%E6%9C%80%E9%81%A9%E5%8C%96%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA-%E4%B8%A6%E6%9C%A8-%E8%AA%A0/dp/4254117868/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=Q8HHD8LUZGZC&keywords=%E7%B7%9A%E5%BD%A2%E8%A8%88%E7%94%BB%E6%B3%95&qid=1641614399&s=books&sprefix=%E7%B7%9A%E5%BD%A2%E8%A8%88%E7%94%BB%E6%B3%95%2Cstripbooks%2C162&sr=1-1) を読むことで理解が深まった。本書で学べることとSVMの問題の変換は厳密には異なるがエッセンスを学べた。