Как получить доступ к взвешиванию отдельных деревьев решений в 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, тем самым увеличивая время выполнения алгоритма.

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