Cv.glmnet переопределяет данные, используя полную лямбда-последовательность?

cv.glmnet используется в большинстве исследовательских работ и компаний. При создании аналогичной функции, такой как cv.glmnet для glmnet.cr (похожий пакет, который реализует лассо для порядковой регрессии отношения продолжения), я столкнулся с этой проблемой в cv.glmnet.

`cv.glmnet` first fits the model:



glmnet.object = glmnet(x, y, weights = weights, offset = offset, 
                     lambda = lambda, ...)

После того, как объект glmnet создан с полными данными, следующий шаг выглядит следующим образом: извлекается lambda из полной подогнанной модели.

lambda = glmnet.object$lambda

Теперь они следят за тем, чтобы количество сгибов было больше 3.

if (nfolds < 3) 
stop("nfolds must be bigger than 3; nfolds=10 recommended")

Список создается для хранения результатов перекрестной проверки.

outlist = as.list(seq(nfolds))

for loop выполняется для соответствия различным частям данных в соответствии с теорией перекрестной проверки.

  for (i in seq(nfolds)) {
    which = foldid == i
    if (is.matrix(y)) 
      y_sub = y[!which, ]
    else y_sub = y[!which]
    if (is.offset) 
      offset_sub = as.matrix(offset)[!which, ]
    else offset_sub = NULL
#using the lambdas for the complete data 
    outlist[[i]] = glmnet(x[!which, , drop = FALSE], 
                          y_sub, lambda = lambda, offset = offset_sub, 
                          weights = weights[!which], ...)
  }
}

Итак, что происходит. После подгонки данных к полным данным выполняется перекрестная проверка с использованием лямбда-выражений из полных данных. Может ли кто-нибудь сказать мне, как это может быть не подгонка данных? При перекрестной проверке мы хотим, чтобы у модели не было информации об оставшейся части данных. Но cv.glmnet жульничает!


person Chamberlain Foncha    schedule 17.02.2014    source источник
comment
Я подозреваю, что это следует обсудить на stats.stackexchange.com.   -  person Roland    schedule 17.02.2014
comment
Этот комментарий относится к последовательности лямбда-значений для полного набора данных. Отдельные модели перекрестной проверки по-прежнему подгоняются к подмножеству данных.   -  person Hong Ooi    schedule 20.02.2014
comment
lambdas видели полные данные, что неверно. lambda является функцией данных, а не данные являются функцией lambda.   -  person Chamberlain Foncha    schedule 20.02.2014
comment
Последовательность шагов такова: (1) сгенерировать полный путь решения для всех значений лямбда на основе полных данных (2) сделать CV (2а) подобрать полный путь решения для каждой складки (2b) вычислить прогнозы для данных проверки (слева- out data) для каждой складки и для каждой лямбды (2c) вычислить меру ошибки для прогнозов и агрегировать эти складки. Теперь у вас есть мера ошибки предсказания для каждой лямбды. (3) выбрать лямбду, для которой ошибка CV была минимальной, и указать коэффициенты для полных данных, подходящих для этой лямбды.   -  person fabians    schedule 20.02.2014
comment
Спасибо @fabians за шаги. Шаг (1) как раз и является проблемой. Почему вы будете использовать полные данные, чтобы получить представление о полном пути решения?   -  person Chamberlain Foncha    schedule 20.02.2014
comment
Потому что, конечно, в конечном итоге решение должно исходить из оценки, основанной на полном наборе данных (в противном случае вы выбрасываете информацию). Смысл CV в том, чтобы НЕ использовать полный набор данных для нахождения значения параметра настройки, чтобы избежать переобучения. Вот почему значение параметра настройки лямбда определяется на основе ошибок предсказания из CV, т. е. из ошибок данных, которые не использовались для подгонки соответствующих моделей CV.   -  person fabians    schedule 20.02.2014
comment
Я подозреваю, что часть путаницы может быть (извините, если я ошибаюсь), что вы не совсем понимаете концепцию пути решения для моделей LARS/LASSO и т.д....?   -  person fabians    schedule 20.02.2014
comment
Конечно, CV должен увидеть, насколько хорошо данные предсказывают и независимый набор данных. При получении полного лямбда-пути из полных данных с использованием этого полного лямбда-пути в качестве источника лямбда для дополнительных данных оставшаяся часть не зависит от подходящей части. Почему, потому что они оба видели лямбду. Ваш шаг (2a) говорит, что подходит полный путь решения для каждой складки, и каждая лямбда это лямбда из полных данных или дополнительных данных?. Если это из полных данных, то повторюсь, это не кажется правильным. Если это из дополнительных данных, почему они в первую очередь соответствовали лямбде полных данных?   -  person Chamberlain Foncha    schedule 20.02.2014
comment
Как я и подозревал, я думаю, что ваша путаница связана с тем, что концепция пути решения для ЛАРС/ЛАССО/и т. д. кажется вам неясной: каждая подобная модель имеет пути коэффициентов, которые описывают, как решение изменяется от самого строгого наказания. (приводит все коэффициенты к 0) к самому мягкому наказанию (соответствует решению MaxLik/OLS). Проблема заключается в том, какую точку на этих путях использовать, то есть какую лямбду.   -  person fabians    schedule 20.02.2014
comment
Чтобы найти диапазон лямбд, для которых в ваших данных происходит что-то интересное, вы должны сначала просмотреть полные данные, поскольку нет смысла вычислять те части путей решения, где все коэффициенты уже равны нулю или все коэффициенты уже соответствуют решению MaxLik/OLS. Это помогает?   -  person fabians    schedule 20.02.2014
comment
опубликовано для @Tyler: Чемберлен, вам когда-нибудь удавалось создать glmnet.cr, эквивалентный cv.glmnet? Если да, то есть ли он в открытом доступе?   -  person Ben Bolker    schedule 30.09.2016
comment
лямбда не является фактическими коэффициентами отдельных моделей. Это просто (последовательность) наказания за регуляризацию. Следовательно, нет переоснащения.   -  person smci    schedule 10.02.2017


Ответы (2)


Вы правы в том, что использование перекрестно проверенной меры соответствия для выбора «наилучшего» значения параметра настройки вносит оптимистическую предвзятость в эту меру, если рассматривать ее как оценку вневыборочной производительности модели с этим « лучшее значение. Любая статистика имеет выборочную дисперсию. Но разговор о переобучении, по-видимому, подразумевает, что оптимизация параметра настройки приводит к ухудшению производительности вне выборки по сравнению с поддержанием ее на предварительно заданном значении (скажем, нуле). Это необычно, по моему опыту оптимизация очень ограничена (по одному параметру) по сравнению со многими другими методами выбора признаков. В любом случае рекомендуется проверить всю процедуру, включая выбор параметра настройки, на наборе задержек, с помощью внешнего цикла перекрестной проверки или путем начальной загрузки. См. раздел Перекрестная проверка (обобщение ошибок) после выбора модели.

person Scortchi - Reinstate Monica    schedule 30.01.2015

Нет, это не переобучение.

cv.glmnet() создает полный путь решения для лямбда-последовательности. Но вы никогда не выбираете последнюю запись на этом пути. Обычно вы выбираете lambda==lambda.1se (или lambda.min) , как сказал @Fabians:

lambda==lambda.min : is the lambda-value where cvm is minimized

lambda==lambda.1se : is the lambda-value where (cvm-cvsd)=cvlow is minimized. This is your optimal lambda

См. документацию для cv.glmnet() и coef(..., s='lambda.1se')

person smci    schedule 10.02.2017