除了ID3算法之外,其他的树模型基本上都能够处理缺失值。虽然如此,但如scikit-learn之类的库,其在支持gbdt的时候,并没有支持缺失值的处理
1、首先,如果某个存在缺失值的特征恰好是当前的分裂增益最大的特征,那么我们需要遍历剩余的特征,剩余的特征中如果有也存在缺失值的特征,那么这些特征忽略,仅仅在完全没有缺失值的特征上进行选择,我们选择其中能够与最佳增益的缺失特征分裂之后增益最接近的特征进行分裂。
2、如果我们事先设置了一定的标准仅仅选择仅仅选择差异性在一定范围内的特征作为代理特征进行分裂而导致了没有特征和最佳缺失特征的差异性满足要求,或者所有特征都存在缺失值的情况下,缺失样本默认进入个数最大的叶子节点。
显然这种缺失值的处理方式的计算量是非常大的,我们需要遍历其它的特征来进行代理特征选择,这个在数据量很大的情况下开销太大,而带来的性能提升确很有限,所以后来就不怎么用这种处理方式,
原是论文中关于缺失值的处理将其看与稀疏矩阵的处理看作一样。在寻找split point的时候,不会对该特征为missing的样本进行遍历统计,只对该列特征值为non-missing的样本上对应的特征值进行遍历,通过这个技巧来减少了为稀疏离散特征寻找split point的时间开销。在逻辑实现上,为了保证完备性,会分别处理将missing该特征值的样本分配到左叶子结点和右叶子结点的两种情形,计算增益后选择增益大的方向进行分裂即可。可以为缺失值或者指定的值指定分支的默认方向,这能大大提升算法的效率。如果在训练中没有缺失值而在预测中出现缺失,那么会自动将缺失值的划分方向放到右子树。
原文:https://www.cnblogs.com/zhouyc/p/13545060.html