交差検証を使用した、glmnetパッケージの逸脱度の正確な定義?


11

現在の研究では、Rのglmnetパッケージを介してLassoメソッドを二項従属変数に使用しています。

glmnetでは、交差検証によって最適なラムダが見つかり、結果のモデルは、誤分類エラーや逸脱などのさまざまな測定値と比較できます。

私の質問:glmnetで逸脱はどのように正確に定義されていますか?どのように計算されますか?

(フリードマン他による対応する論文「座標降下による一般化線形モデルの正規化パス」で私はcv.glmnetで使用された逸脱に関するこのコメントのみを見つけます:「平均逸脱(マイナス左の対数尤度の2倍)データ)」(p。17))。


これは、で使用されている逸脱度と同じですglm(または、少なくともそうでなければなりません-私が認識している逸脱度の定義は1つしかありません)。
Hong Ooi

はい、しかし、私の最初の投稿の引用に示されているように、彼らは何らかの方法で拡張すると思います。私が理解している逸脱は2つのモデルのパフォーマンスを比較できますが、作成者は交差検証の除外されたデータをどのように含めるのですか?「除外されたデータの対数尤度のマイナス2倍」はどのように意味がありますか?
Jo Wmann、2014年

1
さてさて、ありがとう、今私はそれを理解したと思います:逸脱は-2 * log-likelihoodまたは(2 * log-likelihood)/(log-likelihood of the null-model)として定義されます。これは、ラムダの異なる値に対するそれらの逸脱度が間隔0.2を超えない理由も説明します。モデルは、交差検定のk-1分割で推定され、残りの分割に適用されます。残りのフォールドのアプリケーションでは、対数尤度スコアが計算されます。これはk回繰り返され、上記で定義された逸脱度測定の各ラムダのk結果の平均が返されます。
Jo Wmann、2014年

1
はい、常に各ラムダのすべてのフォールドで平均化されます。逸脱度を直接使用することも、nullモデルに対する比率を使用することもできると思います。これはおそらく切片のみのモデルです。2つの落とし穴があります:a)フォールドには正確に同じ数のデータポイントがない場合がありますb)各フォールドには異なるデータが(当然)含まれています。修正するには(a)逸脱を、選択したフォールドのデータポイントの数で除算します。(a)と(b)を同時に修正するには、比率アプローチを使用します。逸脱モデルでは、データセットが各モデルで同じであると想定しています(MAP推定では分母を無視するのと同じ考え方です)。
Cagdas Ozgenc 2014年

1
ただし、ひだが画像に入ると、分母はひだ全体で同じではありません。したがって、比率は分母を取り消すことでそれを処理します。しかし、フォールドで平均すると、これがどれほど大きな問題であるかはわかりません。
Cagdas Ozgenc 2014年

回答:


8

フリードマン、Hastie、およびTibshirani(2010) 、二項モデルのずれは、相互検証の目的のために、のように計算されます

除外されたデータの対数尤度のマイナス2倍(p.17)

これは(2ページと5ページの)のドキュメントでglmnet引用されている論文であることを考えると、おそらくパッケージで使用されている式です。

そして実際、functionのソースコードでcvlognetは、応答の逸脱度残差は次のように計算されます。

-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))

どこpredmatに単純に

predict(glmnet.object,x,lambda=lambda)

encolsing cv.glmnet関数から渡されます。私はJStatSoftのページで入手可能なソースコードを使用しましたが、そのコードがどれほど最新かわかりません。このパッケージのコードは驚くほどシンプルで読みやすいものです。と入力すると、いつでも自分のことを確認できますglmnet:::cv.glmnet


1

@shadowtalkerの回答に加えて、パッケージglmnetを使用していたときに、相互検証の逸脱がどういうわけか正規化されているように感じます。

library(glmnet)
data(BinomialExample)

fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value

# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706

# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))

# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637

Ref:逸脱Rドキュメント

除算すると

head(deviance(fit$glmnet.fit)) / length(y))

結果は

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

これは、fit $ cvmに非常に近いものです。

これは、@ Hong Ooiからのコメントがこの質問について言ったことかもしれません:

/programming/43468665/poisson-deviance-glmnet

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