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

Обрезка решающих деревьев

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

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

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

Поэтому в качестве кандидатов на обрезку можно перебирать только предпоследние вершины, потом предпредпоследние и так далее снизу вверх по дереву, однако это также требует большого числа вычислений.

Чтобы сделать поиск кандидатов на обрезку более направленным и эффективным используется алгоритм обрезки по минимальной цене.

Алгоритм обрезки по минимальной цене

В алгоритме обрезки по минимальной цене (minimal cost-complexity pruning) дерево строится до самого низа (хотя также можно применять досрочный останов, например, по минимальному числу объектов в листьях), после чего для каждой внутренней вершины полного дерева оценивается целесообразность разрастания вершины до поддерева, сравнивая 2 ситуации:

  1. когда эта вершина имеет под собой исходное поддерево

  2. когда эта вершина является терминальной (без поддерева под ним).

Эти ситуации проиллюстрированы ниже для вершины tt:

DT-pruning.png

Обозначим AtA_t поддерево с корнем во внутренней вершине tt. Зададим штраф R(At)R(A_t), вычисляющий неточность прогнозов поддерева AtA_t как среднюю функцию неопределённости в листовых вершинах поддерева AtA_t или, для классификации, как просто среднюю частоту ошибок. Усреднение правильнее производить пропорционально числу объектов, попадающих в каждый лист дерева.

Дополнительно определим регуляризованный штраф Rα(At)=R(At)+αM(At)R_\alpha(A_t)=R(A_t)+\alpha M(A_t), который, помимо штрафа за неточность прогнозов, штрафует поддерево за сложность, вычисляемую как количество листьев M(At)M(A_t) в этом поддереве. При этом α>0\alpha>0 обозначает штраф за каждый дополнительный лист поддерева.

Найдём равновесное значение α\alpha^*, при котором регуляризованный штраф за поддерево AtA_t совпадёт с регуляризованным штрафом, когда поддерево AtA_t заменяется на его корень tt (в котором сразу будет строиться прогноз, как на рисунке выше):

Rα(At)=Rα(t)R_{\alpha^*}(A_t)=R_{\alpha^*}(t)

что можно переписать в виде

R(At)+αM(At)=R(t)+αR(A_t)+\alpha^* M(A_t)=R(t)+\alpha^*

поскольку поддерево tt состоит всего из одного листа.

Отсюда равновесное α\alpha^* будет равно:

α=R(t)R(At)M(At)1\alpha^*=\frac{R(t)-R(A_t)}{M(A_t)-1}

Равновесное α\alpha^* задаёт целесообразность разрастания внутренней вершины tt в поддерево AtA_t. Если оно равно нулю, то разрастание полностью нецелесообразно, поскольку одиночная вершина tt и образованное из неё поддерево AtA_t даёт одинаковый уровень ошибок. Но чем выше α\alpha^*, тем построение поддерева AtA_t целесообразнее, поскольку, чтобы компенсировать более высокую точность поддерева по сравнению с корнем, приходится сильнее штрафовать увеличение числа листов.

В алгоритме обрезки по минимальной цене вычисляются целесообразности α\alpha^* для каждого поддерева AtA_t полного дерева, после чего удаляется поддерево с минимальной целесообразностью. Далее α\alpha^* пересчитываются для всех оставшихся вершин (достаточно пересчитывать не для всех, а только для поддеревьев, затронутых удалением с предыдущего шага) и процесс повторяется до тех пор, пока не останется одна корневая вершина исходного дерева. Таким образом, алгоритм выдаст систему вложенных друг в друга поддеревьев

T1T2...TK=корень первоначального дерева,T_1\supset T_2 \supset ... \supset T_K=\text{корень первоначального дерева},

среди которых выбирается поддерево, дающее максимальную точность на валидационной выборке.