【特征工程】决策树怎么处理缺失值
知乎这篇文章有蛮好的参考意义:
https://www.zhihu.com/question/34867991?sort=created
在xgboost里,在每个结点上都会将对应变量是缺失值的数据往左右分支各导流一次,然后计算两种导流方案对Objective的影响,最后认为对Objective降低更明显的方向(左或者右)就是缺失数据应该流向的方向,在预测时在这个结点上将同样变量有缺失值的数据都导向训练出来的方向。
例如,某个结点上的判断条件是 A>0 ,有些数据是A<=0,有些是A>0,有些数据的A是缺失值。那么算法首先忽略带缺失值的数据,像正常情况下一样将前两种数据分别计算并导流到左子树与右子树,然后
- 将带缺失值的数据导向左子树,计算出这时候模型的Objective_L;
- 接着将带缺失值的数据导向右子树,计算出这时候模型的Objective_R;
- 最后比较Objective_L和Objective_R。
假设Objective_L更小,那么在预测时所有变量A是缺失值的数据在这个结点上都会被导向左边,当作A<=0处理。
参考:
- 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.
- 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,存在分数。
西瓜书上有讲到
好像是按权重分配到子节点
用系数F进行合理的修正计算的信息量,F=数据库中缺失值所在的属性值样本数量去掉缺失值样本数量/数据库中样本数量的总和,即F表示所给属性具有已知值样本的概率。
3. 训练完成,给测试集样本分类,有缺失值怎么办?
这时候,就不能按比例分配了,因为你必须给该样本一个确定的label,而不是薛定谔的label。这时候根据投票来确定,或者填充缺失值。
作者:浣花紫溪
链接:https://www.zhihu.com/question/34867991/answer/151775210
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。