Я ищу объяснение того, как относительная важность переменной вычисляется в деревьях с градиентным усилением, которое не является слишком общим / упрощенным, например:
Измерения основаны на количестве раз, которое переменная была выбрана для расщепления, взвешенной по квадрату улучшения модели в результате каждого расщепления и усредненном по всем деревьям . [ Элит и др. 2008, Рабочее руководство по ускоренным деревьям регрессии. ]
И это менее абстрактно, чем:
Там , где суммирование ведется по нетерминалу узлы из терминальном узла дерева , является переменным расщепление , связанный с узлом и является соответствующим эмпирическим улучшением в квадрате ошибки в результате разделения, определяемого как , где - левое и правое дочерние средства ответа соответственно, а w_ { l}, w_ {r} - соответствующие суммы весов. J T v t t ^ i 2 t i 2 ( R l , R r ) = w l w r[ Фридман 2001, приближение функции Жадности: машина повышения градиента ]
Наконец, я не нашел Элементы Статистического Обучения (Hastie et al. 2008) очень полезными для прочтения здесь, так как соответствующий раздел (10.13.1 стр. 367) на вкус очень похож на вторую ссылку выше (которая может быть объяснена тем, что Фридман является соавтором книги).
PS: я знаю, что относительные переменные значения важности даны summary.gbm в пакете gbm R. Я пытался исследовать исходный код, но я не могу найти, где происходит фактическое вычисление.
Брауни указывает: мне интересно, как получить эти участки в R.
Ответы:
Я буду использовать код sklearn , так как он, как правило, намного чище, чем
R
код.Вот реализация свойства feature_importances класса GradientBoostingClassifier (я удалил несколько строк кода, которые мешают концептуальным вещам)
Это довольно легко понять.
self.estimators_
это массив, содержащий отдельные деревья в бустере, поэтому цикл for выполняет итерации по отдельным деревьям. Есть один сбой сэто заботится о случае недвоичного ответа. Здесь мы вписываем несколько деревьев на каждом этапе по принципу «один против всех». Проще всего концептуально сосредоточиться на двоичном случае, где сумма имеет одно слагаемое, и это справедливо
tree.feature_importances_
. Таким образом, в двоичном случае, мы можем переписать все это какИтак, на словах, суммируйте значения свойств отдельных деревьев, а затем разделите на общее количество деревьев . Осталось посмотреть, как рассчитать значения объектов для одного дерева.
Вычисление важности дерева реализовано на уровне Cython , но оно все еще можно отслеживать. Вот очищенная версия кода
Это довольно просто. Итерация по узлам дерева. Пока вы не находитесь на листовом узле, рассчитайте взвешенное снижение чистоты узла из разделения на этом узле и отнесите его к объекту, который был разделен на
Затем, когда это будет сделано, разделите все это на общий вес данных (в большинстве случаев количество наблюдений)
Стоит напомнить, что примесь - это общее название для метрики, которое используется при определении того, что разделить, чтобы сделать при выращивании дерева. В этом свете мы просто суммируем, насколько расщепление на каждом объекте позволило нам уменьшить примеси во всех расщеплениях в дереве.
В контексте повышения градиента эти деревья всегда являются деревьями регрессии (жадно минимизируют квадратичную ошибку), подходящими для градиента функции потерь.
источник