Как сделать перекрестную проверку с помощью cv.glmnet (регрессия LASSO в R)?

10

Мне интересно, как правильно подойти к обучению и тестированию модели LASSO с использованием glmnet в R?

  • В частности, мне интересно, как это сделать, если отсутствие внешнего набора тестовых данных требует использования перекрестной проверки (или другого аналогичного подхода) для тестирования моей модели LASSO.

Позвольте мне разбить мой сценарий:

У меня есть только один набор данных для информирования и обучения моей модели glmnet. В результате мне придется использовать перекрестную проверку для разделения моих данных, чтобы также создать способ тестирования моей модели.

Я уже использую cv.glmnet, который в соответствии с деталями пакета :

Выполняет перекрестную проверку в k-кратном порядке для glmnet, создает график и возвращает значение для лямбды.

  • Проводится ли перекрестная проверка cv.glmnetпросто для того, чтобы выбрать лучшую лямбду, или она также служит более общей процедурой перекрестной проверки?

    • Другими словами, мне все еще нужно сделать еще один шаг перекрестной проверки, чтобы "проверить" мою модель?

Я работаю с предположением, что «да, я делаю».

В таком случае, как мне подойти к перекрестной проверке моей cv.glmnetмодели?

  • Нужно ли делать это вручную, или эта caretфункция полезна для моделей glmnet?

  • Использую ли я две концентрические "петли" перекрестной проверки? ... Использую ли я "внутреннюю петлю" CV через, cv.glmnetчтобы определить наилучшее значение лямбда в каждой из k сгибов "внешней петли" обработки перекрестной проверки k-кратных ?

    • Если я делаю перекрестную проверку моей уже перекрестной проверки cv.glmnetмодели, как мне отделить «лучшую» модель (от «лучшего» значения лямбда) от каждой cv.glmnetмодели в каждом сгибе моего «внешнего цикла» перекрестной проверки?

      • Примечание. Я определяю «лучшую» модель как модель, связанную с лямбдой, которая производит MSE в пределах 1 SE от минимума ... это $lambda.1seв cv.glmnetмодели.

Контекст:

Я пытаюсь предсказать возраст дерева («возраст») на основе диаметра дерева («D»), D ^ 2 и вида («фактор (SPEC)»). [полученное уравнение: Age ~ D + factor(SPEC) + D^2]. У меня есть ~ 50K строк данных, но данные являются продольными (отслеживает особи во времени) и состоят из ~ 65 видов.

theforestecologist
источник
1
Для тех, кто проголосовал за закрытие без комментариев: это бесполезно ... дайте мне знать, что ваша проблема в комментариях, и я постараюсь ее исправить.
лесничий
1
Они не голосуют за закрытие, они голосуют за перенос его в CrossValidated. Я просто добавил свой голос к этому.
Hack-R
@theforestecologist: нажав на кнопку «закрыть», вы сможете увидеть причины, которые приводятся для закрытия / миграции.
DWin
Спасибо за вопрос, у меня был именно этот вопрос. И я не могу использовать каретку, потому что у меня есть многовариантный Y. Но вы проверили исходный код и подтвердили, что дополнительное резюме не требуется? Исходный код может быть довольно сложным для подражания.
Кохелет

Ответы:

3

Проводится ли перекрестная проверка в cv.glmnet просто для выбора наилучшей лямбды или она также служит более общей процедурой перекрестной проверки?

Это делает почти все необходимое в перекрестной проверке. Например, он lambdaподбирает возможные значения данных, выбирает лучшую модель и, наконец, обучает модель соответствующим параметрам.

Например, в возвращаемом объекте ::

cvmсредняя перекрестная ошибка. cvsdрасчетное стандартное отклонение.

Как и другие возвращаемые значения, они рассчитываются на тестовом наборе. Наконец,

glmnet.fit дает модель, обученную по всем данным (обучение + тест) с лучшими параметрами.

Нужно ли делать это вручную или, возможно, функция каретки полезна для моделей glmnet?

Вам не нужно делать это вручную. «Caret» был бы очень полезен и является одним из моих любимых пакетов, потому что он работает для всех других моделей с таким же синтаксисом. Я сам часто использую, caretа не cv.glmnet. Тем не менее, в вашем сценарии это по сути то же самое.

Использую ли я две концентрические «петли» перекрестной проверки? ... Использую ли я «внутреннюю петлю» CV через cv.glmnet, чтобы определить наилучшее значение лямбды в каждой из k складок «внешней петли» из k-fold обработка перекрестной проверки?

Вы можете сделать это, и эта концепция очень похожа на идею Вложенной перекрестной проверки Вложенная перекрестная проверка для выбора модели .

Если я делаю перекрестную проверку моей уже перекрестной проверки модели cv.glmnet, как мне отделить «лучшую» модель (от «лучшего» лямбда-значения) от каждой модели cv.glmnet в каждом сгибе внешнего цикла? «перекрестной проверки?

Просто запустите цикл, в котором вы генерируете обучающие данные и тестируете данные, запускаемые cv.glmnetна обучающих данных, и используете модель glmnet.fitдля прогнозирования по тестовым данным.

Discipulus
источник
@discupulus: Спасибо. Не могли бы вы предоставить какое-то подтверждение этому? (то есть, проведите меня через это, пожалуйста). Кроме того, учитывая ваш ответ, означает ли это, что дальнейшие процессы перекрестной проверки не требуются для представления показателя производительности для данных? (Я мог бы просто сообщить о MSE в случае лямбда-1se как о моей окончательной производительности модели?)
forestecologist
Да, дополнительная перекрестная проверка не требуется. В качестве доказательства вы можете посмотреть исходный код cv.glmnetфункции с Rоткрытым исходным кодом. Просто введите cv.glmnetв консоли.
ученик
3
@discipulus. Я послал по электронной почте Trevor Hastie с вопросом: «cv.glmnet (реализация R) делает только CV для выбора лямбды? Или он также делает внешнее CV для проверки выбранной лямбды? Другими словами, нужно ли нам кодировать наше собственное внешнее CV, если мы хотите проверить выбранную лямбду? и он ответил (довольно быстро) «Да, просто чтобы выбрать лямбду», что, как я понимаю, означает, что это только внутреннее резюме, и нам придется кодировать наше собственное внешнее резюме.
Кохелет
@theforestecologist Я пытаюсь узнать больше о перекрестной проверке и найти ваш пост образовательным. Я не понимаю, что вы подразумеваете под cv.glmnet, который также служит более общей процедурой перекрестной проверки. Я думал, что единственный доступный параметр - это лямбда - какой внешний уровень перекрестной проверки существует? Был бы признателен, если бы вы могли ответить. Спасибо!
user2450223