Могу ли я получить объект glm из вывода gl mnet? - PullRequest
0 голосов
/ 05 апреля 2020

Я использовал gl mnet, чтобы получить регрессию гребня (то есть нормализовано L2). Logisti * Модель 1019 * -

ridge.model <- glmnet(x, y, alpha = 0, family = "binomial", lambda = bestlam)

Теперь я хочу найти частоту ошибок теста при помощи 10-кратной перекрестной проверки , Это можно сделать с помощью cv.glm как такового -

fit_10CV<- glm(good ~ ., family = binomial, data = winedata)
fit_10CV.cv.err =cv.glm(winedata ,fit_10CV, cost1, K = 10) # 10 fold CV

Но для этого требуется объект glm (в данном случае fit_10CV).

Но вывод glmnet glmnet объект, который cv.glm не может взять. Я чувствую, что я так близко, но слишком далеко, потому что glmnet дает мне регрессионную модель логистики c, в которой я нуждаюсь, но не дает мне форму (то есть как объект glm), которую я могу подключить к cv. glm, чтобы получить 10-кратную ошибку теста CV.

Любая помощь будет оценена!

Ответы [ 2 ]

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

Есть два способа сделать это:

url="https://raw.githubusercontent.com/stedy/Machine-Learning-with-R-datasets/master/winequality-white.csv"
winedata = read.csv(url)
winedata$good = factor(ifelse(winedata$quality>6,1,0))
winedata$quality = NULL

Сначала мы запускаем cv.gl mnet, он сохраняет только среднее значение se:

library(caret)
library(glmnet)

x = model.matrix(good ~ ., family = binomial, data = winedata)
cv_glmnet = cv.glmnet(x, winedata$good, family = "binomial", type.measure = "class",alpha=0,nfolds = 10)

Мы собираем Лямбда-тестирование, и мы используем каретку, чтобы сделать cv:

tr = trainControl(method="cv",number=10)
trGrid = data.frame(lambda=cv_glmnet$lambda,alpha=0)
cv_caret = train(good ~ .,data=winedata,
trControl = tr,tuneGrid=trGrid,family="binomial",method="glmnet")

. В каретке они измеряют Точность, и 1 - Точность - ошибка ошибочной классификации, которую вы имеете от cv.gl mnet. Мы собрали их вместе, и вы можете увидеть, что они очень похожи :

cv_caret$resample
    Accuracy     Kappa Resample
1  0.7975460 0.1987720   Fold09
2  0.8163265 0.3127844   Fold01
3  0.7918367 0.1631505   Fold02
4  0.8057260 0.2311448   Fold05
5  0.8061224 0.2777347   Fold04
6  0.7979592 0.1989498   Fold07
7  0.8081633 0.2759683   Fold10
8  0.8183673 0.3053742   Fold08
9  0.8102041 0.2474983   Fold03
10 0.7979592 0.1989498   Fold06
1 голос
/ 05 апреля 2020

Пакет glmnet предоставляет функцию cv.glmnet, которая выполняет перекрестную проверку для объектов gl mnet. Вот документация .

. Вы можете указать диапазон лямбда-значений для поиска (или вы можете позволить cv.glmnet выбрать эти значения). Затем cv.glmnet вычислит ошибку перекрестной проверки для всех этих лямбд. Затем вы можете выбрать cv-error для вашего предпочтительного лямбда-выбора.

Для ваших переменных это будет выглядеть так:

cvfit <- cv.glmnet(x, y, alpha = 0, family = "binomial", 
                   nfolds = 10, lambda = your_lambda_vector)

lambda_min_ind <- which(cvfit$lambda == cvfit$lambda.min)
cverr_min <- cvfit$cvm[lambda_min_ind]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...