多変量解析

線形回帰・Lasso回帰・Ridge回帰を実装してみよう!

こんにちは!

以前、正則化スパース推定を紹介しました。

でも、式や概念の説明だといまいちどんなことが起きているのかわからない・・・

そこで、今回はR言語を用いて実際に解析してどんな違いがあるのかを確認してみます!

線形回帰・Lasso回帰・Ridge回帰を比較

今回比較するのは、通常の線形回帰・Lasso回帰・Ridge回帰です。
簡単に、三つの手法についておさらいします。

通常の線形回帰

通常の線形回帰は残差\({\bf y}-{\bf X}{\bf \beta}\)が最小になるように\(\beta\)を推定します。
つまり、次の式を最小化するように\(\beta\)を推定します。
\begin{eqnarray*}
\|{\bf y}-{\bf X}{\bf \beta}\|_2^2\\
\end{eqnarray*}

Ridge回帰

Ridge回帰は正則化手法であり、多重共線性などが起きていて通常の線形回帰ではパラメータが推定できないような場面でも罰則を与えることで推定できるようにしたものです。

次の式を最小化するように\(\beta\)を推定します。
\begin{eqnarray*}
\|{\bf y}-{\bf X}{\bf \beta}\|_2^2+\lambda\|{\bf \beta}\|_2^2\\
\end{eqnarray*}
第2項は正則化項と呼ばれ、なるべくパラメータ\(\beta\)の絶対値を小さくするような働きをします。

ここで、\(\lambda\)は正則化パラメータであり、解析者が設定するかクロスバリデーションなどで決定する必要があります。

Lasso回帰

Lasso回帰も正則化手法です。Ridge回帰とは異なりパラメータのいくつかを0に推定できるという特徴があります。

これをスパース推定と呼びます。次の式を最小化するように\(\beta\)を推定します。
\begin{eqnarray*}
\|{\bf y}-{\bf X}{\bf \beta}\|_2^2+\lambda\|{\bf \beta}\|_1\\
\end{eqnarray*}

今回は、線形回帰はglm()関数、LassoとRidgeはglmnetパッケージのglmnet()関数を用います。

人工データ生成

データは、実データではなく自分で発生させる人工データを用います。
今回のデータの生成モデルを次に示します。

\begin{eqnarray*}
y_i&=&1+{\bf x}_i^T{\bf \beta}+\epsilon_i\\
{\bf \beta}&=&(1,0,-1,0,0)^T\\
{\bf x_i}&\sim& N({\bf \mu},{\bf \Sigma})\\
{\bf \mu}&=&{\bf 0}_5\\
{\bf \Sigma}&=&{\bf I}_5\\
\epsilon_i&\sim& N(0,1^2)\\
i&=&1,2,\cdots,n\\
\end{eqnarray*}

説明変数は、平均0・独立で発生させています。
また、\(\beta\)の設定から変数2・変数4・変数5は目的変数に寄与していません。

線形回帰・Lasso回帰・Ridge回帰を実装

先ほど説明したデータで解析をしてみましょう!

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

それぞれ3手法で推定された回帰係数と予測誤差(MSPE;Mean Squared Prediction Error)を計算してみましょう。

線形回帰・Lasso回帰・Ridge回帰の回帰係数

■通常の線形回帰で推定された回帰係数

(Intercept) 1.110727505
x1 0.862992782
x2 -0.024437489
x3 -0.757605621
x4 -0.098294387
x5 -0.008577822

■Lasso回帰で推定された回帰係数

(Intercept) 1.0713394
x1 0.7781268
x2 .
x3 -0.6778876
x4 .
x5 .

■Ridge回帰で推定された回帰係数

(Intercept) 1.08903319
x1 0.81095492
x2 -0.02288852
x3 -0.71278554
x4 -0.09335028
x5 -0.01748969

(Intercept)は定数項を表しています。
どうでしょうか、Lasso回帰は変数1と変数3以外は完全に0になっていることがわかります。
つまり、自動的に変数選択ができました!これは嬉しいですね!

回帰係数の2乗和を比較

また、推定された回帰係数の2乗和を計算すると次のようになりました。

■通常の線形回帰
> sum(as.matrix(result_glm$coefficients)^2)
2.562771

■Lasso
> sum(coefficients(result_lasso,s=”lambda.min”)^2)
2.212781

■Ridge
> sum(coefficients(result_ridge,s=”lambda.min”)^2)
2.361248

やはり、通常の線形回帰と比較して小さくなっています。

MSPEを比較

最後に、MSPEを比較します。

※MSPEは、Mean square prediction errorで予測値と観測値の差の二乗平均を取った値です。

■通常の線形回帰
> mean((data_test$y-yhat_glm)^2)
1.119285

■Lasso
> mean((data_test$y-yhat_lasso)^2)
1.171355

■Ridge
> mean((data_test$y-yhat_ridge)^2)
1.153019

最も良いのは通常の線形回帰になりました。

これはサンプルをたくさんあって、説明変数に相関もなく多重共線性が起きていないから当たり前ですね!

もっと、変数を増やしてみたりするとLassoやRidgeがMSPEで勝つこともあるでしょう。

ちなみに、このプログラムでは一回の計算なので、結果の信頼性には欠けます。そのため、続いて、シミュレーションを何回か行って精度を検証していきましょう!

線形回帰・Lasso回帰・Ridge回帰の精度をシミュレーションで比較

どの手法が良いか・どのモデルが良いかを比較する為にはシミュレーションを繰り返して、指標の平均やばらつきをみて判断することが大切です。たった一回の結果では本当に差があるのか偶然なのか信頼性に欠けるからです。

今回は線形回帰モデルの人工データを用いて線形回帰・Lasso・Ridgeの精度比較を行います。

実験の設定と手順

・比較手法:通常の線形回帰・Lasso回帰・Ridge回帰

・評価指標:MSPE(平均二乗予測誤差)

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

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

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

人工データ生成

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

\begin{eqnarray*}
y_i&=&1+{\bf x}_i^T{\bf \beta}+\epsilon_i\\
{\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\\
\epsilon_i&\sim& N(0,1^2)\\
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\)の結果

通常の線形回帰とRidgeは同じくらいですが、Lassoが良い精度を示しています。
説明変数が多くなってスパース性が上がったことが原因でしょう。

・\(p=50\)の結果

通常の線形回帰が最も悪くなり、Lassoが最も良くなりました。
差もかなり大きいです。

通常の線形回帰が悪い理由:サンプルサイズが100なのに対して説明変数が50次元なので推定が不安定になった。
Ridgeが2番目の理由:正則化しているので推定は安定しているがスパース性を考慮していないのでLassoより劣った。

よって、説明変数が多くて回帰係数がスパースのとき、Lassoは予測精度が通常の線形回帰・Ridgeと比べて良いことがわかりました。

こんな感じで手法の精度を比べたいときは、シミュレーションを繰り返して比較しましょう!

しかし、「今回は人工データだからたくさんデータを生成できるけど実データで精度比較したいときはどうするの?」という疑問が出てくると思います。その場合には交差検証法を使って比較します。
交差検証法についてはまた別のページで!

Ridge・Lassoについて理論から知りたい方はこちらの記事をご覧ください!

スパース推定とは?理論とオススメ本を紹介! この記事では、スパース推定について説明していきます! 予備知識として、このページを見る前に正則化についてまとめている以下のペー...