【发布时间】:2020-07-16 02:29:26
【问题描述】:
我一直在将 H2O.ai(版本 3.10.3.6)与 R 结合使用。
我正在努力用 h2o.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 高出 60%。我的假设 glm ≈ h2o.glm 是错误的吗?我会尽快提供一个示例数据集(训练数据集是机密的,350000 行 x 350 列)。
一个额外的问题:由于某种原因,as.h2o 增加了一个充满 NA 的额外行,因此 h2o_training 和 h2o_testing 有一个额外的行。在构建模型之前删除它(就像我在这里所做的那样:as.h2o(train)[-1,])不会影响回归性能。没有 NA 值传递给 glm 或 h2o.glm;即训练矩阵没有 NA 值。
【问题讨论】:
-
从您自己的 cmets 并且不了解 h2o,看起来 h2o 处理 NA 的方式与 glm 的处理方式非常不同。在发布问题之前,您应该阅读两者的帮助文件
-
@Akabar,训练矩阵中没有 NA,所以这不是问题。我已阅读文档,并且 h2o.glm 声称要“通过迭代重新加权最小二乘法进行最大似然估计”,这应该为高斯模型提供与 ols 相同的参数估计。
-
如果您在 h2o.glm 中仔细设置参数,则可以复制 glm,但默认设置肯定会做不同的事情。
-
更具体地说,在我脑海中,看看 lambda_search 和 lambda 参数。我认为
lambda_search = FALSE, lambda = 0会让你更接近 glm 正在做的事情。