R関数cv.glm(ライブラリ:ブート)は、一般化線形モデルの推定K分割交差検定予測誤差を計算し、デルタを返します。なげなわ回帰(ライブラリ:glmnet)にこの関数を使用することには意味がありますか?その場合、どのように実行できますか?glmnetライブラリは、交差検証を使用して最適な回転パラメーターを取得しますが、最終的なglmnet方程式を交差検証する例は見つかりませんでした。
R関数cv.glm(ライブラリ:ブート)は、一般化線形モデルの推定K分割交差検定予測誤差を計算し、デルタを返します。なげなわ回帰(ライブラリ:glmnet)にこの関数を使用することには意味がありますか?その場合、どのように実行できますか?glmnetライブラリは、交差検証を使用して最適な回転パラメーターを取得しますが、最終的なglmnet方程式を交差検証する例は見つかりませんでした。
回答:
で投げ縄のためにバニラのプレーン相互検証を行う方法の例glmnet
についてmtcars
のデータ・セット。
データセットをロードします。
機能(独立変数)を準備します。彼らはmatrix
クラスのはずです。df
含むカテゴリ変数をに変換する最も簡単な方法は、を使用することmatrix
ですmodel.matrix
。glmnet
注意してください。デフォルトでは切片がフィットするので、モデル行列から切片を取り除く方がよいでしょう。
応答を準備します(従属変数)。平均以上のmpg
効率の自動車( '1')と残りの非効率( '0')の自動車をコーディングしてみましょう。この変数を因数に変換します。
を介して交差検証を実行しますcv.glmnet
。それはあなたが求めたものであるalpha=1
デフォルトのglmnet
パラメーターからピックアップします:投げ縄回帰。
相互検証の出力を調べることにより、少なくとも2つの情報に関心がある可能性があります。
ラムダは、交差検証エラーを最小化します。glmnet
実際には2つのラムダを提供していますlambda.min
とlambda.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
は、もちろん?glmnet
Rのコンソールにあります)))