2016-11-22 42 views
1

我使用following教程對我自己的數據嘗試進行嶺,套索和彈性網絡迴歸。但是,我得到的預測值與所有不可能爲真的行相同,因此我也得到了相同的fit和mse值。Elasticnet迴歸(glmnet)預測測試數據中所有觀察結果的相同值

我真的很感激,如果有人比我更瞭解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) 

編輯:在代碼中的情節看起來像this

+0

對於每個我得到的所有行,我得到48.1531,所有mse的值都是1003.14。不幸的是,我不可能共享數據,但我可以分享代碼中提到的情節。 –

+0

每個模型的係數輸出是什麼?如果您的因變量和自變量之間的相關性較差,則套索的係數可以減小到0,而脊線的係數可以減小到接近0,這將返回每行的因變量的平均值。你也可以提供你的數據的一個小樣本? – MorganBall

+0

你能提供你的模型返回的係數嗎?你的依賴變種48.1531的平均值是多少? '意思是(c201512_TOTAL_MARGIN)' – MorganBall

回答

0

在你的預測功能使用s=fit0$lambda.min而非s=fit0$lambda.1se嘗試。你的係數非常快速地降到0,所以s=fit0$lambda.1se可能太高是一個懲罰因素。 lambda確定係數的懲罰權重,如果它太高,那麼係數將爲零,並且預測將等於截距,這是因變量的平均值。 Y = 0.48 + 0 * X

+0

你說得對,當我改爲lambda.min時,我確實得到了某種預測。 我的原始數據已被人爲拓寬和展平。即爲了獲得更多的預測變量,我將catagorical列轉化爲數值,這導致了一個相當稀疏的3-4k列矩陣。你認爲這可能是它的原因嗎? –

+0

是的,這可能是一個原因,因爲我想它削弱了依賴變量和自變量之間的相關性。我可能也只是簡單地說,你的獨立變量不是你的依賴變量的一個很好的預測因子。用彈性網絡類型迴歸你必須記住的是在減少最小似然(或OLS)損失函數和減小系數大小之間的平衡。如果X與Y非強相關,那麼即使在小的lambda水平下,係數也可以減小到0或接近0 – MorganBall

相關問題