2017-04-10 46 views
0

我一直在与H2O.ai(3.10.3.6版)与R.h2o.glm不用于联合线性回归

我奋力用水复制从GLM结果匹配R中GLM。 GLM。我期望得到完全相同的结果(在这种情况下,以均方误差来评估),但我发现h2o的精度必须更差。由于我的模型是高斯的,我认为这两种情况都是普通最小二乘(或最大似然)回归。

这是我的例子:

train <- model.matrix(~., training_df) 
test <- model.matrix(~., testing_df) 

model1 <- glm(response ~., data=data.frame(train)) 
yhat1 <- predict(model1 , newdata=data.frame(test)) 
mse1 <- mean((testing_df$response - yhat1)^2) #5299.128 

h2o_training <- as.h2o(train)[-1,] 
h2o_testing <- as.h2o(test)[-1,] 

model2 <- h2o.glm(x = 2:dim(h2o_training)[2], y = 1, 
        training_frame = h2o_training, 
        family = "gaussian", alpha = 0) 

yhat2 <- h2o.predict(model2, h2o_testing) 
yhat2 <- as.numeric(as.data.frame(yhat2)[,1]) 
mse2 <- mean((testing_df$response - yhat2)^2) #8791.334 

的MSE是为H2O型号高出60%。我的假设glm≈h2o.glm错了吗?我将着眼于提供一个示例数据集asap(训练数据集是保密的,350000行x 350列)。

一个额外的问题:由于某些原因,as.h2o增加了一个充满NAs的额外行,以便h2o_training和h2o_testing有一个额外的行。在构建模型之前删除它(如我在这里所做的:as.h2o(train)[ - 1,])不会影响回归性能。没有传递给glm或h2o.glm的NA值;即训练矩阵不具有NA值。

+0

从你自己的意见,而不知道h2o,似乎h2o处理NA的方式与glm完全不同。你应该在发布问题 – Akbar

+0

@Akabar之前阅读两个帮助文件,训练矩阵中没有NAs,所以这不是问题。我已阅读文档和h2o.glm声明做“通过迭代重新最小二乘法进行最大似然估计”,这应该给高斯模型提供与ols相同的参数估计值。 – fifthace

+1

如果您在h2o.glm中仔细设置参数,可以复制glm,但默认设置肯定会做不同的事情。 – jmuhlenkamp

回答

3

为了使H2O的GLM与R的GLM匹配,需要设置一些参数,因为默认情况下它们的功能不同。下面是你需要设置以获得相同的结果是什么一个例子:

library(h2o) 
h2o.init(nthreads = -1) 

path <- system.file("extdata", "prostate.csv", package = "h2o") 
train <- h2o.importFile(filepath) 

# Run GLM of VOL ~ CAPSULE + AGE + RACE + PSA + GLEASON 
x <- setdiff(colnames(train), c("ID", "DPROS", "DCAPS", "VOL")) 

# Train H2O GLM (designed to match R) 
h2o_glmfit <- h2o.glm(y = "VOL", 
         x = x, 
         training_frame = train, 
         family = "gaussian", 
         lambda = 0, 
         remove_collinear_columns = TRUE, 
         compute_p_values = TRUE, 
         solver = "IRLSM") 

# Train an R GLM 
r_glmfit <- glm(VOL ~ CAPSULE + AGE + RACE + PSA + GLEASON, 
       data = as.data.frame(train)) 

这里是coefs(它们匹配):

> h2o.coef(h2o_glmfit) 
    Intercept  CAPSULE   AGE 
-4.35605671 -4.29056573 0.29789896 
     RACE   PSA  GLEASON 
4.35567076 0.04945783 -0.51260829 

> coef(r_glmfit) 
(Intercept)  CAPSULE   AGE 
-4.35605671 -4.29056573 0.29789896 
     RACE   PSA  GLEASON 
4.35567076 0.04945783 -0.51260829 

我添加了一个JIRA ticket这一信息添加到文档。

+0

谢谢艾琳。这给了我一个与lm相同的结果。现在我将努力获得与glmnet相同的结果。 – fifthace

+0

@fifthace如果您使用glmnet默认值,请在H2O中设置“alpha = 1.0”。请注意,glmnet可能会找到与H2O不同的'lambda',因此您可以先运行它,取最好的'lambda'值,然后在'h2o.glm()'中使用它。 –

2

我的假设glm≈h2o.glm错了吗?

h2o.glm的算法不同于R的glm。

h2o.glm实际上与glmnet R包非常相似,因为它们都支持Elastic Net正则化(并且glmnet的两位作者Hastie和Tibshirani是H2O.ai的顾问)。

当建立H2O的glm时,我们使用glmnet作为测量棒,远远超过R的glm。尽管如此,你不应该期待结果具有完全相同的系数,但我也不希望这样的MSE急剧恶化。

+0

@ Tom K,当使用10倍交叉验证来最小化MSE时,glmnet给出了几乎与glm相同的结果。基本上,弹性网不适合我的例子,并且你的解释不正确(在我的情况下)。 – fifthace