2016-06-03 7 views
3

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

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

ответ

1

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

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

0

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

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

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

+0

Я знаю, что прошло какое-то время с тех пор, как вы написали этот ответ, но мне было интересно, если вам удалась установить, что это такое, что xgboost делает во время предсказания, когда в наборе учебных данных не было недостающих значений? – ponadto

+0

Привет, пожалуйста, посмотрите на приведенный ниже ответ от T. Scharf – pmarini

6

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

+0

@TScharf – pmarini

+0

Обратите внимание, что тот же автор также сделал противоречивый комментарий здесь https://github.com/dmlc/xgboost/issues/21 # issuecomment-51982962. Таким образом, по существу выбираем направление, где коэффициент усиления максимальный. Любопытно, что оба комментария были сделаны в одно и то же время. – abhiieor

 Смежные вопросы

  • Нет связанных вопросов^_^