R-Lasso Regression-リグレッサごとに異なるラムダ


11

次のことを実行したい:

1)ベータ係数を取得するためのOLS回帰(ペナルティ項なし) ; は、回帰に使用される変数を表します。私はこれをしますbjj

lm.model = lm(y~ 0 + x)
betas    = coefficients(lm.model)

2)ペナルティ項を伴うLasso回帰。選択基準は、以下によって与えられるベイジアン情報基準(BIC)とする

λj=log(T)T|bj|

ここで、は変数/リグレッサ番号、は観測数、はステップ1)で取得した初期ベータを表します。この特定の値の回帰結果を取得したいのですが、これは使用する各リグレッサによって異なります。したがって、3つの変数がある場合、3つの異なる値ます。jB * jを λ jをλ jをTbjλjλj

次に、OLS-Lasso最適化問題は

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

Rでlarsまたはglmnetパッケージを使用してこれを行うにはどうすればよいですか?ラムダを指定する方法が見つからず、実行しても正しい結果が得られるかどうか100%わかりません

lars.model <- lars(x,y,type = "lasso", intercept = FALSE)
predict.lars(lars.model, type="coefficients", mode="lambda")

ここでどんな助けにも感謝します。


更新:

私は次のコードを使用しました:

fits.cv = cv.glmnet(x,y,type="mse",penalty.factor = pnlty)
lmin    = as.numeric(fits.cv[9]) #lambda.min
fits    = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty)
coef    = coef(fits, s = lmin)

1行目では、指定したペナルティファクター()との相互検証を使用していますが、これはリグレッサごとに異なります。2行目は、fits.cvの「lambda.min」を選択します。これは、最小平均交差検定誤差を与えるラムダです。3行目は、データに対して投げ縄近似()を実行します。ここでも、ペナルティファクターを使用しました。4 行目は、2行目で選択された「最適な」属する当てはめから係数を抽出します。λλλj=log(T)T|bj|alpha=1λλ

これで、最小化問題の最適解を表すリグレッサのベータ係数が得られました

minbϵRn={t=1T(ytbXt)2+Tj=1m(λt|bj|)}

ペナルティ係数ます。最適な係数のセットは、おそらく最初に使用したリグレッサのサブセットです。これは、使用されたリグレッサの数を削減するLassoメソッドの結果です。λj=log(T)T|bj|

私の理解とコードは正しいですか?


2
投稿ではLATEXマークアップをドル記号で囲んで使用できます。$\alpha$なり。質問を理解しやすくなるため、これを作成してください。回答してください。α
Sycoraxは、2015

回答:


15

glmnetドキュメント(?glmnet)から、収縮差を実行できることがわかります。これにより、少なくともOPの質問への回答の一部が得られます。

penalty.factor:個別のペナルティファクターを各係数に適用できます。これは、lambda収縮差を許容するために増加する数値です。一部の変数では0になる可能性があり、これは収縮がないことを意味し、その変数は常にモデルに含まれます。すべての変数のデフォルトは1です(およびにリストされている変数の暗黙的な無限大exclude)。注:ペナルティファクターは内部で再スケーリングされて合計がnvarsになり、lambdaシーケンスはこの変更を反映します。

質問に完全に答えるために、私はあなたが達成したいことに応じて、あなたが利用できる2つのアプローチがあると思います。

  1. あなたの質問は、差分縮小を適用glmnetし、特定の値係数を取得する方法です。供給STの一部の値が任意の値での収縮差1つの達成せません。それぞれの収縮収縮STを達成するためにある私たちはいくつかの代数を行う必要があります。してみましょうペナルティ因子であることに供給されるもの、。ドキュメントから、これらの値が st係数で再スケーリングされていることが。つまり、λ B J φ J = ログTλpenalty.factorλbjϕjbjCϕj=ϕj m=C m j = 1 logTϕj=logTT|bj|ϕjbjpenalty.factorCϕj=ϕjφ ' J φJCφ ' J λ=1m=Cj=1mlogTT|bj|ϕj以下の最適化式のを置き換えます。したがって、解き、に値をして、係数を抽出します。の使用をお勧めします。ϕjCϕjglmnetλ=1coef(model, s=1, exact=T)

  2. 2つ目は、「標準」の使用方法です。サンプル外のMSEを最小限に抑えるように、を選択するために分割交差検証をglmnet繰り返し実行します。これについては、以下で詳しく説明します。CVを使用してサンプル外の MSE をチェックする理由は、サンプル内の MSEがに対して常に最小化されるためです。つまり、は通常のMLEです。を変化させながらCVを使用すると、サンプル外のデータに対するモデルのパフォーマンスを推定し、最適な(特定の意味で)を選択できます。λ λ = 0 B λ λkλλ=0bλλ

このglmnet呼び出しは指定していません(パフォーマンス上の理由から、デフォルトで軌跡全体を計算するためです)。値の係数を返します。ただし、提供するの選択に関係なく、結果は、モデルを適合させるために呼び出しで適用した微分ペナルティを反映します。λ λ λλλcoef(fits,s=something)λsomethingλ

最適値を選択する標準的な方法は、ではなくを使用することです。交差検証は、サンプルの誤差を最小限に抑える収縮量を選択するために使用されますが、の仕様は、重み付けスキームに従って、一部の機能を他の機能よりも大きく収縮させます。λcv.glmnetglmnetpenalty.factor

この手順は最適化します

minbRmt=1T(ytbXt)2+λj=1m(ϕj|bj|)

ここで、は機能(引数で指定したもの)のペナルティファクターです。(これはあなたの最適化の表現とは若干異なります。ノート添字の一部が異なっていること。)。なお項は、すべての機能で同じであるので、いくつかの機能がより他よりも縮小していることを唯一の方法は、を介して行われ。重要なことに、とは同じではありません。はスカラー、はベクトルです。この式では、は固定されている/既知であると想定されています。つまり、最適化では、最適なではなく、最適なが選択されますJ T H λ φ J λ φ λ φ λ bはλϕjjthpenalty.factorλϕjλϕλϕλbλ

これは基本的にglmnet私が理解している動機です。ペナルティ付き回帰を使用して、サンプル外のパフォーマンスについて過度に楽観的でない回帰モデルを推定します。これがあなたの目標であれば、おそらくこれはあなたにとって正しい方法です。


+1正解です。また、回帰の正則化はベイズの事前分布と見なすことができます。つまり、最大事後確率(MAP)は正則化された最大尤度(ML)です。そのフレームワークで作業すると、必要な場合に正則化の柔軟性が高まります。
TLJ 2015

実行した場合 pnlty = log(24)/(24*betas); fits = glmnet(x,y, alpha=1, intercept=FALSE, penalty.factor = pnlty) 、ラムダはすべてのリスク要因で異なるため、指定したラムダに対応するリグレッサベータをどのように抽出しますか?
Dom

1
@Dom私があなたに使用したいものを正確に取得する明白な方法があることは少し遅すぎましたglmnet。私の改訂された答えを見てください。
Sycorax氏は、2015

2
各予測子に対して個別にペナルティをカスタマイズすることに注意してください。場合によっては、段階的な変数の選択にすぎません。ペナルティ付き回帰では、非常に限られた数のペナルティパラメータを想定し、予測子間で情報を借用することにより、平均二乗誤差が減少します。
フランクハレル2015

2
@FrankHarrellコメントありがとうございます!各予測子に異なるペナルティを使用すると、各パラメーターに異なる事前値を想定するベイジアンモデルになるようです。これは、一般的にベイジアン推論に対して独特の危険をもたらしているとは私には思いません。また、ペナルティ付き回帰が予測子間で情報を借用する方法について詳しく説明してください。そのようなシナリオがどのように当てはまるのか、私は完全に理解しているとは思いません。
Sycoraxは2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.