cv.glmnet(RでのLASSO回帰)との相互検証を行う方法は?


10

Rでglmnetを使用してLASSOモデルを適切にトレーニングおよびテストする方法を知りたいのですが?

  • 具体的には、外部テストデータセットがないために交差検証(または他の同様のアプローチ)を使用してLASSOモデルをテストする必要がある場合に、どうすればよいのかと思います。

私のシナリオを分解してみましょう:

glmnetモデルに通知してトレーニングするデータセットは1つだけです。その結果、モデルをテストする方法を生成するために、データを分割するために交差検証を使用する必要があります。

私はすでに使用cv.glmnetしていますが、パッケージの詳細によると:

glmnetのk分割交差検証を実行し、プロットを生成して、ラムダの値を返します。

  • 交差検証はcv.glmnet、最良のラムダを選択するためだけに実行されますか、それともより一般的な交差検証手順としても機能していますか?

    • 言い換えれば、モデルを「テスト」するために別の相互検証ステップを実行する必要がありますか?

私は「そうです」という前提で作業しています。

その場合、モデルをクロス検証する方法はありcv.glmnetますか?

  • 手動で行う必要がありますか、それともこのcaret関数はglmnetモデルに役立ちますか?

  • ?私は、クロスバリデーションの二つの同心「ループ」を使用しています...ドゥ私は経由CVの「内部ループ」を使用してcv.glmnet最良のラムダ値を決定するためにの各k個のk倍クロスバリデーション処理の「外部ループ」のひだ?

    • すでに相互検証しているcv.glmnetモデルの相互検証を行う場合cv.glmnet、交差検証のその他の「外部ループ」の各フォールド内の各モデルから(「最良の」ラムダ値から)「最良の」モデルを分離するにはどうすればよいですか?

      • 注:「最良の」モデルは、最小値の1 SE以内のMSEを生成するラムダに関連付けられたモデルとして定義しています。これはモデル$lambda.1se内のcv.glmnetです。

環境:

木の直径( "D")、D ^ 2、および種( "factor(SPEC)")に基づいて樹齢( "age")を予測しようとしています。[結果の方程式:Age ~ D + factor(SPEC) + D^2]。私は約5万行のデータを持っていますが、データは縦方向であり(時間を通じて個人を追跡します)、約65種で構成されています。


1
コメントせずに終了することを投票した人のために:それは役に立たない...コメントであなたの問題が何であるかを知らせてください、そして私はそれを修正しようとします。
森林生態学者2016年

1
彼らはそれをCrossValidatedに移行することを決議することを決議することに投票していません。私はそれに投票を追加しました。
Hack-R

@theforestecologist:[閉じる]ボタンをクリックすると、閉鎖/移行の理由が表示されます。
DWin

質問してくれてありがとう、私はまさにこの質問をしました。また、多変量Yがあるため、キャレットを使用できません。ただし、ソースコードを調べて、追加のCVが必要ないことを確認しましたか?ソースコードを追跡するのは非常に難しい場合があります。
qoheleth 2017年

回答:


3

最適なラムダを選択するためだけにcv.glmnetで交差検証が実行されますか、それともより一般的な交差検証手順として機能しますか?

交差検定で必要なほぼすべてのことを行います。たとえばlambda、データの可能な値に適合させ、最適なモデルを選択し、最後に適切なパラメーターでモデルをトレーニングします。

たとえば、返されたオブジェクトでは::

cvm交差検定誤差の平均です。 cvsd推定標準偏差です。

他の戻り値と同様に、これらはテストセットで計算されます。最後に、

glmnet.fit すべてのデータ(トレーニング+テスト)でトレーニングされたモデルに最適なパラメーターを指定します。

手動で行う必要がありますか、それともキャレット関数はglmnetモデルに役立ちますか?

これを手動で行う必要はありません。「Caret」は非常に便利で、同じ構文の他のすべてのモデルで機能するため、私のお気に入りのパッケージの1つです。私自身ではcaretなく、頻繁に使用していますcv.glmnet。ただし、シナリオでは基本的に同じです。

相互検証の同心円状の2つの「ループ」を使用しますか?cv.glmnetを介してCVの「内部ループ」を使用して、k分割の「外部ループ」のk分割ごとに最適なラムダ値を決定しますか相互検証処理?

これを行うことができ、この概念は、モデル選択のためのネストされた交差検証のネストされた交差検証のアイデアに非常に似ています。

すでに相互検証しているcv.glmnetモデルの相互検証を行う場合、「外部」ループの各フォールド内の各cv.glmnetモデルから(「最良の」ラムダ値から)「最良」のモデルを分離する方法"相互検証の?

トレーニングデータを生成するループを実行し、トレーニングデータに対してテストデータを実行cv.glmnetし、モデルglmnet.fitを使用してテストデータを予測するだけです。


@discupulus:ありがとう。そのための何らかの証拠を提供できますか?(つまり、それについて説明してください)。また、あなたの答えを考えると、それは、データのパフォーマンスメトリックを報告するために、さらなる検証プロセスが不要であることを意味しますか?(lambda.1seケースのMSEを最終的なモデルパフォーマンスとして簡単に報告できますか?)
森林生態学者2016年

はい、それ以上の相互検証は必要ありません。証拠cv.glmnetとして、関数のソースコードをRオープンソースと同様に見ることができます。cv.glmnetコンソールに入力するだけです。
弟子

3
@discipulus。Trevor Hastieにメールで「cv.glmnet(R実装)はラムダを選択するためにCVのみを行うのですか?それとも、選択されたラムダを検証するために外部CVも行いますか?言い換えれば、選択したラムダを検証しますか?」そして、彼は(かなり早く)「はい、ラムダを選ぶだけです」と答えました。これは、内部CVのみを実行することを意味すると解釈し、独自の外部CVをコーディングする必要があります。
qoheleth 2017

@theforestecologist私は交差検証についてもっと学び、あなたのポストを教育的に見つけようとしています。cv.glmnetがより一般的な相互検証手順としても機能しているという意味がわかりません。選択できる唯一のパラメータはラムダだと思いました-交差検証のどの外層が存在しますか?返信いただければ幸いです。ありがとう!
user2450223
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.