完全分離のデータにロジスティック回帰を強行した結果

ロジスティック回帰は陽性・陰性のような二値分類を行う代表的な手法です。一変数の場合はシンプルに、ここから上は陽性、ここから下は陰性となるような閾値を見つけることとほぼ同じです。

ただし、データがある点を境に綺麗に二値に分かれている場合(完全分離)にロジスティック回帰を行うと問題があります。ざっくり言うと、ロジスティック回帰でフィッティングする関数が、完全分離を表すためには、パラメータを無限に大きくしないといけなくなると言う問題が起こります。詳しくは下の記事をご覧ください。

完全分離の状況であっても、強引にフィッティングすれば一応の結果は出てきます。ただし、変な結果を生むこともあるということを、例を使って示したいと思います。

データの生成

完全分離のデータを生成するために、xを標準正規分布からのサンプル、yをxが0以上の時は1、そうでない時は0として生成します。

xをテストの点数だとすると、平均点以上は合格、それ以下は不合格という合否をyが表すというイメージです。

また、zはxに正規分布に従うノイズを加えた値とします。これでx,zは相関を持った値になりますが、xとyとは違い、zとyの場合は完全分離とはならないので、yとzについてのロジスティック回帰は本来行うべきものになります。

テストの例えで言うと、zは前回のテストの点数だと思うと良いでしょう。今回合格したかどうかは今回の点数によって完全分離となりますが、前回の点数なら綺麗に分かれることはないでしょう。

import random
import numpy as np
N = 10000
SD = 0.1
x = np.random.normal(loc=0,scale=1,size=N)
z = x + np.random.normal(loc=0,scale=SD,size=N)
y = x > 0
生成されたデータ

生成されたデータをプロットしたのが上の図です。オレンジと青はyの1,0に対応しています。

シンプルなロジスティック回帰の結果

説明変数をx,zとしてロジスティック回帰を行います。sklearnのLogisticRegressionではデフォルトで正則化が有効になっていますが、まずは正則化を行わずにシンプルに回帰した結果を見ます。

ロジスティック回帰では、yが1である確率をx,zから推定するために、下の式の係数a,bをフィッティングします。

$$
logit(y) = ax + bz
$$

結果は下の通りで、xの係数aが非常に大きく、zの係数bがマイナスとなりました。

coefficient =  [[12182.86500367   -31.12993325]] # [[a b]]

xの係数が大きくなるのは、冒頭で書いたように、xについて完全分離なので、フィッティングのためには本来aを無限に大きくする必要があるためです。

係数の符号の反転

一方で、zの係数の方は大きな問題でしょう。xと相関があり、当然、yに対してもポジティブな関係のあるはずのzの係数がマイナスになっています。本来、得たい結果を逆の結果になっています。

この原因は、完全分離なxを入れてしまったために、係数の推定誤差が大きくなっているためです。同じ分布から再度データをサンプルして何度か回帰を行うとzの係数はプラスになったり、マイナスになったりして、係数が安定しない様子が確認できます。

このように、完全分離のデータを混ぜて強引にロジスティック回帰を行ってしまうと、意図しない結果を得る可能性があるので注意が必要です。

正則化を行った場合の結果

sklearnではデフォルトで正則化が行われます。そこで正則化を使ってロジスティック回帰を行った場合の結果も見ておきましょう。

正則化では推定するパラメータに対して、その大きさにペナルティをかけます。ここでは、係数a,bの大きさにペナルティがかかることになります。

繰り返しますが、xが完全分離なので係数aは、本来無限に大きくしたいところです。それが、正則化を行うことで、無理やり小さめのaに押し込むことになります。

その結果は、以下のようになりました。先ほどとは違い、aが小さくなり、そして、a,bがプラスになっています。

coefficient =  [[11.99476854  4.88455483]] # [[a b]]

ロジスティック回帰の気持ちになってみると、aを大きくしたいけど、正則化のせいで大きくできないから、相関のあるzも使おうという結果です。

正則化すれば解決なのか?

では、正則化すれば完全分離でも強引に回帰してしまっていいのかというと、そうでもありません。

正則化の穴をつくために、xだけ1000倍してみましょう。x自体が大きくなれば、その係数aは小さくてもaを大きくしたのと同じ効果が得られます。aが小さくてもいいということは正則化のペナルティの効きが悪くなります。

その結果は下の通りです。再びzの係数bがマイナスに戻ってしまいました。

coefficient =  [[ 1.26536843 -0.0923154 ]]# [[a b]]

小さいaでも十分に完全分離ができてしまうので、回帰にとってzの扱いが雑に戻ったイメージです。

まとめ

ロジスティック回帰を行う際に完全分離がもたらす問題について例を踏まえて紹介しました。完全分離な説明変数が混ざっていると、その他の変数に対しても悪影響を及ぼすので、注意しましょう。

意外と診断結果を説明するために、診断の基準となる変数を用いるなど、うっかり完全分離が紛れ込むことが少なからずあるようです。

コメント

タイトルとURLをコピーしました