回帰から分類へ(ロジスティック回帰)
ロジスティック回帰
回帰モデルと分類モデルの関係を知るために、これまでのようなscikit-learnのライブラリを使わずに書いてみます
まずは入力が1次元で、2クラスに分類する場合を考える
出力(目的変数)は、$ y=0か$ y=1のいずれかを取るものとする(0, 1の2クラス)
たとえば以下のように、ある入力$ xに対して、$ y=0か$ y=1が対応するようなデータになる
https://gyazo.com/38103bcb62deded168d76d5e8b054065
$ xの値に応じて、$ yが0となるか1となるかを予測する、という2クラス分類の問題
たとえば線形回帰モデル$ y = f(x) = w_0 x + w_1をそのまま当てはめてみると?? https://gyazo.com/296f27980681ee58ca304e9d8e718914
線形回帰はあくまで、ある$ xに対する連続値$ yの値を求めるものなので、「0か1か」という分類はこのままでは不適
線形回帰モデルをシグモイド関数にかける
線形回帰モデルの出力をシグモイド関数に入力する
$ \phi(z) = \frac{1}{1 + \exp(-z)}
ここで$ z = w_0 x + w_1
これをロジスティック回帰モデルとよぶ
この$ \phi(z)を、$ xのとき$ y=1である確率とみなす
$ xのとき$ y = 1である確率$ P(y=1|x)は、ロジスティック回帰モデルによって以下のように表される
$ \phi(z) = \phi(w_0 x + w_1) = \frac{1}{1 + \exp \lbrace -(w_0 x + w_1) \rbrace} = P(y = 1|x)
https://gyazo.com/172ce53f422988b4d80d7912de4819a3(縦の破線は$ y = 0.5となる線)
これは、以下のように、$ w_0 x + w_1(赤い直線)がシグモイド関数にかけられて、$ \lbrack 0, 1 \rbrackの間に「押しつぶされる」イメージ
https://gyazo.com/8b97e4fadf8cee986a30c871a45c4102
ロジスティック回帰モデルのパラメータの学習
ロジスティック回帰モデル$ \phi(w_0 x + w_1) = \frac{1}{1 + \exp \lbrace -(w_0 x + w_1) \rbrace}
このパラメータ$ w_0, w_1はどのように求めるか?
以下のように、$ w_0, w_1を変えるとシグモイドの形や位置が変わる
そのなかで最も「データに当てはまる」ものを求める
$ y = 1となるデータ点においては$ \phi(w_0 x + w_1)が大きく、$ y = 0となるデータ点においては小さくなる、という状態が「当てはまりがよい」
https://gyazo.com/e0c38e2c1b0aa5278af4204dd4297cff($ w_0 = 5, w_1 = 10)あまり当てはまりがよくない
https://gyazo.com/9dadea935c6ed9544ca0623ab594124b($ w_0 = -12, w_1 = 5)これもあまり当てはまりがよくない
https://gyazo.com/172ce53f422988b4d80d7912de4819a3($ w_0 = 8, w_1 = 10)これは比較的当てはまりがよい
当てはまりの良さとして「尤度」を考える
いま、$ \phi(w_0 x + w_1) = P(y=1|x)と考えることにしている(ある$ xのときには、$ \phi(w_0 x + w_1)の確率で$ y = 1となるとしている)
ここで、$ P(y=1|x)を$ pとおくと、$ P(y=0|x)は$ 1 - pとなる
(ややトリッキーだが)これらをまとめて表現すると、「$ xのとき$ yである確率$ P(y|x)」は以下のように表現できる
$ P(y|x) = p^y(1-p)^{1-y}
これは要するに、以下の2つのパターンを一つの式で表現しているものになる
$ xのとき$ y=1となる確率:$ P(y=1|x) = p^1(1-p)^0=p
$ xのとき$ y=0となる確率:$ P(y=0|x) = p^0(1-p)^1=1-p
ここから、実際に手元にあるデータに最もよく当てはまるモデルを考えていく
データは$ N個($ i = 1, 2, \dots, N)あるとする($ i番目のデータは$ (x_i, y_i)($ y_iは1か 0))
$ x_iにおけるモデルの出力は、「$ y = 1となる確率$ p_i」であるので、$ y_i = 1のときには$ p_iの値が高く、$ y_i=0のときには$ p_iの値が低くなっていれば、モデルの出力として妥当だということになる
上で定義した$ P(y|x)は、$ i番目のデータに対しては$ P(y_i|x_i) = p_i^{y_i}(1-p_i)^{1-y_i}と表せるが、この$ P(y_i|x_i)は、「$ y_i = 1のときには$ p_iの値が高い場合、$ y_i=0のときには$ p_iの値が低い場合」に大きな値をとるので、「$ i番目のデータについて、実際のデータの値が、確率値と齟齬がない度合い」を示していることになる(別の言い方では「尤(もっと)もらしい」という)
$ N個のデータについてこれをすべて掛けたものを尤度(ゆうど)とよぶ
$ P(\bold Y|\bold X) = \prod_{i=1}^{N} P(y_i|x_i) = \prod_{i=1}^{N} p_i^{y_i}(1-p_i)^{1-y_i}
ここで、$ \bold X = x_1, \dots, x_N、$ \bold Y = y_1, \dots, y_N
この尤度が高いほど、データ全体について、モデルがよく当てはまっているといえる
例えば下のような場合は、$ y_i = 0のデータに関しては$ p_iがほとんど0に近いが、$ y_i = 1のデータについても多くの$ p_iが低い値を取っているので、$ P(y_i|x_i)も低くなってしまい、それらの積をとった全体の尤度も低くなる
https://gyazo.com/e0c38e2c1b0aa5278af4204dd4297cff
対数尤度の最大化
尤度はこのままだと積の形なので、対数をとって和の形にした対数尤度を考える
$ \log P(\bold Y|\bold X) = \sum_{i=1}^N \lbrace y_i \log p_i + (1-y_i) \log (1-p_i) \rbrace
この対数尤度が最大となるパラメータ($ w_0, w_1)を求めればよいことになる
この対数尤度に$ -1を掛けたものをクロスエントロピー(交差エントロピー、cross entropy)と呼び、それを$ Nで割った平均クロスエントロピー$ E(\bold w)を最小にするパラメータを求めればよい $ E(\bold w) = -\frac{1}{N}\log P(\bold Y|\bold X)
勾配法による対数尤度最大化
このクロスエントロピー$ E(\bold w)を最小にするパラメータ$ \bold wは、線形回帰モデルの学習とは異なり、$ p_iに非線形関数(シグモイド関数)を含むため、解析的には求められない(残念) よって、勾配法を用いて、数値的に(繰り返しで)パラメータを求めることになる
$ E(\bold w)の形はこんな感じになっていたりする。この谷底をみつけたい
https://gyazo.com/38310c93e3e9e14ffb4273f89d8f62a1
線形回帰モデルの学習で説明した勾配法の考え方と同じで、$ E(\bold w)をパラメータで偏微分したベクトルを求め、これをもとに学習則を導出する 途中計算は省略するが、以下のようになる
$ \frac{\partial E}{\partial w_0} = \frac{1}{N} \sum^N_{i=1}(p_i - y_i)x_i
$ \frac{\partial E}{\partial w_1} = \frac{1}{N} \sum^N_{i=1}(p_i - y_i)
この微分値を用いて、勾配法で最適化する
(サンプルコードでは、scipyのoptimizeライブラリにある、最適化のメソッドminimizeを用いて、共役勾配法という勾配法の一種で最適化している)
結果として、以下のようにフィッティングされる
https://gyazo.com/2e84ca8e85adf6622a6d254b04c9a5ce
これは$ y=1となる確率$ P(y=1|x) = pを示す関数になっている
$ p > 0.5となる$ xのところで決定境界が引かれているが、これを超えると$ y=1、超えないと$ y=0、というように、閾値を決めることで、確率値をクラスラベルに変換することができる
多次元への拡張
シグモイド関数$ \phi(z) = \frac{1}{1 + \exp(-z)} における$ zに線形回帰モデルを入れたものがロジスティック回帰モデルなので、この線形回帰モデルを多次元にすれば、多次元入力のバージョンに置き換えられる
$ \phi(w_0 x_0 + w_1 x_1 + \dots + w_{D-1} x_{D-1} + w_D) = \frac{1}{1 + \exp \lbrace -(w_0 x_0 + w_1 x_1 + \dots + w_{D-1} x_{D-1} + w_D) \rbrace}
1次元の場合と全く同じように、クロスエントロピーに対する各パラメータでの偏微分を用いて、パラメータを求める
2次元の場合のイメージ
https://gyazo.com/e329ef891eff00a10a74a530668b8fed
多クラス分類への拡張
(これはロジスティック回帰に限らず)2クラス分類のモデルを多クラス分類に容易に拡張することができる
たとえば3クラス分類であれば、3つのクラスに対応する入力の総和を考える
$ a_k = w_{k0} x_0 + w_{k1} x_1 + w_{k2} x_2 = \sum_{i=1}^D w_{ki} x_i (k = 0, 1, 2) (ただし$ x_2は常に1をとるダミー入力)
$ u = \exp (a_0) + \exp (a_1) + \exp (a_2) = \sum_{k=0}^{2} \exp (a_k)
$ y_k = \frac{\exp (a_k)}{u} (k = 0, 1, 2)
この$ y_0, y_1, y_2は、各クラスに入力が属する確率を表わすものとする($ y_0 + y_1 + y_2 = 1)
ソフトマックス関数は、シグモイド関数を一般化した関数(興味のある人は調べてみよう)
これも詳細は割愛するが、これまでと同様に考えていけばクロスエントロピーが計算できるので、これの偏微分を用いて勾配法によりパラメータを求めることができる
https://gyazo.com/a3d00ed1b91458241b91d625fb75a923
2次元入力・3クラス分類の場合のイメージ
https://gyazo.com/51b311f31f413f1d885ac215d98a7adf
(参考)一般化線形モデルとしてのロジスティック回帰
$ y = 1である確率を$ pとするとき、$ \frac{p}{1-p}をオッズ比という
ここで、オッズ比の対数をとったロジット関数 $ \text{logit}(p) = \log \frac{p}{1-p}を定義する
ここで以下のようなロジット関数を考える
$ \text{logit}(p) = w_0 x + w_1
つまり、$ xの線形モデルとロジット関数をつなぐ
(このような関数を、一般化線形モデルではリンク関数という)
この逆関数をとると・・・
$ \exp(\log \frac{p}{1-p}) = \exp(w_0 x + w_1)
$ \frac{p}{1-p} = \exp(w_0 x + w_1)
$ \frac{1-p}{p} = \frac{1}{\exp(w_0 x + w_1)}
$ \frac{1}{p} - 1 = \exp\lbrace-(w_0 x + w_1)\rbrace
$ \frac{1}{p} = 1 + \exp\lbrace-(w_0 x + w_1)\rbrace
$ p = \frac{1}{1 + \exp\lbrace-(w_0 x + w_1)\rbrace}
というように、シグモイド関数となる
これをロジスティック回帰モデルとして用いる