【问题标题】:Why is there different MSE for cross-validation data in h2o package为什么 h2o 包中的交叉验证数据有不同的 MSE
【发布时间】:2019-05-02 07:11:47
【问题描述】:

在摘要输出中,交叉验证数据的 MSE 为 0.1641124,但在详细的交叉验证指标摘要中为 0.14977892。它们不是相同的指标吗?

library(h2o)

h <- h2o.init()
data <- as.h2o(iris)
part <- h2o.splitFrame(data, 0.7, seed = 123)
train <- part[[1]]
test <- part[[2]]

m <- h2o.glm(x=2:5,y=1,train, nfolds = 10, seed = 123)
summary(m)


#...
#H2ORegressionMetrics: glm

#** Reported on cross-validation data. **
#** 10-fold cross-validation on training data (Metrics computed for combined 
#holdout predictions) **

#MSE:  ***0.1641124***
#RMSE:  0.4051079
#... 

#Cross-Validation Metrics Summary: 
#  mean  sd  cv_1_valid cv_2_valid cv_3_valid  cv_4_valid  cv_5_valid cv_6_valid  cv_7_valid cv_8_valid cv_9_valid


#...

#  mse  ***0.14977892*** 0.053578787  0.14102486 0.14244498 0.05266633  0.19028585 0.043878503 0.12635022  0.13820939 0.15831167 0.33359975

【问题讨论】:

    标签: r h2o


    【解决方案1】:

    这两个 MSE 值的计算方式不同。

    第一个 (0.1641124) 是在交叉验证期间使用保留集上的所有预测计算得出的:

    创建模型:

    m <- h2o.glm(x = 2:5,
                 y = 1,
                 train,
                 nfolds = 10,
                 seed = 123,
                 keep_cross_validation_predictions = TRUE,
                 keep_cross_validation_fold_assignment = TRUE)
    

    提取支持预测

    preds <- as.data.frame(h2o.cross_validation_holdout_predictions(m))
    

    计算 MSE:

    mean((preds$predict - as.data.frame(train)$Sepal.Length)^2)
    #output
    0.1641125
    

    其中较低的 MSE (0.14977892) 表示每个保留集的 MSE 平均值:

    folds <- as.data.frame(h2o.cross_validation_fold_assignment(m))
    
    library(tidyverse)
    data.frame(preds = preds$predict,  #create a data frame with hold out predictions
               folds = folds$fold_assignment,  #folds assignement
               true = as.data.frame(train)$Sepal.Length) %>% #true values
      group_by(folds) %>% #group by folds 
      summarise(mse = mean((preds - true)^2)) %>% # calculate mse for each fold
      ungroup() %>%
      summarise(mse = mean(mse)) %>% #average them
      as.numeric
    #output
    0.1497789
    

    重现第一次运行:

    library(h2o)
    
    h <- h2o.init()
    data <- as.h2o(iris)
    part <- h2o.splitFrame(data, 0.7, seed = 123)
    train <- part[[1]]
    test <- part[[2]]
    

    【讨论】:

    • 谢谢,应该用哪一个作为简历的代表?
    • 这完全取决于您,当您比较模型时要小心,以始终使用相同的模型。我通常倾向于使用保留预测的平均值(在这种情况下是第二个),因为这样我也会对性能产生一些差异感。再说一次,我也倾向于在大多数情况下进行重复 CV,在这种情况下,可以使用根据每次重复的组合保持预测计算得出的指标,并且仍然可以了解 CV 重复中的模型性能差异。这里没有硬性规定。
    • 当我有一个两类问题并想要绘制 ROC 曲线时,我需要使用组合的保持预测,否则在这种情况下我最终会得到 10 条 ROC 曲线(对于 10 倍 CV)我报告/比较组合预测的 AUC。
    • @Minyi Han 很高兴为您提供帮助。如果答案对您有帮助并解决了您的问题,请接受 (stackoverflow.com/help/someone-answers)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 2020-01-18
    • 2018-09-07
    • 2019-10-04
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多