在我的问题数据集中,响应变量极向偏向左侧。我尝试使用h2o.randomForest()
和h2o.gbm()
填充模型,如下所示。我可以调整min_split_improvement
和min_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的建议之后
EDIT2: 分发原始回复。
答案 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可能是一个更好的选择。