ロジスティック回帰モデルの簡単な例

ロジスティック回帰とは?

 線形識別関数の場合には、識別境界から離れるほど出力の絶対値が大きくなり続けます。しかし、少し違った関数として、出力を区間(0,1)に制限するような関数があればどうでしょうか?今回のトピックのロジスティック回帰はそのような関数であり、これは0から1の値を取るので、確率的な解釈を可能にするのが面白いところです。

 ロジスティック回帰については『はじめてのパターン認識』で言えば、88ページから95ページまでになります。ここを読めば、ロジスティック、シグモイド、ロジット、ログオッズ、パラメータの最尤推定、多クラス問題への拡張や非線形変換などを簡単に勉強することができます。

ロジスティック回帰を実装しよう

 今回は第6章に出てくるロジスティック回帰の図6.10をPythonで実装していきましょう。データは著者の仮想的なもののようですので、ここでは教科書を基にデータをて入力しました。{x}{y}のところでnp.matrixとnp.arrayを使っています。そしてロジスティック回帰は一から実装せずに、sklearnのLogisticRegressionを使いました。
www.amazon.co.jp

コード

import numpy as np
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt

x = np.matrix([0,2,4,6,8,11,15,19,22,25,29,32,33,34,36,38,40,42]).T
y = np.array([0,0,0,0,1,0,0,1,0,1,1,1,0,1,1,1,1,1])

classifier = LogisticRegression(C=1.0, penalty='l2')
classifier.fit(x,y)

xaxis = np.linspace(0,50,100)
yaxis = np.zeros(100)

for i in range(100):
	yaxis[i] = classifier.predict_proba(xaxis[i])[0,1]

plt.plot(xaxis,yaxis)
plt.xlabel('Smoking Amount')
plt.ylabel('Probability of Cancer')
plt.title('Example of Logistic Regression')

図示してみよう

f:id:decompose:20160417211946p:plain
 上のコードを実行すると、このような図が出てきます。横軸は喫煙量(本/日)ですが、増えるほど肺がんになる確率が高まることがわかります。ロジスティック回帰らしく、縦軸の確率がちゃんと0から1の間を取っています。