cv.glm 与 cv.glmnet 的输出
Output of cv.glm vs. cv.glmnet
我正在尝试对我想要拟合泊松模型的数据集进行交叉验证。但是,我注意到,当我使用 lambda = 0
时,函数 cv.glm
和 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。
为什么这些值如此不同?
这是一个有趣的问题。
cv.glm
和 cv.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
给出的误差。
我正在尝试对我想要拟合泊松模型的数据集进行交叉验证。但是,我注意到,当我使用 lambda = 0
时,函数 cv.glm
和 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。
为什么这些值如此不同?
这是一个有趣的问题。
cv.glm
和 cv.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
给出的误差。