R Elasticnet回归(glmnet)预测测试数据中所有观测值相同

R Elasticnet回归(glmnet)预测测试数据中所有观测值相同,r,glmnet,R,Glmnet,我正在使用本教程在我自己的数据上尝试ridge、lasso和elastic net回归。但是,我得到的所有行的预测值都是相同的,这不可能是真的,因此我也得到了相同的拟合和mse值 如果有比我更懂R的人能看看我的代码,并指出我做错了什么,我会非常感激。这是: library (glmnet) require(caTools) set.seed(111) new_flat <- fread('RED_SAMPLED_DATA_WITH_HEADERS.csv', header=TRUE,

我正在使用本教程在我自己的数据上尝试ridge、lasso和elastic net回归。但是,我得到的所有行的预测值都是相同的,这不可能是真的,因此我也得到了相同的拟合和mse值

如果有比我更懂R的人能看看我的代码,并指出我做错了什么,我会非常感激。这是:

library (glmnet)
require(caTools)
set.seed(111) 

new_flat <- fread('RED_SAMPLED_DATA_WITH_HEADERS.csv', header=TRUE, sep = ',') 
sample = sample.split(new_flat$SUBSCRIPTION_ID, SplitRatio = .80)
train = subset(new_flat, sample == TRUE)
test = subset(new_flat, sample == FALSE)

x=model.matrix(c201512_TOTAL_MARGIN~.-SUBSCRIPTION_ID,data=train) 
y=train$c201512_TOTAL_MARGIN

x1=model.matrix(c201512_TOTAL_MARGIN~.-SUBSCRIPTION_ID,data=test) 
y1=test$c201512_TOTAL_MARGIN



# Fit models:
fit.lasso <- glmnet(x, y, family="gaussian", alpha=1)
fit.ridge <- glmnet(x, y, family="gaussian", alpha=0)
fit.elnet <- glmnet(x, y, family="gaussian", alpha=.5)


# 10-fold Cross validation for each alpha = 0, 0.1, ... , 0.9, 1.0
fit.lasso.cv <- cv.glmnet(x, y, type.measure="mse", alpha=1, 
                          family="gaussian")
fit.ridge.cv <- cv.glmnet(x, y, type.measure="mse", alpha=0,
                          family="gaussian")
fit.elnet.cv <- cv.glmnet(x, y, type.measure="mse", alpha=.5,
                          family="gaussian")

for (i in 0:10) {
  assign(paste("fit", i, sep=""), cv.glmnet(x, y, type.measure="mse", 
                                            alpha=i/10,family="gaussian"))
}


# Plot solution paths:
par(mfrow=c(3,2))
# For plotting options, type '?plot.glmnet' in R console
plot(fit.lasso, xvar="lambda")
plot(fit10, main="LASSO")

plot(fit.ridge, xvar="lambda")
plot(fit0, main="Ridge")

plot(fit.elnet, xvar="lambda")
plot(fit5, main="Elastic Net")


yhat0 <- predict(fit0, s=fit0$lambda.1se, newx=x1)
yhat1 <- predict(fit1, s=fit1$lambda.1se, newx=x1)
yhat2 <- predict(fit2, s=fit2$lambda.1se, newx=x1)
yhat3 <- predict(fit3, s=fit3$lambda.1se, newx=x1)
yhat4 <- predict(fit4, s=fit4$lambda.1se, newx=x1)
yhat5 <- predict(fit5, s=fit5$lambda.1se, newx=x1)
yhat6 <- predict(fit6, s=fit6$lambda.1se, newx=x1)
yhat7 <- predict(fit7, s=fit7$lambda.1se, newx=x1)
yhat8 <- predict(fit8, s=fit8$lambda.1se, newx=x1)
yhat9 <- predict(fit9, s=fit9$lambda.1se, newx=x1)
yhat10 <- predict(fit10, s=fit10$lambda.1se, newx=x1)

mse0 <- mean((y1 - yhat0)^2)
mse1 <- mean((y1 - yhat1)^2)
mse2 <- mean((y1 - yhat2)^2)
mse3 <- mean((y1 - yhat3)^2)
mse4 <- mean((y1 - yhat4)^2)
mse5 <- mean((y1 - yhat5)^2)
mse6 <- mean((y1 - yhat6)^2)
mse7 <- mean((y1 - yhat7)^2)
mse8 <- mean((y1 - yhat8)^2)
mse9 <- mean((y1 - yhat9)^2)
mse10 <- mean((y1 - yhat10)^2)
库(glmnet)
需要(caTools)
种子(111)

新建平面尝试在预测函数中使用
s=fit0$lambda.min
而不是
s=fit0$lambda.1se
。套索上的系数很快下降到0,因此
s=fit0$lambda.1se
可能是一个过高的惩罚因子。lambda确定系数的惩罚权重,如果太高,系数将为零,预测值将等于截距,截距是因变量的平均值,例如Y=0.48+0*X

,对于每个yhat中的所有行,我得到48.1531,所有mse的值为1003.14。不幸的是,我无法共享数据,但是我可以共享代码中提到的绘图。每个模型的系数输出是什么?如果因变量和自变量之间的相关性较差,lasso的系数可以减少到0,ridge的系数可以减少到接近0,这将返回每行因变量的平均值。你能提供一个小样本的数据吗?你能提供你的模型返回的系数吗?您的从属风险值48.1531的平均值是否也有可能<代码>平均值(c201512总利润)
你是对的,回答的平均值是48.1531。你能解释一下这意味着什么吗?这意味着lambda在你的预测函数中太高了:详见这里:你是对的,一旦我改为lambda.min,我确实会得到一些预测。我的原始数据被人为地放大和展平了。i、 为了得到更多的预测变量,我将分类列转换为数值列,从而得到一个相当稀疏的3-4k列矩阵。你认为这可能是原因吗?是的,这可能是原因,因为我认为它削弱了因变量和自变量之间的相关性。我也可能只是简单地说,你的独立var并不能很好地预测你的相依var。你必须记住,弹性网络型回归是减少最小可能性(或OLS)损失函数和减少系数大小之间的平衡。如果X与Y的相关性不强,则即使在较小的lambda水平下,系数也可以减小到0或接近0