Как получить доступ к взвешиванию отдельных деревьев решений в xgboost?

Я использую xgboost для ранжирования с

param = {'objective':'rank:pairwise', 'booster':'gbtree'}

Как я понимаю, градиентные работы повышают, вычисляя взвешенную сумму выученных деревьев решений. Как я могу получить доступ к весам, которые присваиваются каждому учебному бустеру? Я хотел попытаться после обработки веса после тренировки ускорить шаг предсказания, но я не знаю, как получить индивидуальные веса. При использовании dump_model() в созданном файле могут отображаться разные деревья решений, но там не хранится взвешивание. В API я не нашел подходящей функции. Или я могу рассчитать вес вручную с параметром усадки eta?

Ответ 1

Каждому дереву присваивается одинаковый вес eta, и общее предсказание представляет собой сумму предсказаний каждого дерева, как вы говорите.

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

Предположим, что у нас есть 5 наблюдений с ответами 10, 20, 30, 40, 50. Первое дерево построено и дает прогнозы 12, 18, 27, 39, 54.

Теперь, если eta= 1, переменные ответа, переданные следующему дереву, будут -2, 2, 3, 1, -4 (т.е. разница между предсказанием и истинным ответом). Затем следующее дерево попытается узнать "шум", который не был захвачен первым деревом. Если nrounds= 2, то сумма предсказаний от двух деревьев даст окончательное предсказание модели.

Если вместо eta= 0,1, все деревья будут иметь свои прогнозы, уменьшенные на eta, поэтому первое дерево вместо этого "предсказывает" 1.2, 1.8, 2.7, 3.9, 5.4. Затем переменная ответа, переданная следующему дереву, будет иметь значения 8.8, 18.2, 27.3, 36.1, 44.6 (разница между масштабированным предсказанием и истинным ответом). Второй раунд затем использует эти значения ответа для построения другого дерева - и снова прогнозы масштабируются на eta. Так что дерево 2 предсказывает, скажем, 7, 18, 25, 40, 40, которые после масштабирования становятся 0.7, 1.8, 2.5, 4.0, 4.0. Как и раньше, третьему дереву будет передана разница между этими значениями и предыдущей переменной ответа дерева (так 8.1, 16.4, 24.8, 32.1. 40.6). Опять же, сумма предсказаний от всех деревьев даст окончательное предсказание.

Ясно, что когда eta= 0,1, а base_score равно 0, вам понадобится не менее 10 раундов, чтобы получить прогноз, который находится где угодно почти разумным. В общем, вам нужен абсолютный минимум 1/eta раундов и, как правило, намного больше.

Обоснование использования небольшого eta заключается в том, что модель выигрывает от небольших шагов к предсказанию, а не для того, чтобы дерево 1 выполняло большую часть работы. Это немного похоже на кристаллизацию - медленно охлаждается, и вы становитесь больше, лучше кристаллы. Недостатком является то, что вам нужно увеличить nrounds, тем самым увеличив время выполнения алгоритма.