如何处理H2O算法中的偏差响应

dee*_*wal 5 r h2o automl

在我的问题数据集中,响应变量非常偏向左侧.我试图使用h2o.randomForest()h2o.gbm()如下的模型.在这两种情况下,我可以调整min_split_improvementmin_rows避免过度拟合.但是对于这些模型,我发现尾部观察的误差很大.我曾尝试 weights_column过对尾部观察进行过采样,并对其他观察结果进行欠采样,但这并没有帮助.

h2o.model <- h2o.gbm(x = predictors, y = response, training_frame = train,valid = valid, seed = 1,
                              ntrees =150, max_depth = 10, min_rows = 2, model_id = "GBM_DD", balance_classes = T, nbins = 20, stopping_metric = "MSE", 
                     stopping_rounds = 10, min_split_improvement = 0.0005)


h2o.model <- h2o.randomForest(x = predictors, y = response, training_frame = train,valid = valid, seed = 1,ntrees =150, max_depth = 10, min_rows = 2, model_id = "DRF_DD", balance_classes = T, nbins = 20, stopping_metric = "MSE", 
                     stopping_rounds = 10, min_split_improvement = 0.0005)
Run Code Online (Sandbox Code Playgroud)

我已经尝试了h2o.automl()h2o包的功能,以获得更好的性能问题.但是,我看到了严重的过度拟合.我不知道h2o.automl()控制过度拟合的任何参数.

有谁知道避免过度拟合的方法h2o.automl()

编辑

log转换响应的分布如下.在艾琳的建议之后 在此输入图像描述

EDIT2: 原始响应的分布.

在此输入图像描述

Eri*_*ell 13

H2O AutoML在下面使用H2O algos(例如RF,GBM),因此如果你无法在那里获得好的模型,那么使用AutoML会遇到同样的问题.我不确定我会称之为过度拟合 - 更多的是你的模型在预测异常值方面表现不佳.

我的建议是记录你的响应变量 - 当你有一个偏差的响应时,这是一件很有用的事情.将来,H2O AutoML会尝试自动检测偏差响应并记录日志,但这不是当前版本的功能(H2O 3.16.*).

如果您不熟悉此过程,请参阅以下详细信息.首先,创建一个新列,例如log_response,如下所示,并将其用作训练时的响应(在RF,GBM或AutoML中):

train[,"log_response"] <- h2o.log(train[,response])
Run Code Online (Sandbox Code Playgroud)

注意事项:如果您的回复中有零,则应使用h2o.log1p().确保不要在预测变量中包含原始响应.在您的情况下,您不需要更改任何内容,因为您已经使用predictors向量明确指定了预测变量.

请记住,当您记录响应时,您的预测和模型指标将在日志范围内.因此,如果您需要将预测转换回正常比例,如下所示:

model <- h2o.randomForest(x = predictors, y = "log_response", 
                          training_frame = train, valid = valid)
log_pred <- h2o.predict(model, test)
pred <- h2o.exp(log_pred)
Run Code Online (Sandbox Code Playgroud)

这为您提供了预测,但如果您还想查看指标,则必须h2o.make_metrics()使用新的preds 计算使用该函数的指标,而不是从模型中提取指标.

perf <- h2o.make_metrics(predicted = pred, actual = test[,response])
h2o.mse(perf)
Run Code Online (Sandbox Code Playgroud)

你可以尝试使用RF,如上所示,或GBM,或使用AutoML(它应该提供比单个RF或GBM更好的性能).

希望这有助于提高模型的性能!