JAGSの正規化ベイジアンロジスティック回帰


13

ベイジアンラッソを説明する数学に重点を置いた論文がいくつかありますが、使用できるテスト済みの正しいJAGSコードが必要です。

正規化されたロジスティック回帰を実装するサンプルBUGS / JAGSコードを投稿できますか?任意のスキーム(L1、L2、Elasticnet)が最適ですが、Lassoが推奨されます。また、興味深い代替の実装戦略があるのだろうかと思います。

回答:


19

L1正則化は、関連する係数の前のラプラス(二重指数)と同等であるため、次のように行うことができます。ここには、3つの独立変数x1、x2、x3があり、yはバイナリターゲット変数です。正則化パラメーター選択は、ここでハイパー優先順位を設定することで行われます。この場合、適切なサイズの範囲で均一です。λ

model {
  # Likelihood
  for (i in 1:N) {
    y[i] ~ dbern(p[i])

    logit(p[i]) <- b0 + b[1]*x1[i] + b[2]*x2[i] + b[3]*x3[i]
  }

  # Prior on constant term
  b0 ~ dnorm(0,0.1)

  # L1 regularization == a Laplace (double exponential) prior 
  for (j in 1:3) {
    b[j] ~ ddexp(0, lambda)  
  }

  lambda ~ dunif(0.001,10)
  # Alternatively, specify lambda via lambda <- 1 or some such
}

dcloneR のパッケージを使用して試してみましょう!

library(dclone)

x1 <- rnorm(100)
x2 <- rnorm(100)
x3 <- rnorm(100)

prob <- exp(x1+x2+x3) / (1+exp(x1+x2+x3))
y <- rbinom(100, 1, prob)

data.list <- list(
  y = y,
  x1 = x1, x2 = x2, x3 = x3,
  N = length(y)
)

params = c("b0", "b", "lambda")

temp <- jags.fit(data.list, 
                 params=params, 
                 model="modela.jags",
                 n.chains=3, 
                 n.adapt=1000, 
                 n.update=1000, 
                 thin=10, 
                 n.iter=10000)

正規化されていないロジスティック回帰と比較した結果は次のとおりです。

> summary(temp)

<< blah, blah, blah >> 

1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

          Mean     SD Naive SE Time-series SE
b[1]   1.21064 0.3279 0.005987       0.005641
b[2]   0.64730 0.3192 0.005827       0.006014
b[3]   1.25340 0.3217 0.005873       0.006357
b0     0.03313 0.2497 0.004558       0.005580
lambda 1.34334 0.7851 0.014333       0.014999

2. Quantiles for each variable: << deleted to save space >>

> summary(glm(y~x1+x2+x3, family="binomial"))

  << blah, blah, blah >>

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.02784    0.25832   0.108   0.9142    
x1           1.34955    0.32845   4.109 3.98e-05 ***
x2           0.78031    0.32191   2.424   0.0154 *  
x3           1.39065    0.32863   4.232 2.32e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

<< more stuff deleted to save space >>

そして、3つのbパラメーターが実際にゼロに向かって縮小していることがわかります。

ラプラス分布/正則化パラメーターのハイパーパラメーターの事前分布についてはあまり知りません、ごめんなさい。私は均一な分布を使用し、後部を見て、適切に振る舞うように見えるかどうかを確認します。たとえば、エンドポイントの近くに積み上げられず、ひどい歪度の問題のない中間にピークがあります。これまでのところ、通常はそうです。それを分散パラメーターとして扱い、階層モデルの分散パラメーターのゲルマン事前分布による推奨事項を使用することも、私にとっては有効です。


1
あなたは最高です!誰かが別の実装を行っている場合に備えて、しばらく質問を開いたままにします。1つは、バイナリインジケータを使用して変数の包含/除外を行うことができるようです。これにより、ベイジアンラッソでは変数の選択が実際に行われないという事実が補正されます。これは、二重指数事前分布をもつベータには正確にゼロである事後分布がないためです。
ジャックタナー

b
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.