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

How to handle a skewed response in H2O algorithms

在我的问题数据集中,响应变量极度向左倾斜。我尝试使用 h2o.randomForest()h2o.gbm() 来拟合模型,如下所示。我可以给出 tune 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 的建议之后

编辑2: 原始响应的分布。

H2O AutoML 在底层使用 H2O 算法(例如 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 提供更好的性能)来尝试此操作。

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

当你的目标变量有偏差时,mse 不是一个好的度量标准。我会尝试更改损失函数,因为 gbm 会尝试使模型适应损失函数的梯度,并且您想确保您使用的是正确的分布。如果你在零和右偏正目标上有尖峰,Tweedie 可能是更好的选择。