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
相关产品推荐
相关产品推荐

