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

问题描述 投票:6回答:3

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

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

search split missing-data xgboost candidate
3个回答
11
投票

xgboost总是考虑到缺失值分割方向,即使没有训练也是如此。默认值为拆分标准中的yes方向。然后了解培训中是否有任何现状

来自作者link

enter image description here

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

    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

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


2
投票

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

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


0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.