2016-11-22 2 views
1

following 자습서를 사용하여 내 데이터에서 융기, 올가미 및 탄성 그루브 회귀 분석을 시도합니다. 그러나, 나는 사실 일 수없는 모든 행에 대해 예측 된 동일한 값을 얻습니다. 결과적으로 나는 동일한 적합 및 mse 값을 얻습니다.테스트 데이터의 모든 관측치에 대해 동일한 값을 예측하는 Elasticnet 회귀 분석 (glmnet)

R보다 knowledgable 누군가가 내 코드를 살펴보고 내가 잘못하고있는 것을 지적하면 정말 고마워 할 것입니다.

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) 

편집 : : 여기있다 코드의 줄거리는

+0

모든 yhat의 모든 행에 대해 48.1531을 얻으며 모든 mse의 값은 1003.14입니다. 불행하게도 데이터를 공유 할 수는 없지만 코드에 언급 된 내용을 공유 할 수는 있습니다. –

+0

각 모델의 계수 출력은 무엇입니까? 종속 변수와 독립 변수 간의 상관 관계가 낮 으면 올가미의 경우 0으로, 융기의 경우 0으로 줄여 각 행의 종속 변수의 평균을 반환 할 수 있습니다. 또한 데이터의 작은 샘플을 제공 할 수 있습니까? – MorganBall

+0

모델에서 반환 한 계수 만 공급할 수 있습니까? 또한 당신의 종속 변수의 평균은 48.1531입니다. 'mean (c201512_TOTAL_MARGIN)' – MorganBall

답변

0

this 같은 것은 당신의 예측 기능에 s=fit0$lambda.min보다는 s=fit0$lambda.1se를 사용해보십시오 보인다. 귀하의 계수는 올가미에서 0으로 매우 빠르게 떨어 지므로 s=fit0$lambda.1se은 너무 큰 불이익 요인 일 수 있습니다. 람다가 계수에 대한 벌칙의 가중치를 결정합니다. 계수가 너무 높으면 계수가 0이되고 예측값은 가로변 값과 같습니다. 즉, 예를 들어 종속 변수의 평균입니다. Y = 0.48 + 0 * X

+0

당신이 옳다면 나는 lambda.min으로 바꾼 후에 일종의 예측을 얻습니다. 원본 데이터가 인위적으로 확장되고 병합되었습니다. 즉 예측을위한 더 많은 변수를 얻기 위해서 나는 catagorical columns를 수치로 변환하여 3-4k 컬럼의 상당히 희소 한 행렬을 만들었다. 그것이 그것이 그 원인 일 수 있다고 생각합니까? –

+0

예, 종속 변수와 독립 변수 간의 상관 관계를 약화시키기 때문에 원인 일 수 있습니다. 나는 또한 단순히 당신의 독립적 인 var가 당신의 종속 변수의 큰 예측 인자가 아닐 수도 있습니다. 탄력성 그물 유형 회귀와 함께 기억해야 할 점은 최하위 (또는 OLS) 손실 함수를 줄이고 계수의 크기를 줄이는 것 사이의 균형입니다. X가 Y와 강하게 상관되지 않으면 람다의 작은 레벨에서도 계수를 0 또는 0에 가까운 값으로 줄일 수 있습니다 – MorganBall