2017-06-22 25 views
0

我想为我想,以适应泊松模型的数据集做交叉验证。然而,我注意到,当我使用lambda = 0时,我得到的功能cv.glmcv.glmnet的输出非常不同。下面是我的基本泊松模型代码(第一部分是数据集的设置):输出与cv.glmnet

game_soon <- function(game_type, hour){ 
    ret_vec <- c() 
    len_game_type <- length(game_type) 
    for(i in 1:len_game_type){ 
    if(game_type[i] == 'N' && hour[i] >= 16){ 
     ret_vec <- c(ret_vec, 1) 
    } 
    else if(game_type[i] == 'D' && hour[i] >= 10 && hour[i] <= 17){ 
     ret_vec <- c(ret_vec, 1) 
    } 
    else{ 
     ret_vec <- c(ret_vec, 0) 
    } 
    } 
    return(ret_vec) 
} 

wrigley_agg <- read.csv("/Users/eweine/Desktop/myDivvy/export/EWEINE/WR/WRIGLEY_DIVVY/data", header=FALSE) 

colnames(wrigley_agg) <- c("Checkouts", "Temp", "Humidity", "Rain_Intensity", 
          "Rain_Total", "Hour", "DOY", "Weekday", "Cubs_Game") 
game_vec <- wrigley_agg$Cubs_Game 
hour_vec <- wrigley_agg$Hour 
new_column <- game_soon(game_vec, hour_vec) 
wrigley_agg$Game_Soon <- new_column 

require(glm) 
require(boot) 


basic_poisson <- glm(Checkouts ~ Weekday + Game_Soon + poly(Hour, 6) + 
poly(Temp, 4) + poly(Rain_Intensity, 4), data=wrigley_agg, family=poisson) 

cv_possion <- cv.glm(wrigley_agg, basic_poisson, K=10) 

print(cv_possion) 

我的输出是:

[1] 958.9232 958.5509 

下面是我为cv.glmnet型号代码:

x_pois <- model.matrix(Checkouts ~ Weekday + Game_Soon + poly(Hour, 6) + poly(Temp, 4) + 
            poly(Rain_Intensity, 4), data=wrigley_agg) 
y_pois <- wrigley_agg$Checkouts 

cv_lasso_pois <- cv.glmnet(x_pois, y_pois, family="poisson", alpha=1, lambda=seq(1, 0, -1)) 
no_penalty_cv <- cv_lasso_pois$cvm[cv_lasso_pois$lambda == 0] 
print(no_penalty_cv) 

而且我的输出是:

[1] 13.41691 

可以找到数据here

为什么这些价值观如此不同?

+0

> cv.glm ...# 错误:对象 'cv.glm' 未找到 –

+0

你能否就此展开? –

+0

您没有包含库调用来加载可能包含所有函数和数据的包......但我的猜测是数据集可能不在那里。请阅读[MCVE]。 –

回答

0

这是一个有趣的问题。
通过cv.glmcv.glmnet(与lambda=0)给出的平均交叉验证误差之间的差异是由于由两个命令中使用的不同的成本函数。
对于泊松模型,cv.glm默认使用平均平方误差cv.glmnet使用偏差
下面我定义一个函数devi计算所要求的cv.glm偏差:

library(glmnet) 
library(boot) 

basic_poisson <- glm(Checkouts ~ Weekday + Game_Soon + poly(Hour, 6) + 
poly(Temp, 4) + poly(Rain_Intensity, 4), data = wrigley_agg, family = 
poisson) 

devi <- function(y, eta) { 
     deveta = y * log(eta) - eta 
     devy = y * log(y) - y 
     devy[y == 0] = 0 
     mean(2 * (devy - deveta)) 
} 

set.seed(1) 
cv_poisson <- cv.glm(data=wrigley_agg, glmfit=basic_poisson, cost=devi, K = 10) 
print(cv_poisson$delta) 

估计(原始和调整)平均交叉验证错误,现在是:

[1] 13.42184 13.41605 

他们都非常接近由cv.glmnet给出的错误。

+0

非常感谢!一般来说,是否有一个包可以持续计算多种不同类型的模型的cv值?这将使交叉验证更容易。 –

+0

@EricWeine'cv.glmnet'函数可以一致地计算许多不同模型的cv错误。我建议使用这个命令来处理惩罚性和非惩罚性的模型。 –