ロジスティック回帰

ロジスティック回帰による2値分類について

与えられたデータを2つのクラスに分類するアルゴリズムとして、以前パーセプトロンアルゴリズムやADALINEの記事を書きました。

rikiya-umehara.hatenablog.com

rikiya-umehara.hatenablog.com

今回は、同じように2値分類アルゴリズムとして用いられるロジスティック回帰について概説します。

$d$次元の入力空間で与えられた$n$個のデータ$ \boldsymbol{x}^{(i)}$と対応する教師ラベル$y^{(i)}$を考えます($ i = 1, \cdots, n $)。ただし、各$ y^{(i)}$は 0 または 1 を取るものとしてクラスのラベル付けがされているとします。

以下のような関数$ f(\boldsymbol{x})$を考え、これらのデータを$ f(\boldsymbol{x}) = 0$で表される超平面($d=2$なら直線)で分類することを考えてみます。

$$ f(\boldsymbol{x}) = \boldsymbol{w}^{T} \boldsymbol{x} $$

この時、「入力空間の各点$ \boldsymbol{x}$が、$y=1$のクラスに分類される確率」を素朴に考えてみます。

ちょうど超平面上の点であれば、境界線上なので確率$1/2$であると考えられます。また、関数$ f(\boldsymbol{x})$の勾配、すなわち$ \nabla f (\boldsymbol{x}) = \boldsymbol{w}$ 方向(=関数$f(\boldsymbol{x})$の値が大きくなる方向)に離れれば離れるほど、$y=1$のクラスに分類される確率は高いと考えられます。逆の方向に離れれば、$y=1$に分類される確率は小さくなり、$y=0$に分類される確率が大きくなります。

上のことを表すと、入力データ$\boldsymbol{x}$が$y=1$に分類される確率$P$は、以下のように表すことができます。

$$ P = \phi \left( z \right) = \phi \left( \boldsymbol{w}^{T} \boldsymbol{x} \right) $$

ここで、$ \phi$はシグモイド関数と呼ばれる関数です。

$$ \phi (z ) = \frac{1}{1 + e^{-z}} $$

f:id:rikiya-umehara:20210717173833p:plain

シグモイド関数は実数全体を0~1の区間に写す関数なので、これにより、$y=1$に分類される確率を表現しています。

最尤推定

与えられた$n$個の訓練データ$ \left( \boldsymbol{x}^{(i)}, y^{(i)} \right)$ $(i = 1, \cdots, n)$から、分類するのに最適な重み$ \boldsymbol{w}$を、最尤法により推定してみようと思います。

まず、尤度関数$ L ( \boldsymbol{w} )$を求めます。

ある1つの入力データと教師ラベルのペア$ \left( \boldsymbol{x}^{(i)}, y^{(i)} \right)$について、このデータが得られる確率は

\begin{align} y^{(i)} = 1 \text{の場合:}&\phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \\\ y^{(i)} = 0 \text{の場合:}& 1 - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \end{align}

なので、まとめると以下のように書くことができます。

$$ \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right)^{y^{(i)}} \left( 1 - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \right)^{1 - y^{(i)}} $$

したがって、尤度関数は以下のようになります。

$$ L \left( \boldsymbol{w} \right) = \prod_{i=1}^{n} \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right)^{y^{(i)}} \left( 1 - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \right)^{1 - y^{(i)}} $$

対数尤度関数$l (\boldsymbol{w})$は以下のようになります。

\begin{align} l \left(\boldsymbol{w} \right) &= \log L \left( \boldsymbol{w} \right) \\\ &= \sum_{i=1}^{n} \left\{ y^{(i)} \log \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) + \left( 1 - y^{(i)} \right) \log \left( 1 - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \right) \right\} \end{align}

あとは、この尤度関数を最大化するように、重み$\boldsymbol{w}$を決定していけば良いことになります。

重みの更新:勾配降下法

まずは、ADALINEと同じように勾配降下法により重みの更新アルゴリズムを実装してみます。

この場合、最小化したいコスト関数$ J (\boldsymbol{w})$は、対数尤度関数にマイナスをかけたものになります。すなわち、

\begin{align} J \left( \boldsymbol{w} \right) = - \sum_{i=1}^{n} \left\{ y^{(i)} \log \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) + \left( 1 - y^{(i)} \right) \log \left( 1 - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \right) \right\} \end{align}

を最小化したいです。

勾配降下法では、コスト関数の勾配の逆向きに重みを更新していくのでした。したがって、$ \nabla J \left( \boldsymbol{w} \right)$を計算していきます。

先に、シグモイド関数微分を計算しておくと、

\begin{align} \frac{d}{dz} \phi \left( z \right) &= \frac{d}{dz} \frac{1}{1+e^{-z}} \\\ &= \frac{e^{-z}}{\left( 1 + e^{-z} \right)^{2}} \\\ &= \phi (z) \left( 1 - \phi (z) \right) \end{align}

となります。よって、$ \nabla J \left( \boldsymbol{w} \right)$を順次計算していくと

\begin{align} \nabla J \left( \boldsymbol{w} \right) &= - \sum_{i=1}^{n} \left\{ y^{(i)} \frac{1}{\phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) } - \left( 1 - y^{(i)} \right) \frac{1}{1 - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right)} \right\} \nabla \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \\\ &= - \sum_{i=1}^{n} \left\{ y^{(i)} \frac{1}{\phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) } - \left( 1 - y^{(i)} \right) \frac{1}{1 - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right)} \right\} \phi \left(\boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \left( 1 - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \right) \boldsymbol{x}^{(i)} \\\ &= - \sum_{i=1}^{n} \left\{ y^{(i)} - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \right\} \boldsymbol{x}^{(i)} \end{align}

となります。以上より、勾配降下法による重みの更新は

\begin{align} \boldsymbol{w}^{\text{(new)}} = \boldsymbol{w}^{\text{(old)}} + \xi \sum_{i=1}^{n} \left\{ y^{(i)} - \phi \left( \boldsymbol{w}^{T} \boldsymbol{x}^{(i)} \right) \right\} \boldsymbol{x}^{(i)} \end{align}

となります($\xi$は学習率)。

実際に実装したものが以下です。

Logistic回帰(勾配降下法)

重みの更新:ニュートン・ラフソン法

工事中

scikit-learn による実装

工事中

参考文献