発端
www.datasciencecentral.com
というData Science Central の記事が,
"A good reminder that Data Science Central is completely insane" https://t.co/68esZTv88d
— mat kelcey (@mat_kelcey) 2018年5月22日
(Data Science Central が完全にデタラメであることを思い出させてくれる好例)
とひどい言われようである.
何がおかしいのか
Python で同様の図を作ってみる. boundary
の関数が何なのかはわからないが, 忖度してロジスティック曲線
を使って表してみた*1.
一方で, よく見かけるロジスティック回帰の図解はこれだろう.
なにかがおかしい.
ロジスティック回帰は2通りに分類するものだから, 目的変数 は, 後者の図のように の2通りしか存在しないはずである. しかし, 冒頭の図は が無数に散らばっているので, あきらかにおかしい.
ロジスティック回帰を拡張すれば, 目的変数をゼロ以上の整数としたポアソン回帰というものになるが, 今回の図を見ると は小数も取るように見えるので, ポアソン回帰とも違うようだ. 次に, 右側の凡例を見ると, TRUE
, FALSE
の2通りで色分けしている. つまり, 少し紛らわしいが, は目的変数ではなく説明変数ということになり, 本来の目的変数は TRUE, FALSE の色分けで表されているのかもしれない. ということは, この図は, という2変数のデータの散布図を, ロジスティック曲線で切り分けて分類しているということになる. なにより, この曲線は "boundary" であると書かれている. これは, 特徴量の分布する空間上での, 分類の境界線を表す決定境界 (decision boundary, decision surface とも) のことだろう. なるほど, 「ロジスティック回帰は直線的な回帰分析では表現できないものも表現できる」という説明をよく聞くが, ロジスティック曲線を使って決定境界を描けるからなのか. なるほどなるほど.
本当にそうだろうか?
このデータを, ロジスティック回帰を使って実際に分類できるか確認してみよう. sklearn
モジュールを使って学習し, 予測値と本来の値を比較して, さきほどの図と同じようなものを作成してみる.
この図は, 本来の値ではなく予測値で色分けし, 予測値と真値が一致しないものは大きめの三角形で強調表示している. すると, 左下と右上に不正解になっている点が目立つ.
さっきの図と見比べて欲しい. どうもこれは, ロジスティック曲線ではなく, 破線で表した直線が分類の境界線になっているように見える.
結論
から言うと, 冒頭の図は間違っている. ロジスティック回帰の分類をロジスティック曲線で書くことはできない. ロジスティック回帰はまず, 説明変数 とパラメータ をつかって,
という量 を作る. は の範囲を取るので, 次に冒頭のロジスティック曲線を使って, ゼロ以上1以下の値につぶした値 を作る.
は必ずゼロから1の範囲を取るので, これは確率とみなせる. 何の確率かというと, 目的変数が 1 (今回の図では TRUE
に対応する) になる確率である. そこで, 以下のように条件で分岐させることで, 目的変数の予測値を出力できる.
よって, に対して予測値の決まる境界線は, の場合から逆算すると,
という一次式で表される. はロジット関数という, ロジスティック曲線の逆関数で, である. 予測値がどちらの値に分岐するかを表す境界線である という方程式は, 明らかにロジスティック曲線ではなく, 直線を表している.
実はロジスティック回帰は, SVM などと同じ, 線形分類モデルと呼ばれるタイプの学習アルゴリズムで, 曲線の境界線を引けないのである*2. 学習アルゴリズムはいろいろ便利なものがあるが, その理論的な性質をよく理解せずに使うと足をすくわれることだろう*3.
なお, グラフ作成やロジスティック回帰の学習のプログラムは, まとめて gist に上げてある.
gist91be05eb10323aaa234e4351d7ed4db2