データ解析

シミュレーションで手法の精度比較をしてみよう(ロジスティック回帰編)

こんにちは!

今回は、シミュレーションで手法の精度比較をしてみよう(線形回帰編)と同じ要領でシミュレーションによって精度比較を行いたいと思います!

線形回帰モデルでの実験では、サンプルサイズに対して変数の数が多くかつ母回帰係数のスパース性が高いときにLassoの予測精度はとてもよかったという結果になりました。

果たしてその傾向はロジスティック回帰モデルでも同じなのかを見ていきたいと思います。

ロジスティック回帰モデルの人工データを用いてロジスティック回帰・Lasso・Ridgeの精度比較を行います。

実験の設定と手順

・比較手法:通常のロジスティック回帰・Lasso回帰・Ridge回帰

・評価指標:テストデータの平均誤判別率

・シミュレーション回数:100回

実験の流れは簡単にこんな感じです。

  1. 人工データを生成
  2. データを解析
  3. 指標を算出して結果を格納
  4. 1~3を100回繰り返す
  5. 結果の平均とばらつきで比較

人工データ生成

今回のデータの生成モデルを次に示します。

\begin{eqnarray*}
y_i&\sim&B(m_i,q_i)\\
m_i&=&1\\
q_i&=&\frac{1}{1+exp(-1-{\bf x}_i^T{\bf \beta})}\\
{\bf \beta}&=&(1,-1,0,\cdots,0)^T\in {\bf R}^p\\
{\bf x_i}&\sim& N({\bf \mu},{\bf \Sigma})\\
{\bf \mu}&=&{\bf 0}_p\\
{\bf \Sigma}&=&{\bf I}_p\\
i&=&1,2,\cdots,n\\
\end{eqnarray*}

線形回帰のときと同様で、説明変数は\(p\)次元であり、平均0・独立で発生させています。
また、\(\beta\)は\(p\)次元ベクトルであり、変数1と変数2のみが目的変数へ寄与があります。
つまり、かなりスパースな設定になっています。
今回は、\(p\)を5,10,50と変化させて実験してみます。

シミュレーション実験

シミュレーション実験をしてみましょう。
サンプルサイズ\(n\)は1100とします。
100個のデータを学習データ、残りの1000個のデータをテストデータとして実験します。

今回用いるコード(\(p=50\)の場合)を載せておきます。
実行する前に入っていないパッケージはインストールしておいてください。

ばらつきも含めて見たいので結果を箱ひげ図で表します。
通常のロジスティック回帰はglmと表記してあります。

・\(p=5\)の結果

やはり説明変数の数も多くないのでどの手法も同程度ですね。

・\(p=10\)の結果

Lassoが少し良い精度を示しているように見えます。

・\(p=50\)の結果

かなり、差が出ました。線形回帰のときと同様でLassoタイプのロジスティック回帰が最も良くなりました。
また、実行してみるとglm()では\(p=50\)のとき警告メッセージが出てきてしまいます。これは、変数の数が多くて推定が不安定になったからと考えられます。

どうでしょうか。結果は予想通りでしたね!
今回は精度比較の結果よりシミュレーションでロジスティック回帰モデルのデータの作り方や実際の解析の仕方を伝えたかったので分かっていただけたら嬉しいです!