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

时间:2018-01-18 20:47:21

标签: 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)

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

是否有人知道避免使用h2o.automl()过度拟合的方法?

修改

log转换后的响应的分布如下。在Erin的建议之后 enter image description here

EDIT2: 分发原始回复。

enter image description here

2 个答案:

答案 0 :(得分:12)

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

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

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

train[,"log_response"] <- h2o.log(train[,response])

注意事项:如果您的回复中有零,则应使用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)

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

perf <- h2o.make_metrics(predicted = pred, actual = test[,response])
h2o.mse(perf)

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

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

答案 1 :(得分:0)

当目标变量倾斜时,使用mse并不是一个很好的指标。我会尝试更改损失函数,因为gbm尝试使模型适合损失函数的梯度,并且您要确保使用的分布正确。如果您在零和右偏正目标上有一个峰值,那么Tweedie可能是一个更好的选择。