読者です 読者をやめる 読者になる 読者になる

Pythonと機械学習

Pythonも機械学習も初心者ですが、頑張ってこのブログで勉強してこうと思います。

ロジスティック回帰を実際に試してみる

機械学習

少し考えてみましたが、コスト関数である対数尤度は活性化関数の出力{\phi}が教師データ{\mathbf{y}}に近づくにつれ、0に漸近していくようです。

計算機上では{\phi=\mathbf{y}}にすると{\log(\mathbf{y})}が-∞に発散してしまうので値を求めることができないですが、解析解として{\mathbf{y}\log(\mathbf{y})}は0に漸近します。

したがって、{\phi=\mathbf{y}}の極限で、コスト関数は最小値0になります。

以下が、ロジスティック回帰を実装したスクリプトになります。

ベルヌーイ分布を使うため、教師データのクラスラベルは0と1にしてあります。(セトサが0でバージカラーが1です。)

ロジスティック回帰では、トレーニングサンプルを与えたときの出力として得られるクラスラベルの確率を求めることができるので、probabilityメソットを追加しました。

このスクリプトを実行すると、学習率と勾配効果法を変更した4つの学習結果グラフを出力します。(最大エポック数:20、特徴量の標準化、トレーニングデータのシャッフルは全結果で共通です。)

また、最後に一発解法で求めた結果を出力してみました。

学習率:0.01 バッチ勾配降下法の結果

右上にトレーニングサンプルを与えたときの出力として得られるクラスラベルが1(バージカラー)である確率グラフを追加しました。

最初の50個がセトサで後の50個がバージカラーなので、それなりの確率が出力されています。

しかし、20回のエポックループでも学習が不十分ですね。2こ外してます。

f:id:darden:20160823192921p:plain

学習率:0.2 バッチ勾配降下法の結果

学習率を0.2にしてやると、正答率が100%になりました。

コスト関数が単調減少なので、学習率を大きくしてやると発散せずに学習スピードが上がるんですね。

しかしこれ以上学習率を上げてやると、コスト関数の{\log (\phi)}の計算で浮動小数点演算の限界を超えるようで、nan出力されてしまいます。

決定境界がADALINEの時と異なっていますね。

f:id:darden:20160823193016p:plain

学習率:0.01 確率的勾配降下法の結果

確率的勾配降下法を使うと、1エポック目の正答率が96%になり、バッチ勾配降下法の時より良くなっています。

しかし、20回のエポック後では、結果がほとんど変わらないですね。

f:id:darden:20160823193115p:plain

学習率:0.2 確率的勾配降下法の結果

学習率を0.2では、2回目のエポックで正答率が100%になりました。

上の4つの中では、一番いい結果ですね。

f:id:darden:20160823193155p:plain

一発解法の結果

ADALINEの時はコスト関数が誤差二乗和だったので最小二乗法と呼べましたが。。今回はなんて言うんでしょうね?

一発解法で求めた重み{\displaystyle \mathbf{w} =(\mathbf{X}^{T}\mathbf{X})^{-1} \mathbf{X}^{T}\left(\log \mathbf{y} - \log (\mathbf{1}-\mathbf{y}) \right)}に、{\mathbf{y}}をそのまま代入すると計算できないので、少しだけずらした{\hat{\mathbf{y}}}を入れてみた結果です。

{\displaystyle 
\hat{\mathbf{y}} =
\left\{
\begin{array}{ll}
1 - 10^{-10} && (y_i=1) \\
10^{-10} && (y_i=0)
\end{array}
\right.
~\\
~\\
\mathbf{w} =(\mathbf{X}^{T}\mathbf{X})^{-1} \mathbf{X}^{T}\left(\log \hat{\mathbf{y}} - \log (\mathbf{1}-\hat{\mathbf{y}}) \right)

}

f:id:darden:20160823193248p:plain

やはり一発解法は一発でしっかり学習してくれていますね。

これ以上ずらし量を小さくすると浮動小数点演算の限界に達してしまうので、ここがプログラムの限界です。

結局ロジスティック回帰の利点は、トレーニングサンプルを入力したときのクラスラベルを確率で表すことができる事だけなんでしょうかね。。

学習効率はいまいちな感がありますが、テキストには結構実用されているような事が書いてあったので、何か特化した使い道があるんでしょうか?

まあ取りあえずは、ロジスティック回帰の概念が理解できてよかったです。