2016-07-15 3 views
1

Это странная проблема, что я не уверен, что происходит. Когда я использую cv.glmnet, я ввожу последовательность лямбда, но иногда она, похоже, дает мне другую последовательность в модели. Я пытаюсь найти среднее значение MSE vs лямбда-кривой из кучки k-fold-трасс, поэтому это вызывает много проблем для меня. Прямо сейчас, у меня есть:glmnet дает разные значения лямбда, чем введенные

ridge = function(trax, tray, lambda, folds) 
{ 
    folds_ids = array(dim=length(tray)) 
    for (f in 1:length(folds)) 
    { 
    folds_ids[folds[[f]]] = f 
    } 
    cvfit = cv.glmnet(trax, 
       tray, 
       alpha=0, 
       lambda=lambda, 
       family='binomial', 
       foldid=folds_ids, 
       parallel=TRUE) 
    return(cvfit) 
} 
ridge_lambda = seq(5e-1,1e-5,length=100) 
ridge_result = ridge(trax=training_featr, 
        tray=training_class, 
        lam = ridge_lambda, 
        folds = kfolds) 

Прямо сейчас, ridge_result $ лямбда и ridge_result $ МВО иногда дают векторы, которые являются 99 элементов вместо 100. Я понятия не имею, почему. Я ценю любую помощь, которую я могу получить.

ответ

0

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

  1. Складки выбираются случайным образом каждый раз, что объясняет, почему вы видите это иногда, а не другие.
  2. Из glmnet vignette, «программа останавливается раньше, если`% DEV% не меняет sufficently от одного лямбда к следующему (обычно ближе к концу пути.)»

Объединить эти две особенности вы получите результат, который вы видите.

На практике я бы рекомендовал предоставить и nlambda вместо вашей собственной серии, так как это рекомендуют авторы, так как cv.glmnet будет генерировать ряды лямбда в масштабе журнала для вас.