我可以从 glmnet 的输出中获取 glm 对象吗?
Can I obtain a glm object from the output of glmnet?
我已经使用 glmnet 获得岭回归(即 L2 归一化)逻辑模型 -
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
为我提供了我需要的逻辑回归模型,但它没有提供我可以插入 [=28 的形式(即作为 glm 对象) =] 得到 10 折 CV 测试误差。
任何帮助将不胜感激!
glmnet
包提供了一个函数 cv.glmnet
来执行 glmnet 对象的交叉验证。这是 documentation.
您可以指定要搜索的 lambda 值范围(或者您可以让 cv.glmnet
选择这些值)。然后,cv.glmnet
将计算所有这些 lambda 的交叉验证错误。然后,您可以为您首选的 lambda 选择选择 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]
有两种方法可以做到这一点:
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.glmnet,它只保留均值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)
我们收集了经过测试的 lambda,并使用插入符号来生成 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.glmnet 得到的错误分类错误。我们把它们放在一起,你可以看到它们非常相似
library(ggplot2)
df = rbind(
data.frame(lambda=cv_glmnet$lambda,mean_error=cv_glmnet$cvm,method="cv.glmnet"),
data.frame(lambda=cv_caret$results$lambda,
mean_error=1-cv_caret$results$Accuracy,method="cv.caret")
)
ggplot(df,aes(x=log(lambda),y=mean_error,col=method)) + geom_point() +facet_wrap(~method) + theme_bw()
您可以从单个重采样中获取误差,以获得最佳模型:
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
我已经使用 glmnet 获得岭回归(即 L2 归一化)逻辑模型 -
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
为我提供了我需要的逻辑回归模型,但它没有提供我可以插入 [=28 的形式(即作为 glm 对象) =] 得到 10 折 CV 测试误差。
任何帮助将不胜感激!
glmnet
包提供了一个函数 cv.glmnet
来执行 glmnet 对象的交叉验证。这是 documentation.
您可以指定要搜索的 lambda 值范围(或者您可以让 cv.glmnet
选择这些值)。然后,cv.glmnet
将计算所有这些 lambda 的交叉验证错误。然后,您可以为您首选的 lambda 选择选择 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]
有两种方法可以做到这一点:
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.glmnet,它只保留均值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)
我们收集了经过测试的 lambda,并使用插入符号来生成 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.glmnet 得到的错误分类错误。我们把它们放在一起,你可以看到它们非常相似
library(ggplot2)
df = rbind(
data.frame(lambda=cv_glmnet$lambda,mean_error=cv_glmnet$cvm,method="cv.glmnet"),
data.frame(lambda=cv_caret$results$lambda,
mean_error=1-cv_caret$results$Accuracy,method="cv.caret")
)
ggplot(df,aes(x=log(lambda),y=mean_error,col=method)) + geom_point() +facet_wrap(~method) + theme_bw()
您可以从单个重采样中获取误差,以获得最佳模型:
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