2017-04-10 83 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