我正在使用h2o
包来为流失预测问题训练GBM。
我只想知道是什么影响了保存在磁盘上的拟合模型的大小(通过h2o.saveModel()
),但不幸的是,我在任何地方都找不到答案。
更具体地说,当我调整GBM以在3个相同长度的非重叠滚动窗口上找到最优超参数(通过h2o.grid()
)时,我获得了大小不可比较的模型(即11mb、19mb和67mb)。超参数网格是相同的,并且训练集大小也是可比较的。
自然地,所得到的优化超参数在3个区间内是不同的,但我看不出这怎么会在模型大小上产生这样的差异。
此外,当我基于这些超参数集训练实际模型时,我最终也会得到不同大小的模型。
感谢您的帮助!谢谢
ps。很抱歉,我无法共享任何数据集以使其可复制(由于隐私限制)
这是您所期望的两件事:树的数量和深度。
但这也取决于你的数据。对于GBM,可以根据数据缩短树。
我要做的是导出MOJO,然后按照下面的文档中的描述将其可视化,以获得更多关于实际生产内容的详细信息:
- http://docs.h2o.ai/h2o/latest-stable/h2o-genmodel/javadoc/index.html
请注意,通常情况下,60 MB的范围似乎并不太大。
如果你查看模型信息,你会发现关于树的数量、它们的平均深度等等。比较三个最好的模型应该会让你深入了解是什么让模型变得更大。
从R来看,如果m
是您的模型,只需打印它就可以提供大部分信息。str(m)
会为您提供所有已保存的信息。
我认为值得调查。原因可能是其中两个数据窗口相对清晰,只有少数字段可以定义树,而第三个数据窗口更混乱(从数学意义上讲),当它试图将其拆分为决策树时,你会得到一些深层的树。
更深入地研究第三个窗口可能会建议你可以做一些数据工程,这会让你更容易学习。或者,这可能是您的数据存在差异。例如,在2016年和2017年的数据中,有一列都是NULL,但在2018年的数据则不是,因为2018年是你开始收集它的年份,正是这个额外的列允许/导致树变得更深。
最后,网格超参数可能对性能不重要,这是由于噪声造成的差异。例如,您将max_depth
作为超参数,但对MSE的影响很小,而噪声是一个很大的因素。这些随机差异可以让你的两个数据集的最佳模型进入深度5(但第二好模型差0.01%,但进入深度20),但第三个数据集进入深度30(但第二好模型差0.01%,但只进入深度5)。(如果我正确理解你的问题,你已经排除了这种可能性,因为你随后在相同的超参数上训练了所有三个数据集?但我想我无论如何都会把它包括在内。)