10

他们文章的第 3.4 节中,作者解释了他们在为树生长搜索最佳候选分割时如何处理缺失值。具体来说,他们为那些节点创建一个默认方向,作为分割特征,一个在当前实例集中具有缺失值的节点。在预测的时候,如果预测路径经过这个节点并且缺少特征值,则遵循默认方向。

但是,当缺少特征值并且节点没有默认方向时(这可能在许多情况下发生),预测阶段就会崩溃。换句话说,他们如何将默认方向关联到所有节点,即使是那些在训练时活动实例集中具有无缺失分裂特征的节点?

4

3 回答 3

15

xgboost always accounts for a missing value split direction even if none are present is training. The default is the yes direction in the split criterion. Then it is learned if there are any present in training

From the author link

enter image description here

This can be observed by the following code

    require(xgboost)

    data(agaricus.train, package='xgboost')

    sum(is.na(agaricus.train$data))
    ##[1] 0  

    bst <- xgboost(data = agaricus.train$data, 
                       label = agaricus.train$label, 
                       max.depth = 4, 
                       eta = .01, 
                       nround = 100,
                       nthread = 2, 
                       objective = "binary:logistic")

dt <- xgb.model.dt.tree(model = bst)  ## records all the splits 

> head(dt)
     ID Feature        Split  Yes   No Missing      Quality   Cover Tree Yes.Feature Yes.Cover  Yes.Quality
1:  0-0      28 -1.00136e-05  0-1  0-2     0-1 4000.5300000 1628.25    0          55    924.50 1158.2100000
2:  0-1      55 -1.00136e-05  0-3  0-4     0-3 1158.2100000  924.50    0           7    679.75   13.9060000
3: 0-10    Leaf           NA   NA   NA      NA   -0.0198104  104.50    0          NA        NA           NA
4: 0-11       7 -1.00136e-05 0-15 0-16    0-15   13.9060000  679.75    0        Leaf    763.00    0.0195026
5: 0-12      38 -1.00136e-05 0-17 0-18    0-17   28.7763000   10.75    0        Leaf    678.75   -0.0199117
6: 0-13    Leaf           NA   NA   NA      NA    0.0195026  763.00    0          NA        NA           NA
   No.Feature No.Cover No.Quality
1:       Leaf   104.50 -0.0198104
2:         38    10.75 28.7763000
3:         NA       NA         NA
4:       Leaf     9.50 -0.0180952
5:       Leaf     1.00  0.0100000
6:         NA       NA         NA

> all(dt$Missing == dt$Yes,na.rm = T)
[1] TRUE

source code https://github.com/tqchen/xgboost/blob/8130778742cbdfa406b62de85b0c4e80b9788821/src/tree/model.h#L542

于 2016-06-03T20:40:50.183 回答
2

我对该算法的理解是,如果在训练时没有可用的缺失数据,则根据训练数据的分布概率地分配默认方向。IE。只需朝着训练集中大多数样本的方向前进。在实践中,我会说数据集中缺少数据是个坏主意。一般来说,如果数据科学家在训练 GBM 算法之前以一种智能的方式清理数据集,模型会表现得更好。例如,将所有 NA 替换为均值/中值,或者通过查找 K 个最近邻并将它们的值平均为该特征来估算该值以估算训练点。

我也想知道为什么数据会在测试时而不是在训练时丢失。这似乎意味着您的数据分布随着时间的推移而演变。可以在新数据可用时进行训练的算法(例如神经网络)在您的用例中可能会做得更好。或者你总是可以制作一个专业模型。例如,假设缺少的特征是模型中的信用评分。因为有些人可能不批准您访问他们的信用。为什么不使用信用训练一个模型,一个不使用信用训练。通过使用其他相关特征,经过训练的不包括信用的模型可能能够获得大部分提升信用。

于 2016-06-03T15:49:28.123 回答
0

感谢您分享您的想法@Josiah。是的,当您说最好避免数据集中丢失数据时,我完全同意您的看法,但有时这不是替换它们的最佳解决方案。另外,如果我们有像GBM这样的学习算法可以应对它们,何不试一试。我正在考虑的情况是,当您拥有一些缺失很少 (<10%) 甚至更少的功能时。

关于第二点,我想到的场景如下:树已经长到一定深度,因此实例集不再是完整的。对于一个新节点,发现最佳候选者是一个特征f的值,该特征最初包含一些缺失,但不在当前实例集中,因此没有定义默认分支。因此,即使f在训练数据集中包含一些缺失,该节点也没有默认分支。一个测试实例掉在这里,会卡住。

也许您是对的,如果没有遗漏,默认分支将是具有更多示例的分支。如果有的话,我会尝试联系作者并在此处发布回复。

于 2016-06-03T17:01:06.090 回答