【19年ML思考笔记】GBDT碎碎念(1)谈回归树的分裂准则

系列简介: 【19年ML思考笔记】本系列主要关注的问题

文章索引:【索引】专栏文章索引(长期维护)

前言

【GBDT碎碎念】是一个小的系列,不定期更新。现在大家一般都觉得已经把GBDT这种常用模型掰开揉碎了,无论是刚毕业的同学还是工业界的资深从业者。不过我觉得可能大部分公开的资料上对GBDT的挖掘还不足够,所以开此系列来放一些我的脑洞,希望能给大家拆掉一些思维中的墙。

那么这个系列的第一篇,来谈一下经常被人无视的回归树的分裂准则。

回顾回归树的分裂准则

在“普通”的分裂数实现中,不同分裂位置的打分公式是符合如下形式:(objective是MSE的情况下)

\frac{(\sum_a z_a)^2}{N_a}+\frac{(\sum_b z_b)^2}{N_b}

其中a,b分别对应切分后的两部分样本(本文为方便起见只讨论简单的无空缺值得情况)。

这个分裂条件非常常见,在CART最初的书中就出现了,作者Leo Breima对此也未做太多解释,基本上就是:“我们回归问题一般就是用MSE,如果是MSE的话balabala,最后就得到了这个”。这个过程并不难,目标是最小化分裂之后模型在两部分样本上的MSE,最后就能得到这个。

这问题就来了,objective是MSE时候是这个,是其他的时候也该用这个么?难道我们用MAE、MAPE等其他objective的时候其实并没有改全?

弱模型是一个解释,但还不足够

到这里,有些同学就会想到这里:GBDT是一种集成学习算法,可以使用弱模型作为基础。只要我们的梯度计算正确,分裂位置的不准确并不会明显的导致学习方向有问题,只是相对最好的情况弱了一些,这是可以接受的。

但弱模型也有很多构造方式,为什么我们偏偏要用这个准则,而不是直接取特征值的中位数,这样似乎也符合这个解释。在这个角度下,我们对于为什么最后实践中普遍采用了这个准则还是不清楚。

“最优的”分裂准则

如果我们把objective改成MAE,稍做推导也能得到一个公式,很明显,这个公式和上面不同。

记f({x})是集合{x}中值比较大的一半的和减去比较小的一半的和(奇数个时候中位数忽略)

这个公式大约是下面的形式,其中A、B同样代表划分的两部分样本:

f(A)+f(B)

(这里的推导和精确形式留作读者的作业)

工程折中

对比上面MAE的最优分裂准则和上面MSE的分裂准则,可以发现一个事情,那就是在扫描一个特征的所有值时候,MSE准则可以实现在每个值只用均摊O(1)时间和O(1)的空间来计算新打分,而MAE的则在时间和空间上都不行。

甚至说如何高效的实现MAE的分裂准则也需要一点脑筋,这个也同样留作感兴趣读者的作业。

所以到这里我们知道了一个原因,那就是其他objective的最优分裂准则工程实现计算开销更高。

但这个开销值不值它的收益我们还不知道,由于我并没有看到什么资料仔细讨论这方面,所以只能自己实现了一个MAE的版本来测了下。

结论符合我们的预期:如果好的话应该会有人提出来,但我们没有看到。

即使是一个高效的实现,也会导致计算时间成倍增加;更主要的是,显著增加的计算时间并没有带来效果的显著改善,在我的测试数据上,这个改善很微弱,但确实在训练集上存在。不过训练集上的收益并不代表最终测试集上就会有收益。

相对于这个效果收益,搜索超参数能带来的收益更加显著,而搜索超参数需要一个比较快的基础模型实现。

至此,我们终于知道,目前MSE的分裂条件对于其他Objective(只验证了MAE)来说效果仍然不错,这里并不是随便放了一个什么弱模型上去,大概也不是所有人都没有意识到这个问题。(但我好像并没有看到之前有人正式的讨论这个问题。)这是一个工程和效果上的折中,而且更多是工程方面计算成本的制约。


本文成文于2019.7.13

编辑于 2019-07-26

文章被以下专栏收录