ill-identified diary

所属組織の見解などとは一切関係なく小難しい話しかしません

誤った図解から学ぶロジスティック回帰の性質

この記事は最終更新日から3年以上が経過しています

発端


www.datasciencecentral.com
というData Science Central の記事が,


(Data Science Central が完全にデタラメであることを思い出させてくれる好例)
とひどい言われようである.

何がおかしいのか

Python で同様の図を作ってみる. boundary の関数が何なのかはわからないが, 忖度してロジスティック曲線
\begin{align}y= & \frac{1}{1+\exp(-x)}\end{align}
を使って表してみた*1.
f:id:ill-identified:20180523232302p:plain
一方で, よく見かけるロジスティック回帰の図解はこれだろう.
f:id:ill-identified:20180523232322p:plain
なにかがおかしい.

ロジスティック回帰は2通りに分類するものだから, 目的変数  y は, 後者の図のように 0,1 の2通りしか存在しないはずである. しかし, 冒頭の図は y が無数に散らばっているので, あきらかにおかしい.

ロジスティック回帰を拡張すれば, 目的変数をゼロ以上の整数としたポアソン回帰というものになるが, 今回の図を見ると y は小数も取るように見えるので, ポアソン回帰とも違うようだ. 次に, 右側の凡例を見ると, TRUE, FALSE の2通りで色分けしている. つまり, 少し紛らわしいが, y は目的変数ではなく説明変数ということになり, 本来の目的変数は TRUE, FALSE の色分けで表されているのかもしれない. ということは, この図は, x,y という2変数のデータの散布図を, ロジスティック曲線で切り分けて分類しているということになる. なにより, この曲線は "boundary" であると書かれている. これは, 特徴量の分布する空間上での, 分類の境界線を表す決定境界 (decision boundary, decision surface とも) のことだろう. なるほど, 「ロジスティック回帰は直線的な回帰分析では表現できないものも表現できる」という説明をよく聞くが, ロジスティック曲線を使って決定境界を描けるからなのか. なるほどなるほど.

本当にそうだろうか?

このデータを, ロジスティック回帰を使って実際に分類できるか確認してみよう. sklearn モジュールを使って学習し, 予測値と本来の値を比較して, さきほどの図と同じようなものを作成してみる.

f:id:ill-identified:20180523232803p:plain

この図は, 本来の値ではなく予測値で色分けし, 予測値と真値が一致しないものは大きめの三角形で強調表示している. すると, 左下と右上に不正解になっている点が目立つ.

さっきの図と見比べて欲しい. どうもこれは, ロジスティック曲線ではなく, 破線で表した直線が分類の境界線になっているように見える.

結論

から言うと, 冒頭の図は間違っている. ロジスティック回帰の分類をロジスティック曲線で書くことはできない. ロジスティック回帰はまず, 説明変数x,y とパラメータ a,b,c をつかって,
\begin{align}z= & ax+by+c\end{align}
という量 z を作る. z\pm\infty の範囲を取るので, 次に冒頭のロジスティック曲線を使って, ゼロ以上1以下の値につぶした値 p を作る.

\begin{align}p= & \mathit{logistic}(z)\end{align}
p は必ずゼロから1の範囲を取るので, これは確率とみなせる. 何の確率かというと, 目的変数が 1 (今回の図では TRUE に対応する) になる確率である. そこで, 以下のように条件で分岐させることで, 目的変数の予測値を出力できる.

\begin{align}
\mathit{prediction}= & \begin{cases}
1 & \text{if }p\geq0.5\\
0 & \text{if }p<0.5
\end{cases}\end{align}

よって, x,y に対して予測値の決まる境界線は, p=0.5 の場合から逆算すると,
\begin{align}\mathit{logit}(p)=0= & ax+by+c\end{align}
という一次式で表される. \mathit{logit}(p) はロジット関数という, ロジスティック曲線の逆関数で, =\log(p/(1-p)) である. 予測値がどちらの値に分岐するかを表す境界線である  ax+bx+c=0 という方程式は, 明らかにロジスティック曲線ではなく, 直線を表している.

実はロジスティック回帰は, SVM などと同じ, 線形分類モデルと呼ばれるタイプの学習アルゴリズムで, 曲線の境界線を引けないのである*2. 学習アルゴリズムはいろいろ便利なものがあるが, その理論的な性質をよく理解せずに使うと足をすくわれることだろう*3.

なお, グラフ作成やロジスティック回帰の学習のプログラムは, まとめて gist に上げてある.

gist91be05eb10323aaa234e4351d7ed4db2

*1:中心を揃えるために位置とスケールを調整している.

*2:ただし, 変数の一部を対数に変換したり, 2乗したりといった非線形変換をおこなったり, カーネルトリックといったテクニックを併用すれば可能である. しかし, 応用テクニックをいきなり例として挙げるのは初心者への説明として不適切である. そして, 元の記事ではそういうテクニックを使ってるとは全く明言していない.

*3:元の記事では「ビギナーのあなたはおそらくロジスティック回帰をブラックボックスなツールとして扱ってきただろう. これが諸悪の根源だ」などと書いている. 皮肉である.