xgboost: обработка пропущенных значений для поиска кандидатов с разделением

В разделе 3.4 своей статьи авторы объясняют, как они обрабатывают пропущенные значения при поиске наилучшего варианта разбиения для выращивания деревьев. В частности, они создают направление по умолчанию для тех узлов, у которых, в качестве функции разделения, один с отсутствующими значениями в текущем наборе экземпляров. Во время прогнозирования, если путь прогнозирования проходит через этот узел и значение функции отсутствует, используется направление по умолчанию.

Однако фаза прогнозирования будет нарушена, если значения объекта отсутствуют и у узла нет направления по умолчанию (а это может происходить во многих сценариях). Другими словами, как они связывают направление по умолчанию со всеми узлами, даже с теми, которые имеют функцию разделения без пропусков в активном экземпляре, установленном во время обучения?

3 ответа

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

исходный код https://github.com/tqchen/xgboost/blob/8130778742cbdfa406b62de85b0c4e80b9788821/src/tree/model.h#L542

Мое понимание алгоритма состоит в том, что направление по умолчанию назначается вероятностно на основе распределения данных обучения, если во время обучения отсутствуют недостающие данные. IE. Просто идите в направлении с большинством образцов в тренировочном наборе. На практике я бы сказал, что иметь плохие данные в вашем наборе данных - это плохая идея. Как правило, модель будет работать лучше, если специалист по обработке данных очистит данные, установленные разумным способом, перед обучением алгоритму GBM. Например, замените все NA средним / медианным значением или вмените это значение, найдя K ближайших соседей и усреднив их значения для этого признака, чтобы рассчитать тренировочную точку.

Мне также интересно, почему данные будут отсутствовать во время теста, а не в поезде. Кажется, это означает, что распределение ваших данных со временем меняется. Алгоритм, который можно обучить по мере появления новых данных, например, нейронная сеть, может быть лучше в вашем случае использования. Или вы всегда можете сделать модель специалиста. Например, допустим, отсутствующей функцией является кредитный балл в вашей модели. Потому что некоторые люди могут не одобрить вас, чтобы получить доступ к своим кредитам. Почему бы не обучить одну модель с использованием кредита, а другую - без кредита. Модель, обученная без учета кредита, может получить большую часть предоставляемого кредита, используя другие взаимосвязанные функции.

Спасибо, что поделились своими мыслями @Josiah. Да, я полностью согласен с вами, когда вы говорите, что лучше избегать пропущенных данных в наборе данных, но иногда это не оптимальное решение для их замены. Кроме того, если у нас есть алгоритм обучения, такой как GBM, который может справиться с ними, почему бы не попробовать. Сценарий, о котором я думаю, - это когда у вас есть некоторые особенности с несколькими пропусками (<10%) или даже меньше.

Что касается второго пункта, я имею в виду следующий сценарий: дерево уже выросло до некоторой глубины, так что набор экземпляров уже не является полным. Для нового узла лучшим кандидатом считается значение для функции f, которая изначально содержит некоторые пропуски, но не в текущем наборе экземпляров, так что ветвь по умолчанию не определена. Таким образом, даже если f содержит некоторые пропуски в обучающем наборе данных, этот узел не имеет ветви по умолчанию. Тестовый экземпляр, попавший сюда, застрянет.

Может быть, вы правы, и ветка по умолчанию будет той, в которой будет больше примеров, если не будет отсутствующих пропусков. Я постараюсь связаться с авторами и опубликовать здесь ответ, если таковой имеется.

Другие вопросы по тегам