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