如何解决套索回归glmnet-有关输入数据的错误
我尝试使用glmnet()拟合套索回归模型。由于我以前从未使用过Lasso回归,因此我尝试与教程相处,但是在应用模型时,总是会出现以下错误:
Error in lognet(x,is.sparse,ix,jx,y,weights,offset,alpha,nobs,:
one multinomial or binomial class has 1 or 0 observations; not allowed
使用来自这个问题(https://stats.stackexchange.com/questions/72251/an-example-lasso-regression-using-glmnet-for-binary-outcome)的数据集,似乎因变量y必须仅由0和1组成。每当我将y的观察值之一设置为2或任何值时而不是0或1,则会导致此错误。
这是我的代码:
lambdas_to_try <- 10^seq(-3,5,length.out = 100)
x_vars <- as.matrix(data.frame(data$x1,data$x2,data$x3))
lasso_cv <- cv.glmnet(x_vars,y=as.factor(data$y),alpha = 1,lambda = lambdas_to_try,family = "binomial",nfolds = 10)
x_vars_2 <- model.matrix(data$y ~ data$x1 + data$x2 + data$x3)[,-1]
lasso_cv_2 <- cv.glmnet(x_vars,nfolds = 10)
这是我的数据集的样子:
问题是,在我的数据中,y变量表示犯罪数量,因此它具有0到1000之间的整数值。我不能仅将值设置为0到1。使用这些数据进行套索回归如何工作?
解决方法
正如@Gregor指出的那样,您拥有的是计数数据,它应该是回归而不是分类。使用示例数据集,这是实现它的方法:
library(MASS)
library(glmnet)
data(Insurance)
您的响应变量应为数字:
str(Insurance)
'data.frame': 64 obs. of 5 variables:
$ District: Factor w/ 4 levels "1","2","3","4": 1 1 1 1 1 1 1 1 1 1 ...
$ Group : Ord.factor w/ 4 levels "<1l"<"1-1.5l"<..: 1 1 1 1 2 2 2 2 3 3 ...
$ Age : Ord.factor w/ 4 levels "<25"<"25-29"<..: 1 2 3 4 1 2 3 4 1 2 ...
$ Holders : int 197 264 246 1680 284 536 696 3582 133 286 ...
$ Claims : int 38 35 20 156 63 84 89 400 19 52 ...
现在我们设置预测变量和响应变量:
y = Insurance$Claims
X = model.matrix(Claims ~ .,data=Insurance)
运行简历以找到最佳的lambda(如果您不了解L1范数):
fit = cv.glmnet(x=X,y=y,family="poisson")
pred = predict(fit,X,s=fit$lambda.1se)
预测是对数刻度的,因此可以与您的实际比较
plot(log(y),pred,xlab="log (actual)",ylab="log (predicted)")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。