5

在我的问题数据集中,响应变量非常偏左。我试图用 和 来拟合模型,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.automl()h2o 包的功能来解决这个问题以获得更好的性能。但是,我看到明显的过度拟合。我不知道h2o.automl()控制过度拟合的任何参数。

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

编辑

log转换后的响应的分布如下所示。在艾琳的建议下 在此处输入图像描述

EDIT2: 原始响应的分布。

在此处输入图像描述

4

2 回答 2

13

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()使用新的 preds 函数计算这些指标,而不是从模型中提取指标。

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

您可以使用上面显示的 RF、GBM 或 AutoML(应该比单个 RF 或 GBM 提供更好的性能)来尝试此操作。

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

于 2018-01-18T21:32:18.960 回答
0

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

于 2019-01-09T03:09:38.397 回答