xgboost:处理拆分候选搜索的缺失值

pma*_*ini 8 search split candidate missing-data xgboost

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

然而,当缺少特征值并且节点没有默认方向时,预测阶段将会中断(并且这可能在许多情况下发生).换句话说,他们如何将默认方向与所有节点相关联,甚至是那些在训练时设置的活动实例中具有无缺失分裂功能的节点?

T. *_*arf 11

xgboost即使没有训练,也总是考虑缺失值分割方向.默认值是yes拆分标准中的方向.其次,如果有据悉在训练中存在的任何

来自作者 链接

在此输入图像描述

这可以通过以下代码观察到

    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
Run Code Online (Sandbox Code Playgroud)

源代码 https://github.com/tqchen/xgboost/blob/8130778742cbdfa406b62de85b0c4e80b9788821/src/tree/model.h#L542

  • 请注意,同一作者在这里也发表了相互矛盾的评论https://github.com/dmlc/xgboost/issues/21#issuecomment-51982962。因此,本质上是选择增益最大的方向。奇怪的是,这两条评论几乎是在同一时间发表的。 (2认同)

小智 2

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

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