树模型们是如何处理缺失值的?

树模型缺失值处理总结

除了ID3算法之外,其他的树模型基本上都能够处理缺失值。虽然如此,但如scikit-learn之类的库,其在支持gbdt的时候,并没有支持缺失值的处理

  1. C4.5
    第一步,计算所有特征的信息增益或者信息增益率的时候,假设数据集一共10000个样本,特征A中缺失了5000个,则无视缺失值,在剩下的5000个特征中计算信息增益(或者信息增益率),最后乘以0.5,思想就是缺失值多的特征通过这种降低权重的方式来体现信息的缺失;
    第二步,如果运气不好,正好这个A特征乘0.5之后得到的信息增益或者增益率还是最大的,那么就像西瓜书中提到的那样,存在缺失值的样板按照比例进入分裂之后的新的分支,假设根据特征A分裂得到两个新的分支,一个分支有2000个样本有2000个样本,一个分支有3000个样本,则按照比例2000个缺失值和3000个缺失值样本分别进入两个分支。(实际上ID3我没有明确去查是否采用了这种处理方法,c4.5是采用了这种,不过问题不大,应用在ID3上也没啥毛病。。)

CART

1、首先,如果某个存在缺失值的特征恰好是当前的分裂增益最大的特征,那么我们需要遍历剩余的特征,剩余的特征中如果有也存在缺失值的特征,那么这些特征忽略,仅仅在完全没有缺失值的特征上进行选择,我们选择其中能够与最佳增益的缺失特征分裂之后增益最接近的特征进行分裂。

2、如果我们事先设置了一定的标准仅仅选择仅仅选择差异性在一定范围内的特征作为代理特征进行分裂而导致了没有特征和最佳缺失特征的差异性满足要求,或者所有特征都存在缺失值的情况下,缺失样本默认进入个数最大的叶子节点。

显然这种缺失值的处理方式的计算量是非常大的,我们需要遍历其它的特征来进行代理特征选择,这个在数据量很大的情况下开销太大,而带来的性能提升确很有限,所以后来就不怎么用这种处理方式,

XGB 如何处理缺失值

原是论文中关于缺失值的处理将其看与稀疏矩阵的处理看作一样。在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。

posted @ 2020-08-22 12:20  real-zhouyc  阅读(1884)  评论(0编辑  收藏  举报