ill-identified diary

所属組織の見解などとは一切関係ありません

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

発端


www.datasciencecentral.com
という記事が,


でひどい言われようである.

何がおかしいのか

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

ロジスティック回帰は2通りに分類するものだから, この図だと目的変数は0,1 の2通りである. しかし, 今回の図は y が無数に散らばっているので, あきらかにおかしい.

ロジスティック回帰を拡張すれば, 目的関数をゼロ以上の整数としたポアソン回帰というものになるが, 今回の図を見ると y は小数も取るように見える. 加えて右側の凡例を見ると, TRUE, FALSE の2通りで色分けしている. つまり, 少し紛らわしいが, y は目的変数ではなく説明変数ということになる. ということは, この図は, x,y という2変数のデータの散布図を, ロジスティック曲線で切り分けて分類しているということになる. なるほど, 「ロジスティック回帰は直線的な回帰分析では表現できないものも表現できる」という説明をよく聞くが, ロジスティック曲線を使って分類するからなのか. なるほどなるほど.

本当にそうだろうか?

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

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

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

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

結論

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

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

prediction={1if p0.50if p<0.5

よって, x,y に対して予測値の決まる境界線は, p=0.5 の場合から逆算すると,
logit(p)=0=ax+by+c
という一次式で表される. logit(p) はロジット関数という, ロジスティック曲線の逆関数で, log(p/(1p)) である. 明らかにロジスティック曲線ではなく, 直線である. SVM などと同じ, 線形分類モデルと呼ばれるタイプの学習アルゴリズムである.

よって, ロジスティック回帰は, 実は非線形な境界線を引けないのである*2. 学習アルゴリズムはいろいろ便利なものがあるが, その理論的な性質をよく理解せずに使うと足をすくわれることだろう*3.

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

gist91be05eb10323aaa234e4351d7ed4db2

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

*2:ただし, 変数の一部を対数に変換したり, 2乗したりといった非線形変換をおこなったり, カーネルトリックといったテクニックを併用すれば可能である.

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