L1 正則化(LASSO)と L2 正則化(Ridge)について

正則化

一般的な回帰モデル

\[ \boldsymbol{y} = \boldsymbol{X}\boldsymbol{\beta} + \boldsymbol{\epsilon} \]

におけるパラメータ推定は、パラメータ β を最小二乗法などにより推定している。つまり、次式が最小となるようにパラメータ β を求めることである。

\[ \hat{\mathbf{\beta}} = argmin_{\beta} \left (||\mathbf{y}-\mathbf{X}\mathbf{\beta}||^{2}_{2} \right )\]

しかし、高次元小標本のデータ(説明変数が標本数に比べて多いデータ)などの場合では解が見つからない場合が生じてくる。そこで、パラメータを推定する時に、罰則 R(β) を設けることで、解を見つけやすくする。λ は正則化パラメータと呼ばれ、罰則(正則化項)の寄与率を調整する役割を持つ。

\[ \hat{\mathbf{\beta}} = argmin_{\beta} \left(||\mathbf{y}-\mathbf{X}\mathbf{\beta}||^{2}_{2} + \lambda R(\beta) \right ) \]

L1 正則化

正則化項が ||β||1 のとき、これを L1 正則化(LASSO)とよぶ(Tibshirani, 1996)。このとき、パラメータ β は次の式に基づいて推定する。

\[ \hat{\mathbf{\beta}} = argmin_{\beta}\left(||\mathbf{y}-\mathbf{X}\mathbf{\beta}||^{2}_{2} + \lambda ||\mathbf{\beta}||_{1}\right) \]

LASSO 推定は、一部のパラメータの値をゼロにすることができる。回帰モデルにおいて、互いに相関の高い説明変数が含まれている場合は、LASSO 推定により、相関の高い変数のうち 1 つだけ残り、他はゼロと推定される。相関の高い複数の変数のうち、どれが選択されるかは、LASSO 推定を行う度に異なる。そのため、LASSO を利用した変数選択は、不安定と言われている。

L2 正則化

正則化項が ||β||22 のとき、これを L2 正則化(Ridge)とよぶ。このとき、パラメータ β は次の式に基づいて推定する。

\[ \hat{\mathbf{\beta}} = argmin_{\beta}\left(||\mathbf{y}-\mathbf{X}\mathbf{\beta}||^{2}_{2} + \lambda ||\mathbf{\beta}||^{2}_{2}\right) \]

正則化項がパラメータの 2 乗となっているので、値の大きいパラメータを小さくする方が、値の小さいパラメータを小さくする方よりも、正則化項の値が小さくなる。そのため、あるパラメータをある程度小さくしてから、他の値の大きいパラメータを小さくした方が、正則化項全体の値が小さくなる。このとこから、Ridge 推定の場合は、パラメータの値がゼロになりにくいと言われている。

Elastic Net 正則化

L1 正則化と L2 正則化の効果を α : (1-α) の割合で混合した正則化が Elastic Net である(Zou et al., 2005)。

L1 正則化(LASSO)は、高次元小標本のデータ(p 次元 n 標本;p > n)の場合に、変数を高々 n 個しか選択できない。また、遺伝子発現量データをモデリングする場合、説明変数間の相関が高くなるため、LASSO ではこの相関をうまく処理できずに、適切な変数選択が行われなかったりする。Elastic Net では、LASSO の効果を弱めて、代わりに L2 正則化(Ridge)の効果を加えることで、変数を n 個以上に選択ができ、相関の高い説明変数に対しても、変数選択が適切に行える。

\[ \hat{\mathbf{\beta}} = argmin_{\beta} \left( ||\mathbf{y}-\mathbf{X}\mathbf{\beta}||^{2}_{2} + \lambda \left (\alpha ||\mathbf{\beta}||_{1} + (1-\alpha )||\mathbf{\beta}||^{2}_{2} \right)\right) \]

Elastic Net と LASSO の変数選択の違いを見るために、ここで 2 つの独立した因子 z1 と z2 を想定する。この因子から y = z1 + 0.1z2 となるように応答変数を作成する。次に、同じくこの 2 つの因子を利用して、説明変数を 6 個(x1, x2, ..., x6)生成する。最後に、6 つの説明変数 x を利用して、応答変数 y を説明するモデルを LASSO と Elastic Net で作成する。

set.seed(12345)
z1 <- rnorm(100, 0, 10)
z2 <- runif(100, 0, 10)

y <- z1 + 0.1 * z2 + rnorm(100)

x1 <- z1 + rnorm(100)
x2 <- z1 + rnorm(100)
x3 <- -z1 + rnorm(100)
x4 <- z2 + rnorm(100)
x5 <- z2 + rnorm(100)
x6 <- -z2 + rnorm(100)

lasso.model <- glmnet(x = cbind(x1, x2, x3, x4, x5, x6), y = y, alpha = 1)
elasticnet.model <- glmnet(x = cbind(x1, x2, x3, x4, x5, x6), y = y, alpha = 0.5)

plot(lasso.model)
plot(elasticnet.model)

応答変数 y の作り方からして、y は主に 3 つの説明変数 x1、x2、x3 によって説明される。x1、x2、x3 は互いに相関または逆相関している。このような状況の中で、LASSO と Elastic Net それぞれの方法で作成したモデルの解パス(正則化項と係数)をみると、Elastic Net の方が、LASSO に比べて、変数を正しく選択しているのを確認できる。

LASSO と Elastic Net の変数選択の性質の違い

上のサンプルコート中の set.seed 関数に与える数値を、他の数値に変更してコードを実行すると、実行するたびに、LASSO は x1 を最初に選択したり、x2 を最初に選択したりして不安定性を確認できる。これに対して、ELastic Net は、x1、x2、x3 の 3 変数を常に選択されていることも確認できる。

References