すべての係数を0に縮小する投げ縄を解釈する方法は?


8

Lassoを使用して特徴選択を実行している338個の予測子と570個のインスタンス(残念ながらアップロードできません)のデータセットがあります。特に、次のcv.glmnetfrom関数を使用しglmnetています。ここmydata_matrixで、は570 x 339のバイナリマトリックスで、出力もバイナリです。

library(glmnet)
x_dat <- mydata_matrix[, -ncol(mydata_matrix)]
y <- mydata_matrix[, ncol(mydata_matrix)]
cvfit <- cv.glmnet(x_dat, y, family='binomial')

このプロットは、すべての変数がモデルから削除されたときに最小の逸脱が発生することを示しています。これは本当に、インターセプトを使用するだけで、単一の予測子を使用するよりも結果を予測しやすいのか、それともおそらくデータまたは関数呼び出しで誤りを犯したのか?

これは前の質問と似ていますが、何も返答がありませんでした。

plot(cvfit)

ここに画像の説明を入力してください


1
このリンクは詳細の一部を具体化できると思います。本質的には、(すべてではないにしても)多くの予測子があまり重要ではないことを意味します。以下のスレッドでは、これについてさらに詳しく説明しています。stats.stackexchange.com/questions/182595/...
Dhiraj

3
@Dhiraj Significantは、帰無仮説の有意性検定に関連する技術用語です。ここでは適切ではありません。
Matthew Drury 2017

回答:


11

コードを間違えたとは思いません。これは出力の解釈の問題です。

Lassoは、どの個別リグレッサが他のリグレッサより「予測的」であるかを示していません。係数をゼロと推定する組み込みの傾向があります。ペナルティ係数が大きいほど、その傾向は大きくなります。ログλ

交差検証プロットは、より多くの係数が強制的にゼロにされると、モデルがデータセットからランダムに削除された値のサブセットを予測するより良い仕事をすることを示しています。すべての係数がゼロのときに最良の交差検証済み予測エラー(ここでは「二項偏差」として測定)が達成された場合、リグレッサのサブセットの線形結合が結果の予測に役立つ可能性がないことを疑う必要があります。

これを確認するには、すべてのリグレッサから独立したランダムな応答を生成し、フィッティング手順をそれらに適用します。データセットをエミュレートする簡単な方法を次に示します。

n <- 570
k <- 338
set.seed(17)
X <- data.frame(matrix(floor(runif(n*(k+1), 0, 2)), nrow=n,
                       dimnames=list(1:n, c("y", paste0("x", 1:k)))))

データフレームにXは、「y」という名前の1つのランダムバイナリ列と、他の338個のバイナリ列(名前は関係ありません)があります。私はこれらの変数に対して「y」を回帰するためにあなたのアプローチを使用しましたが、-注意してください-応答ベクトルyとモデルマトリックスがx一致することを確認しました(データに欠損値がある場合、それらは一致しない可能性があります) :

f <- y ~ . - 1            # cv.glmnet will include its own intercept
M <- model.frame(f, X)
x <- model.matrix(f, M)
y <- model.extract(M, "response")
fit <- cv.glmnet(x, y, family="binomial")

結果は著しくあなたのものに似ています:

plot(fit)

図

実際、これらの完全にランダムなデータを使用しても、Lassoは依然として9つの非ゼロ係数推定値を返します(構造上、正しい値がすべてゼロであることはわかっていますが)。しかし、完璧を期待するべきではありません。さらに、フィッティングは相互検証のためにデータのサブセットをランダムに削除することに基づいているため、通常、実行ごとに同じ出力が得られません。この例では、2回目の呼び出しで、ゼロ以外の係数が1つcv.glmnetだけの近似が生成されます。このため、時間がある場合は、フィッティング手順を数回再実行し、どの係数推定値が常に非ゼロであるかを追跡することを常にお勧めします。これらのデータ(数百のリグレッサを含む)の場合、これを9回繰り返すのに数分かかります。

sim <- cbind(as.numeric(coef(fit)), 
             replicate(9, as.numeric(coef(cv.glmnet(x, y, family="binomial")))))
plot(1:k, rowMeans(sim[-1,] != 0) + runif(k, -0.025, 0.025), 
     xlab="Coefficient Index", ylab="Frequency not zero (jittered)",
     main="Results of Repeated Cross-Validated Lasso Fits")

図2

これらのリグレッサのうち8つは、近似の約半分でゼロ以外の推定値を持っています。それらの残りはゼロ以外の推定値を持つことはありません。これは、係数自体が本当にゼロの場合でも、ラッソが非ゼロの係数推定をどの程度含めるかを示しています。


1

より多くの情報を取得したい場合は、関数を使用できます

fit1<-glmnet(x_dat, y, family='binomial', alpha= x)

plot(fit1, xvar = "lambda", label = TRUE)

グラフは次のようになります ここに画像の説明を入力してください 。ラベルは、リグレッサに対するラムダの影響を識別できるようにします。

xの差分値(モデルではアルファ係数と呼ばれます)を0(リッジ回帰)から1(LASSO回帰)まで使用できますか?値[0,1]はエラスティックネット回帰です


ヒントをありがとう、アルファを0.5に減らすと、より多くの変数を含めることができます。
スチュアートレイシー

0

結果を予測するのに役立つ変数の線形結合がないという答えは、すべてではないが一部の場合に当てはまります。

データの多重共線性によって引き起こされた上記のようなプロットがありました。相関関係を減らすと、ラッソは機能しましたが、結果に関する有用な情報も削除されました。変数のスクリーニングにランダムフォレストの重要度を使用し、次にLassoを使用することで、より良い変数のセットが得られました。


-1

それは可能ですが、少し意外です。共線性がある場合、LASSOは奇妙なことを行う可能性があります。その場合は、代わりにalpha <1を設定して、代わりに弾性ネットをフィッティングする必要があります。相互検証によってアルファを選択できますが、アルファの各値に同じフォールドを使用していることを確認してください。

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