You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

H2O的RMSE性能报告与手动计算结果不一致的原因咨询

问题:H2O h2o.performance报告的RMSE与手动计算结果差异极大

你在测试集上发现h2o.performance输出的RMSE(0.3395)和手动计算的RMSE(1.8905)差距显著,核心原因是手动计算时错误地直接对H2OFrame对象进行运算,而非提取其中的数值向量。

问题重现代码

iris_h2o = as.h2o(iris)
parts = h2o.splitFrame(iris_h2o, ratios = c(0.5,0.25), seed = 1)
train = parts[[1]]
valid = parts[[2]]
test = parts[[3]]

x = c('Sepal.Width','Petal.Length','Petal.Width')
y = 'Sepal.Length'
auto_gbm = h2o.automl(x= x,
                      y= y,
                      training_frame = train,
                      validation_frame = valid,
                      nfolds = 0,
                      include_algos = c('GBM'),
                      max_models = 5,
                      seed = 1
                      )
best_gbm = h2o.get_best_model(auto_gbm)
 
h2o.performance(best_gbm, test)

h2o.performance输出:

H2ORegressionMetrics: gbm

MSE:  0.1152907
RMSE:  0.3395449
MAE:  0.2675279
RMSLE:  0.04744378
Mean Residual Deviance :  0.1152907

错误的手动计算代码:

rmse = function(y, y_predict){
  N = length(y)
  RMSE = sqrt(sum((y-y_predict)^2,na.rm=T)/N)
  return(RMSE)
}

test['predicted'] = h2o.predict(best_gbm, test)

rmse(test['Sepal.Length'], test['predicted'])
# 输出: [1] 1.890506

原因分析

当你用test['Sepal.Length']和test['predicted']时,返回的是H2OFrame对象,而非R原生的数值向量。直接对H2OFrame执行减法和平方运算,并不会按预期逐元素计算,而是触发了H2OFrame的其他运算逻辑,导致结果完全错误。

修正方法

将H2OFrame转换为R原生的数值向量后再计算,可通过as.vector()或h2o.as_data_frame()实现:

修正后的手动计算代码:

rmse = function(y, y_predict){
  # 转换为R原生向量
  y_vec = as.vector(y)
  y_predict_vec = as.vector(y_predict)
  N = length(y_vec)
  RMSE = sqrt(sum((y_vec - y_predict_vec)^2, na.rm=T)/N)
  return(RMSE)
}

test['predicted'] = h2o.predict(best_gbm, test)

# 传入H2OFrame的列,内部转换为向量
rmse(test$Sepal.Length, test$predicted)
# 输出: [1] 0.3395449

此时手动计算的RMSE与h2o.performance输出的结果完全一致。

内容的提问来源于stack exchange,提问作者Matthew Son

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:55:18