背景
最近在训练树模型的时候遇到了一个问题:在一次手动特征工程之后,我从原始数据衍生了3个类别型特征,随后加入模型训练,以期望带来模型效果的提升。但最终实验结果出乎意料:加入特征后,训练集和测试集的 auc 均出现小幅下降,不如原始数据训练效果。输出模型特征重要性时,新增的3个特征重要性排名最靠前。
实验结果和我以往对树模型的理解出现了一定程度的偏差。对于树模型,我潜意识认为:
- 如果新增特征有效,那么最后会带来模型效果的提升。
- 如果新增特征无效,树在分裂过程中不会选择该特征,模型效果无变化。
对于新增特征之后,模型效果变差这一现象,一时间无法理解。之后不禁的又重新梳理了一树模型的训练过程以及节点分裂原则,最后发现本质上是高维稀疏特征对树模型的影响。
树模型对类别特征的处理
首先对于 Xgboost、GBDT 等 boosting 树模型,基学习通常是 cart 回归树,而cart树的输入通常只支持连续型数值类型的,像年龄、收入等连续型变量 cart 可以很好地处理,但对于无序的类别型变量(如城市、商品等),cart 树处理就麻烦些了,如果是直接暴力地枚举每种可能的类别型特征的组合,这样找类别特征划分点计算量也很容易就爆了。虽然后续的树模型有对类别型特征做优化处理,但并没有从本质上解决对模型的影响。
对于取值很多的类别型特征,类别型特征的取值数量少的时候还是可以学习到比较重要的交互特征。一旦取值数量过多时,高维稀疏特征容易导致树模型的过拟合。从树的分裂计算规则可知,树模型是根据信息增益等指标选择特征的。面对高维稀疏的特征,一旦有达到划分条件,树模型容易加深,切分次数越多,相应每个切分出的子特征空间的统计信息越来越小,而由于每个小空间数据量较少,它提供的统计信息不准确,可能只是统计噪声。学习到这类特征训练集的表现可能很好,但测试集并不适用,不具有有泛化能力,容易导致过拟合。
树模型不适合处理高维稀疏特征
简单的理解,树模型是从一个大空间中不断的慢慢的划出小块来,小块里面继续化小块,使得每块空间都具有很小的 loss, 到一定的空间大小就停下来要避免过拟合,对连续和稠密强表达能力的原始特征有选择偏好。如果直接使用一个高维的稀疏特征,相当于直接把空间划到最小,其往往不能使 loss 变小因此往往不会被选择分裂,但是一旦选择就很容易过拟合。同时对于目前主流的集成树模型,缺乏克服其过拟合的方式。主要原因是:树模型的惩罚项通常为叶子节点数和深度等,而我们都知道,对于上面这种情况,树往往只需要一个节点就可以完美分割 9990 和 10 个样本,惩罚项极其之小。
而 LR 等线性模型的正则项是对权重的惩罚,也就是 w1 一旦过大,惩罚就会很大,进一步压缩 w1 的值,实现每个'小而美的'特征仍然会被计算权重。这也就是为什么在高维稀疏特征的时候,线性模型会比非线性模型好的原因: 带正则化的线性模型比较不容易对稀疏特征过拟合。
所以,回到文章开始我遇到的问题,正是因为我添加的3个特征,全部都是高维的稀疏特征。而且正是因为这些特征的确有用,在树分裂的时候优先选择这些特征,但因为过于稀疏,导致分裂后每个空间内样本较少,提供的统计信息不准确,最终影响模型效果。
网友评论