Извлеките подогнанные значения, остатки и сводную статистику из cv.glmnet - PullRequest
0 голосов
/ 05 апреля 2020

Интересно , как я могу извлечь подогнанные значения, остатки и сводную статистику из объекта cv.gl mnet для спецификаций c lambda (например, "lambda.1se"). Предположим, только у меня есть доступ к объекту cv.gl mnet, а не к данным обучения напрямую. Вот пример:

data(iris)
Inx <- sample(nrow(iris),100)
iris$Species <- factor(iris$Species)

train_data <- iris[Inx, ]
test_data <- iris[-Inx,]

Formula <- "Sepal.Length ~ Sepal.Width + Petal.Length + Species:Petal.Width + 
            Sepal.Width:Petal.Length +  Species +  splines::bs(Petal.Width, df = 2, 
            degree = 2)"

------- перекрестная проверка glm --------------

ModelMatrix <- predict(caret::dummyVars(Formula, train_data, fullRank = T,  
                       sep = ""), train_data)
cvglm <- glmnet::cv.glmnet(x = ModelMatrix,
                           y = train_data$Sepal.Length, nfolds = 4, keep = TRUE,  
                           alpha = 1, parallel = F, type.measure = 'mse') 

Спасибо за любые предложения.

Ответы [ 3 ]

0 голосов
/ 06 апреля 2020

Объект cv.gl mnet не сохраняет непосредственно установленные значения или остатки. Предполагая, что у вас есть хотя бы какая-то матрица испытаний или проверок (test_df, преобразуемая в test_matrix), вы можете рассчитать как подгонянные значения, так и невязки. Аргумент s функции predict позволяет получить доступ к бета-версиям для конкретной лямбды.

fitted_values <- predict(cvglm, test_matrix, s = 'lambda.1se')

residuals <- test_df$actual_values - fitted_values

Для сводной статистики вы, вероятно, хотите получить доступ к параметру cvglm$cvm. Это мера ошибки перекрестной проверки, используемая для определения, какая лямбда производит лучшую модель. В исходном сообщении для параметра type.measure установлено значение mse, поэтому этот вектор будет среднеквадратичным средним значением, произведенным для каждого уровня лямбды.

Вот как найти значение для lambda.1se:

cvglm$cvm[cvglm$lambda == cvglm$lambda.1se]

По другим вашим комментариям может показаться, что вам может понадобиться коэффициент отклонения, который доступен в векторе cvglm$glmnet.fit$dev.ratio .

cvglm$glmnet.fit$dev.ratio[cvglm$lambda == cvglm$lambda.1se]

Из документации по dev.ratio:

Доля (нулевого) отклонения, объясненная (для "e lnet", это R- квадрат). Расчеты отклонения включают веса, если они присутствуют в модели. Отклонение определяется как 2 * (loglike_sat - loglike), где loglike_sat - логарифмическая вероятность для насыщенной модели (модели со свободным параметром на наблюдение). Следовательно, dev.ratio = 1-dev / nulldev.

0 голосов
/ 06 апреля 2020

Теперь я понимаю ваш вопрос, вы устанавливаете keep = TRUE и ожидаете найти подходящие значения. Итак, давайте запустим это:

cvglm <- glmnet::cv.glmnet(x = ModelMatrix,
                           y = train_data$Sepal.Length, nfolds = 4, keep = TRUE,  
                           alpha = 1, parallel = F, type.measure = 'mse') 

Здесь есть подогнанные значения:

dim(cvglm$fit.preval)
[1] 100 100

Это для 1 столбца для каждого лямбда-значения. Однако это

a prevalidated массив возвращается, содержащий подогнанные значения для каждого наблюдения и каждого значения 'lambda'. Это означает, что эти подгонки вычисляются с этим наблюдением, а остальная часть его сгиба опускается

Во время CV эти значения являются прогнозируемыми значениями для неподходящего сгиба и используются для вычисления mse. Так, например, мы можем получить обратно проверенную mse для 100-го значения протестированной лямбды:

mean((cvglm$fit.preval[,100] - train_data$Sepal.Length)^2)
[1] 0.1072564

cvglm$cvm[100]
[1] 0.1072564

Для обычной сводной статистики, которую вы получаете из summary (lm ()), вам нужно работать с что находится в cvglm $ gl mnet, но не имеет удобной функции. Это будет то, на что @ColinH указал в ответе, то есть рассчитать их несколько вручную. Данные обучения не сохраняются в объекте.

0 голосов
/ 05 апреля 2020

Подходящие значения:

cvglm$glmnet.fit

Call:  glmnet(x = ModelMatrix, y = train_data$Sepal.Length, parallel = F,      alpha = 1) 

      Df   %Dev    Lambda
 [1,]  0 0.0000 7.047e-01
 [2,]  1 0.1341 6.421e-01
 [3,]  1 0.2454 5.851e-01
 [4,]  1 0.3378 5.331e-01
 [5,]  1 0.4146 4.857e-01
 [6,]  1 0.4783 4.426e-01
 ...omitted

Резюме:

do.call( 'cbind', list(lambda = cvglm$lambda, mean = cvglm$cvm, sd = cvglm$cvsd, cvup = cvglm$cvup, cvlo = cvglm$cvlo))       

            lambda      mean          sd      cvup       cvlo
 [1,] 0.7047388085 0.6245721 0.049917703 0.6744898 0.57465442
 [2,] 0.6421317551 0.5526067 0.058082258 0.6106889 0.49452443
 [3,] 0.5850865398 0.4815325 0.053453517 0.5349860 0.42807898
 [4,] 0.5331090641 0.4225556 0.049193377 0.4717490 0.37336222
 [5,] 0.4857491242 0.3736194 0.045278477 0.4188979 0.32834093
 ...omitted
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...