【问题标题】:xgboost: handling of missing values for split candidate searchxgboost:处理拆分候选搜索的缺失值
【发布时间】:2016-10-03 16:44:57
【问题描述】:

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

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

【问题讨论】:

    标签: search split missing-data xgboost candidate


    【解决方案1】:

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

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

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

    【讨论】:

    • 我知道你写这个答案已经有一段时间了,但我想知道当训练数据集中没有缺失值时,你是否有幸确定 xgboost 在预测期间做了什么?
    • 您好,请看下面 T. Scharf 的回答
    【解决方案2】:

    xgboost 总是考虑缺失值拆分方向,即使没有存在也是训练。默认为拆分标准中的yes 方向。然后了解是否有训练中存在

    来自作者 link

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

        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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2022-11-24
      相关资源
      最近更新 更多