Rでの投げ縄回帰の交差検証


9

R関数cv.glm(ライブラリ:ブート)は、一般化線形モデルの推定K分割交差検定予測誤差を計算し、デルタを返します。なげなわ回帰(ライブラリ:glmnet)にこの関数を使用することには意味がありますか?その場合、どのように実行できますか?glmnetライブラリは、交差検証を使用して最適な回転パラメーターを取得しますが、最終的なglmnet方程式を交差検証する例は見つかりませんでした。


2
LASSOは1つの(ハイパー)パラメーターのみを最適化しますが、サンプル外のパフォーマンスを最大限に見積もるには、外側の相互検証ループが必要です。参照CAN /ブートストラップをCVを使用して、トレーニング機械学習アルゴリズムによってあなたオーバーフィット?&引用論文。
Scortchi-モニカの回復

glm espではなくglmnetを使用することをお勧めします。あなたがCVをしているなら。思い出すと、glmパッケージは使いづらくなります。また、cv.glmnetはcv.glmより多くのパラメーターを公開します。
smci

回答:


9

で投げ縄のためにバニラのプレーン相互検証を行う方法の例glmnetについてmtcars のデータ・セット。

  1. データセットをロードします。

  2. 機能(独立変数)を準備します。彼らはmatrixクラスのはずです。df含むカテゴリ変数をに変換する最も簡単な方法は、を使用することmatrixですmodel.matrixglmnet注意してください。デフォルトでは切片がフィットするので、モデル行列から切片を取り除く方がよいでしょう。

  3. 応答を準備します(従属変数)。平均以上のmpg効率の自動車( '1')と残りの非効率( '0')の自動車をコーディングしてみましょう。この変数を因数に変換します。

  4. を介して交差検証を実行しますcv.glmnet。それはあなたが求めたものであるalpha=1デフォルトのglmnetパラメーターからピックアップします:投げ縄回帰。

  5. 相互検証の出力を調べることにより、少なくとも2つの情報に関心がある可能性があります。

    • ラムダは、交差検証エラーを最小化します。glmnet実際には2つのラムダを提供していますlambda.minlambda.1se。使用する実践的な統計学者としての判断の呼びかけです。

    • 結果の正則化された係数。

上記の指示に従ってRコードを参照してください:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

最終コメント:

  • モデルの出力は、係数の統計的有意性については何も言わず、値だけを示していることに注意してください。

  • あなたが要求したl1ペナライザー(投げ縄)は、このブログ投稿とこのstackexchange 質問で証明されているように、不安定性で悪名高いです。より良い方法はalpha、l1とl2のペナライザーの適切な組み合わせを決定できるように、交差検証することです。

  • 相互検証を行う別の方法は、キャレットの train( ... method='glmnet')

  • そして最後に、詳細を知るための最良の方法cv.glmnetとそのデフォルトの方法glmnetは、もちろん?glmnetRのコンソールにあります)))


素敵な答え。.. CVを複数回実行し、サンプリングを考慮してエラー曲線を平均する(cv.glmnetを参照)ことも価値があります。
user20650

@sergeybushmanovとても便利です!
森林生態学者2016年

こんにちは、私はこれが古い投稿であることを知っていますが、あなたに質問をしたかったのです。モデルの出力は係数の統計的有意性について何も言わないので、それらが有意であるかどうかをどのように判断しますか?
Jun Jang

@JunJang「係数には統計的有意性はありません」は、私ではなく、パッケージの作成者からの声明です。このステートメントは、パッケージの作者の本の1つにも、パッケージのビネットにも、はっきりとは覚えていません。そのような場合、係数を有意であるかどうかではなく、相互検証を通じてターゲットを説明する際に「有用」であるか、そうでないと言います。
セルゲイブッシュマノフ2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.