2

我正在使用 h2o 构建 gbm 模型。训练数据随机分为 70% 的开发数据和 30% 的实时验证数据。训练数据有 1.4% 的错误率,我还需要为每个观察分配权重(数据有一个权重列)。观察结果是:与没有权重的模型(VAL)相比,使用权重构建的模型在开发数据(DEV)上的性能要高得多。使用权重构建的模型在开发数据和实时验证数据之间具有很大的性能差异。例如,具有权重的模型构建显示低于前 10% 的捕获率

开发:56%
验证:25%

虽然没有重量的模型构建显示低于前 10% 的捕获率:

开发:35%
验证:23%

似乎在这种情况下使用权重有助于提高模型在开发和实时验证数据上的性能。想知道在 h2o 中究竟是如何使用重量的?在模型构建中使用权重,模型在 DEV 和 VAL 上的较大性能差异是否说明 gbm 模型在 h2o 中构建的不稳定性更高?

有和没有重量的logloss

蓝色曲线是 DEV,橙色曲线是VAL>。对于没有重量的情况,DEV 和 VAL 的对数损失从同一点开始。而对于加权情况,DEV 和 VAL 的对数损失从两个不同的点开始。如何解释这个日志损失图表,为什么 h2o gbm 中的权重会在日志损失函数输出中产生如此不同的结果?

4

1 回答 1

0

如果没有更多信息(例如实际数据),我的猜测是您看到的起点差距是随机噪声。

为了进一步调查,我建议首先尝试不同的随机种子。我喜欢使用 h2o.grid 来做这个,制作seed一个超参数。只需 3 或 4 个不同的值,您就可以很好地了解随机性对模型的影响程度。

我要尝试的第二件事是不同的火车/有效拆分。同样,明确地为 split 函数提供种子,以便您可以获得可重复的结果。如果您的数据集相当小,我希望这是更大的因素。

把这两个想法放在一起:(粗略的代码)

for split_seed in [1,1103,4387]:
  split data using seed
  h2o.grid(
    algorithm = "gbm",
    grid_id = "ww" + split_seed,
    hyper_params = list(
      seed = [77,800,2099]
      ),
    ...(with weights)...
    )
  h2o.grid(
    algorithm = "gbm",
    grid_id = "wo" + split_seed,
    hyper_params = list(
      seed = [77,800,2099]
      ),
    ...(without weights)...
    )

我的猜测是,如果您将获得的 9 个得分历史图表与权重叠加,并将它们与您获得的没有权重的 9 个得分历史图表进行比较,您会在每个图表上看到类似的模糊程度。

如果你总是/永远不会在所有 9 上得到起始差距,这取决于有无权重,那么会发生更有趣的事情,我希望你能提供足够的数据和代码,以便其他人可以重现它。

于 2017-05-08T07:46:49.743 回答