决策树是如何处理不完整数据的?

网上都在说决策树能很好的处理缺省值,但是都没有人给出具体解释,请给出个详细解释,不甚感激!
关注者
380
被浏览
48,607

14 个回答

在xgboost里,在每个结点上都会将对应变量是缺失值的数据往左右分支各导流一次,然后计算两种导流方案对Objective的影响,最后认为对Objective降低更明显的方向(左或者右)就是缺失数据应该流向的方向,在预测时在这个结点上将同样变量有缺失值的数据都导向训练出来的方向。


例如,某个结点上的判断条件是 A>0 ,有些数据是A<=0,有些是A>0,有些数据的A是缺失值。那么算法首先忽略带缺失值的数据,像正常情况下一样将前两种数据分别计算并导流到左子树与右子树,然后

  1. 将带缺失值的数据导向左子树,计算出这时候模型的Objective_L;
  2. 接着将带缺失值的数据导向右子树,计算出这时候模型的Objective_R;
  3. 最后比较Objective_L和Objective_R。

假设Objective_L更小,那么在预测时所有变量A是缺失值的数据在这个结点上都会被导向左边,当作A<=0处理。


参考:

  1. Chen, Tianqi, and Carlos Guestrin. "Xgboost: A scalable tree boosting system." Proceedings of the 22nd acm sigkdd international conference on knowledge discovery and data mining. ACM, 2016.
  2. dmlc/xgboost

其实缺失值问题可以从三个方面来考虑

1. 在选择分裂属性的时候,训练样本存在缺失值,如何处理?

假如你使用ID3算法,那么选择分类属性时,就要计算所有属性的熵增(信息增益,Gain)。假设10个样本,属性是a,b,c。在计算a属性熵时发现,第10个样本的a属性缺失,那么就把第10个样本去掉,前9个样本组成新的样本集,在新样本集上按正常方法计算a属性的熵增。然后结果乘0.9(新样本占raw样本的比例),就是a属性最终的熵。

2. 分类属性选择完成,对训练样本分类,发现属性缺失怎么办?

比如该节点是根据a属性划分,但是待分类样本a属性缺失,怎么办呢?假设a属性离散,有1,2两种取值,那么就把该样本分配到两个子节点中去,但是权重由1变为相应离散值个数占样本的比例。然后计算错误率的时候,注意,不是每个样本都是权重为1,存在分数。

3. 训练完成,给测试集样本分类,有缺失值怎么办?

这时候,就不能按比例分配了,因为你必须给该样本一个确定的label,而不是薛定谔的label。这时候根据投票来确定,或者填充缺失值。