Перейти к основному содержимому

Интерпретация решающего дерева

Визуализация деревьев

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

decision-tree.png

Глобальная важность признаков

Можно оценивать значимость каждого признака для прогнозов решающего дерева в целом по выборке, используя среднее изменение неопределённости (mean decrease in impurity, MDI).

Рассмотрим задачу wine, в которой по характеристикам вина требуется предсказать его класс. Значимости каждого признака приведён ниже (источник):

DT-feature-importances.png

откуда сразу видно, что уровень пролина оказывается самым важным признаком.

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

Первичный анализ данных

Анализ самых значимых признаков - важный этап первичного анализа данных, который стоит применять, даже если вы не собираетесь впоследствии использовать сами решающие деревья!

Вклад признака в прогноз

Прогноз приписывается каждому листу простым усреднением откликов объектов, попавших в лист. В случае классификации усредняются one-hot закодированные метки классов, что на выходе даёт вектор предсказанных вероятностей классов. Но аналогично можно сопоставить прогноз и каждому промежуточному узлу. Это даёт возможность проинтерпретировать вклад каждого признака в прогноз на отдельном объекте x\mathbf{x}.

Пусть tt - узел дерева, Parent(t)\text{Parent}\left(t\right) - соответствующий родительский узел, root\text{root} - корень дерева, а path(x)\text{path}\left(\mathbf{x}\right) - путь от корня до листа, по которому объект x\mathbf{x} спустился вниз по дереву. Посчитаем для объекта x\mathbf{x} прогноз y^(t)\widehat{y}\left(t\right) в каждом промежуточном узле дерева tt вдоль пути path(x)\text{path}\left(\mathbf{x}\right). Итоговый прогноз можно декомпозировать по вкладу в него каждого узла:

y^(x)=tpath(x)\{root}y^(t)y^(Parent(t))\widehat{y}(\mathbf{x})=\sum_{t\in\text{path}\left(\mathbf{x}\right)\backslash\left\{ \text{root}\right\} }|\widehat{y}\left(t\right)-\widehat{y}\left(\text{Parent}\left(t\right)\right)|

Но нам нужен не вклад каждого узла, а вклад каждого признака в прогноз для интересующего объекта. Для этого для каждого признака ii найдём множество тех узлов TiT_i, где этот признак использовался в решающем правиле дерева.

Тогда вклад ii-го признака в прогноз y^(x)\hat{y}(\mathbf{x}) считается как суммарный вклад по узлам, учитывающим ii-й признак:

Importance(ix)=tpath(x)\{root}Tiy^(t)y^(Parent(t))\text{Importance}(i|\mathbf{x})=\sum_{t\in\text{path}\left(\mathbf{x}\right)\backslash\left\{ \text{root}\right\} \textcolor{red}{\cap T_i} }|\widehat{y}\left(t\right)-\widehat{y}\left(\text{Parent}\left(t\right)\right)|

Так мы рассчитаем вклад каждого признака в прогноз определённого объекта x\mathbf{x}. Обратим внимание, что

iImportance(ix)=y^(x),\sum_i \text{Importance}(i|\mathbf{x}) = \hat{y}(\mathbf{x}),

причём часть признаков будут влиять в плюс, а другая часть - в минус конечного прогноза.

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

Глобальная важность признака

Усредняя оценку важности по всем объектам выборки, получим глобальную важность признака, похожую по смыслу на меру среднего изменения неопределённости. Первая мера оценивает важность в терминах целевой переменной, а вторая - в терминах влияния на функцию неопределённости, по которой настраивалось дерево.