Решающее дерево (Decision tree)

**Решающее дерево (Decision tree)**  — решение задачи обучения с учителем, основанный на том, как решает задачи прогнозирования человек. В общем случае — это k-ичное дерево с *решающими правилами* в нелистовых вершинах (узлах) и некотором заключении о целевой функции в листовых вершинах (*прогнозом*). *Решающее правило* — некоторая функция от объекта, позволяющее определить, в какую из дочерних вершин нужно поместить рассматриваемый объект. В листовых вершинах могут находиться разные объекты: класс, который нужно присвоить попавшему туда объекту (в задаче классификации), вероятности классов (в задаче классификации), непосредственно значение целевой функции (задача регрессии).

Чаще всего на практике используются **двоичные решающие деревья**.

## Алгоритм построения

В корне дерева — рассматриваем всю обучающую выборку.

1. Проверить критерий останова алгоритма. Если он выполняется, выбрать для узла выдаваемый прогноз, что можно сделать несколькими способами.
2. Иначе требуется разбить множество на несколько не пересекающихся. В общем случае в вершине

t

{\displaystyle t}

 задаётся решающее правило

Q

t

(
x
)

{\displaystyle Q\_{t}(x)}

, принимающее некоторый диапазон значений. Этот диапазон разбивается на

R
t

{\displaystyle R\_t}

 непересекающихся множеств объектов,

S

1

,

S

2

,
…
,

S

R

t

{\displaystyle S\_{1},S\_{2},\dots ,S\_{R\_{t}}}

, где

R
t

{\displaystyle R\_t}

 — количество потомков у вершины, а каждое

S
i

{\displaystyle S\_i}

 — это множество объектов, попавших в

i

{\displaystyle i}

-го потомка.
3. Множество в узле разбивается согласно выбранному правилу, для каждого узла алгоритм запускается рекурсивно.

## Решающие правила

 Чаще всего в качестве

Q

t

(
x
)

{\displaystyle Q\_{t}(x)}

 берут просто один из признаков, то есть

x

i
(
t
)

{\displaystyle x^{i(t)}}

.

Традиционные разбиения на диапазоны:

* S

t

(
j
# )

{

x
∈

X

:

h

j

≤

x

i
(
t
)

≤

h

j
1

}

{\displaystyle S\_{t}(j)=\left\{x\in \mathbb {X} :h\_{j}\leq x^{i(t)}\leq h\_{j+1}\right\}}

 для выбранных

h

1

,
…
,

h

j
1

{\displaystyle h\_{1},\dots ,h\_{j+1}}
* S

t

(
1
# )

{

x
∈

X

:
⟨
x
,
v
⟩
≤
0

}

;

S

t

(
2
# )

{

x
∈

X

:
⟨
x
,
v
⟩
>
0

}

{\displaystyle S\_{t}(1)=\left\{x\in \mathbb {X} :\langle x,v\rangle \leq 0\right\};S\_{t}(2)=\left\{x\in \mathbb {X} :\langle x,v\rangle >0\right\}}

 — по сути проверка угла.
* S

t

(
1
# )

{

x
∈

X

:
ρ
(
x
,

x

0

)
≤
h

}

;

S

t

(
2
# )

{

x
∈

X

:
ρ
(
x
,

x

0

)
>
h

}

{\displaystyle S\_{t}(1)=\left\{x\in \mathbb {X} :\rho (x,x\_{0})\leq h\right\};S\_{t}(2)=\left\{x\in \mathbb {X} :\rho (x,x\_{0})>h\right\}}

, где расстояние

ρ

{\displaystyle \rho}

 определено в некотором метрическом пространстве (например,

ρ
(
x
,
y
# )

x
−
y

{\displaystyle \rho(x, y) = |x - y|}

).
* S

t

(
1
# )

{

x
∈

X

:

x

i
(
t
)

≤
h

}

;

S

t

(
2
# )

{

x
∈

X

:

x

i
(
t
)

>
h

}

{\displaystyle S\_{t}(1)=\left\{x\in \mathbb {X} :x^{i(t)}\leq h\right\};S\_{t}(2)=\left\{x\in \mathbb {X} :x^{i(t)}>h\right\}}

 — **предикаты**,

⟨
x
,
v
⟩

{\displaystyle \langle x,v\rangle }

 — скалярное произведение векторов.

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

### Выбор оптимального решающего правила

Считаем, что решаем задачу многоклассовой классификации или регрессии в

R

{\displaystyle R}

-ичном дереве.

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

I

(
t
)

{\displaystyle \mathrm {I} (t)}

 измерения того, насколько разбросаны объекты (регрессия) или перемешаны классы (классификация) в некотором узле

t

{\displaystyle t}

. Эта мера называется критерием информативности.

Затем для каждого варианта решающего правила подсчитывается мера того, насколько будут разбросаны объекты (регрессия) или перемешаны классы (классификация) при таком разбиении:

Δ

I

(

X

t

,
t
# )

I

(

X

t

,
t
)
−

∑

# i
1

R

I

(

X

t

i

,

t

i

)

N
(

t

i

)

N
(
t
)

{\displaystyle \Delta \mathrm {I} (X\_{t},t)=\mathrm {I} (X\_{t},t)-\sum \_{i=1}^{R}\mathrm {I} (X\_{t\_{i}},t\_{i}){\frac {N(t\_{i})}{N(t)}}}

, где

R

{\displaystyle R}

 — на сколько узлов разбивается узел,

t

{\displaystyle t}

 — текущий узел,

t

1

,
…
,

t

R

{\displaystyle t\_{1},\dots ,t\_{R}}

 — узлы-потомки, получающиеся при выбранном разбиении,

N
(

t

i

)

{\displaystyle N(t\_{i})}

 — количество объектов обучающей выборки, попадающие в потомок

i

{\displaystyle i}

,

N
(
t
)

{\displaystyle N(t)}

 — попавших в текущий узел,

X

t

i

{\displaystyle X\_{t\_{i}}}

 — объекты, попавшие в

t
i

{\displaystyle t\_i}

-ую вершину.

Δ

I

(

X

t

,
t
)

{\displaystyle \Delta \mathrm {I} (X\_{t},t)}

 также называется **Information gain**, то есть сколько информации мы получим при таком разбиении. Для выбора решающего правила требуется взять argmax от неё по всевозможным признакам и параметрам семейства решающих правил. При таком взятии мы как раз и получим оптимальное разбиение множества объектов в текущей вершине.

## Критерии останова

Семинары Соколова, стр. 6

* Ограничение максимальной глубины дерева.
* Ограничение минимального числа объектов в листе.
* Ограничение максимального количества листьев в дереве.
* Останов в случае, если все объекты в вершине относятся к одному классу.
* Требование, что Information gain при дроблении улучшался как минимум на

s

{\displaystyle s}

 процентов.

## Стрижка

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

### Стрижка по валидационной выборке

Лекции Воронцова, 63-я минута.

Рассмотрим бинарное решающее дерево на примере задачи классификации.

Выделим валидационной выборку порядка половины размера всей выборки (или можно, например, разделить выборку на 2 части следующим образом:

2
3

{\displaystyle \tfrac{2}{3}}

 всей выборки оставить в качестве тренировочной,

1
3

{\displaystyle \tfrac{1}{3}}

 — в качестве валидационной)

Построим дерево по тренировочной выборке. Пропустим через построенное дерево валидационную выборку и рассмотрим любую внутреннюю вершину

t

{\displaystyle t}

 и её левую и правую вершины

L

t

,

R

t

{\displaystyle L\_{t},R\_{t}}

. Если до

t

{\displaystyle t}

 не дошло ни одного объекта из валидационной выборки, то говорим, что эта вершина (и все её поддеревья) незначимые и делаем из

t

{\displaystyle t}

 листовую (ставим в качестве предиката мажоритарный класс в этой вершине по тренировочной выборке). Если до

t

{\displaystyle t}

дошли объекты из валидационной выборки, то рассмотрим следующие 3 величины:

1. Число ошибок классификации поддеревом из вершины

t

{\displaystyle t}
2. Число ошибок классификации поддеревом из вершины

L

t

{\displaystyle L\_{t}}
3. Число ошибок классификации поддеревом из вершины

R
t

{\displaystyle R\_t}

Если в 1) Число ошибок классификации поддеревом из вершины

t

{\displaystyle t}

 равно 0, то значит делаем из

t

{\displaystyle t}

 листовую с соответствующим прогнозом для класса.

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

1. Ничего не делать
2. Заменить дерево из вершины

t

{\displaystyle t}

 деревом из вершины

L

t

{\displaystyle L\_{t}}
3. Заменить дерево из вершины

t

{\displaystyle t}

 деревом из вершины

R
t

{\displaystyle R\_t}

### Cost-complexity pruning

Семинары Соколова, стр. 6 – 7.

Обозначим дерево, полученное в результате работы жадного алгоритма, через

T
0

{\displaystyle T\_0}

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

R
(
T
)

{\displaystyle R(T)}

 будет минимально на самом дереве

T
0

{\displaystyle T\_0}

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

R

α

(
T
)

{\displaystyle R\_{\alpha }(T)}

, представляющий собой сумму исходного функционала

R
(
T
)

{\displaystyle R(T)}

 и штрафа за размер дерева:

R

α

(
T
# )
R
(
T
)
α

T

(
∗
)

{\displaystyle {\begin{array}{lr}R\_{\alpha }(T)=R(T)+\alpha |T|&(\*)\\\end{array}}}

где

T

{\displaystyle |T|}

 — число листьев в поддереве

T

{\displaystyle T}

 , а

α
>
0

{\displaystyle \alpha>0}

 — параметр. Это один из примеров регуляризованных критериев качества , которые ищут баланс между качеством
классификации обучающей выборки и сложностью построенной модели. В дальнейшем мы много раз будем сталкиваться с такими критериями.
Можно показать, что существует последовательность вложенных деревьев с
одинаковыми корнями:

T

K

⊂

T

K
−
1

⊂
⋯
⊂

T

0

{\displaystyle T\_{K}\subset T\_{K-1}\subset \dots \subset T\_{0}}

 ,
(здесь

T

K

{\displaystyle T\_{K}}

 — тривиальное дерево, состоящее из корня дерева

T
0

{\displaystyle T\_0}

), в которой каждое
дерево

T
i

{\displaystyle T\_i}

 минимизирует критерий

(
∗
)

{\displaystyle (\*)}

 для

α

{\displaystyle \alpha}

 из интервала

α
∈
[

α

i

,

α

i
1

)

{\displaystyle \alpha \in [\alpha \_{i},\alpha \_{i+1})}

, причем

# 0

α

0

<

α

1

<
⋯
<

α

K

<
∞

{\displaystyle 0=\alpha \_{0}<\alpha \_{1}<\dots <\alpha \_{K}<+\infty }

.
Эту последовательность можно достаточно эффективно найти путем обхода дерева.
Далее из нее выбирается оптимальное дерево по отложенной выборке или с помощью
кросс-валидации.

## Выбор прогноза в листе

* Самый простой способ — взять самый часто встречающийся класс среди объектов обучающей выборки, попавших в этот лист, для классификации или среднее целевых функций этих объектов для регрессии.

* В задачах классификации c

k

{\displaystyle k}

 классами в листе

t

{\displaystyle t}

 также можно хранить вероятности классов — например, по классической вероятности:

P

(
# y

y

i

x
# )

#

X

t

N
(
t
)

{\displaystyle \mathbb {P} (y=y\_{i}|x)={\dfrac {\#{X\_{t}}}{N(t)}}}

, где

Y

=
{

y

1

,

y

2

,
…
,

y

k

}

{\displaystyle \mathbb {Y} =\{y\_{1},y\_{2},\dots ,y\_{k}\}}

 — классы. Более подробно, как в таком случае выбирать класс, описано в обработке пропусков

* Если задана матрица штрафов, то есть в случае несимметричных потерь, можно минимизировать штраф и взять в качестве класса в листе

y
^

{\displaystyle \hat{y}}

:

y
^

=

argmin

y
∈

Y

∑

i

λ

y

i

y

{\displaystyle {\hat {y}}={\underset {y\in \mathbb {Y} }{\operatorname {argmin} }}\sum \_{i}\lambda \_{y\_{i}y}}

, где

λ

y

i

y

{\displaystyle \lambda \_{y\_{i}y}}

 — элементы матрицы штрафов.

* В регрессии — использовать функцию потерь, то есть:

y
^

=

argmin

y
∈

Y

∑

i

L
(
y
,

y

i

)

{\displaystyle {\hat {y}}={\underset {y\in \mathbb {Y} }{\operatorname {argmin} }}\sum \_{i}L(y,y\_{i})}

Выбор функции потерь в общем случае является параметром алгоритма.

## Прогнозирование

Для случая отсутствия пропущенных значений. Алгоритм: начиная с корня, применить к новому объекту решающее правило. Таким образом определяется, в какой потомок объект должен "попасть", и рекурсивно запустить этот процесс для него.

Сложность прогнозирования для одного объекта для полностью построенного дерева —

O
(
h
)

{\displaystyle O(h)}

, где

h

{\displaystyle h}

 — высота дерева. Вообще говоря, дерево может быть несбалансированным, поэтому оценка в

O
(
log
⁡
N
)

{\displaystyle O(\log N)}

, где

N

{\displaystyle N}

 — размер тренировочной выборки, не гарантируется.

## Метод обработки пропущенных значений

### Пропуск пропущенных значений

Лекции Воронцова, 59-я минута.

При обучении дерева объекты с пропущенными значениями у признака, по которому идет разбиение, игнорируются:

Δ

I

(

X

t

,
t
)
≈

#
{
x
∈

X

t

:

x

i
(
t
)

not missing

}

N
(
t
)

⋅
Δ

I

(
{
x
∈

X

t

:

x

i
(
t
)

not missing

}
,
t
)

{\displaystyle \Delta \mathrm {I} (X\_{t},t)\approx {\dfrac {\#\{x\in X\_{t}:x\_{i(t)}{\mbox{not missing}}\}}{N(t)}}\cdot \Delta \mathrm {I} (\{x\in X\_{t}:x\_{i(t)}{\mbox{not missing}}\},t)}

При построении прогноза при необходимости разбить подвыборку в вершине

t

{\displaystyle t}

 по отсутствующему признаку происходит следующая процедура: будем как бы предполагать, что этот признак принимает случайное значение. Определим по обучающей выборке вероятности, с которой новый объект попадёт к каждому потомку —

w

1

,

w

2

,
…
,

w

R

,

w

i

=

N
(

t

i

)

N
(
t
)

{\displaystyle w\_{1},w\_{2},\dots ,w\_{R},w\_{i}={\dfrac {N(t\_{i})}{N(t)}}}

. Затем отправим объект независимо к каждому потомку, получим прогнозы

y

1

,

y

2

,
…
,

y

R

{\displaystyle y\_{1},y\_{2},\dots ,y\_{R}}

. В случае регрессии это будут непосредственно значения целевой функции, в случае классификации — вероятности принадлежности какому-то зафиксированному классу

y

{\displaystyle y}

(который, как будет видно ниже, надо перебирать):

y

i

=

P

(
y

x
,

t

i

)

{\displaystyle y\_{i}=\mathbb {P} (y|x,t\_{i})}

Дальше можно поступать образом, схожим с выбором прогноза в листе: так, для регрессии можно просто объединить отклики с вероятностями в качестве весов,

y
^

=

w

1

y

1

⋯

w

R

y

R

{\displaystyle {\hat {y}}=w\_{1}y\_{1}+\dots +w\_{R}y\_{R}}

.

Пусть

t
0

{\displaystyle t\_0}

 — корень дерева.
В случае классификации

y
^

=

argmax

y
∈

Y

P

(
y

x
,

t

0

)

=

def

argmax

y
∈

Y

∑

# i
1

R

w

i

P

(
y

x
,

t

i

)

{\displaystyle {\hat {y}}={\underset {y\in \mathbb {Y} }{\operatorname {argmax} }}\mathbb {P} (y|x,t\_{0}){\overset {\mbox{def}}{=}}{\underset {y\in \mathbb {Y} }{\operatorname {argmax} }}\sum \_{i=1}^{R}w\_{i}\mathbb {P} (y|x,t\_{i})}

Такой алгоритм работы с пропущенными значениями используется в ID3, C4.5.

### Суррогатные разбиения

Находим другой признак, по которому разбиение будет максимально похожим.
Выкидываем те объекты, по которому по данному признаку есть пропущенные значения, делаем разбиение. Ищем другой признак (видимо, предполагаем, что по нему нет пропущенных значений, либо сразу выкидывать объекты с пропущенными значениями и по первому приведенному признаку и по второму), берем максимально похожее разбиение на изначальное. Например, можно сравнивать как можно большее пересечение левых и правых поддеревьев (в случае бинарного дерева).

Такой алгоритм работы с пропущенными значениями используется в CART

## Работа с категориальными признаками

 Вы можете помочь, кластеризовав информацию в этой статье.Возможно, следует разбить её на разделы или на несколько статей.

### One-hot кодирование

Из вершины

t

{\displaystyle t}

 делаем столько детей, сколько уникальных значений у категориального признака.

При таком подходе размер дерева увеличивается

⇒

{\displaystyle \Rightarrow}

 увеличивается риск переобучения.

### Перевод категориальных в вещественные

Семинары Соколова, стр. 8

Пусть категориальный признак

x
j

{\displaystyle x\_j}

 имеет
множество значений

# Q
{

u

1

,
…
,

u

q

}
,

Q

=
q

{\displaystyle Q=\{u\_{1},\dots ,u\_{q}\},|Q|=q}

. Разобьем множество значений на два непересекающихся подмножества:

# Q

Q

1

⨆

Q

2

{\displaystyle Q=Q\_{1}\bigsqcup Q\_{2}}

 , и определим предикат как индикатор
попадания в первое подмножество:

β
(
x
# )

I

[

x

j

∈

Q

1

]

{\displaystyle \beta (x)=\mathbb {I} [x\_{j}\in Q\_{1}]}

. Таким образом, объект будет попадать в левое поддерево, если признак

x
j

{\displaystyle x\_j}

 попадает в множество

Q
1

{\displaystyle Q\_1}

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

2

q
−
1

−
1

{\displaystyle 2^{q-1}-1}

 вариантов разбиения,что может быть не вполне возможным.

Оказывается, можно обойтись без полного перебора в случаях с бинарной классификацией и регрессией. Обозначим через

R

m

(
u
)

{\displaystyle R\_{m}(u)}

 множество объектов, которые
попали в вершину

m

{\displaystyle m}

 и у которых

j

{\displaystyle j}

-й признак имеет значение

u

{\displaystyle u}

; через

N

m

(
u
)

{\displaystyle N\_{m}(u)}

 обозначим количество таких объектов.
В случае с бинарной классификацией упорядочим все значения категориального признака на основе того, какая доля объектов с таким значением имеет класс

1

{\displaystyle +1}

:

1

N

m

(

u

(
1
)

)

∑

x

i

∈

R

m

(

u

(
1
)

)

I

[

y

i

=
1
]
≤
⋯
≤

1

N

m

(

u

(
q
)

)

∑

x

i

∈

R

m

(

u

(
q
)

)

I

[

y

i

=
1
]

{\displaystyle {\dfrac {1}{N\_{m}(u\_{(1)})}}\sum \_{x\_{i}\in R\_{m}(u\_{(1)})}\mathbb {I} [y\_{i}=+1]\leq \dots \leq {\dfrac {1}{N\_{m}(u\_{(q)})}}\sum \_{x\_{i}\in R\_{m}(u\_{(q)})}\mathbb {I} [y\_{i}=+1]}

после чего заменим категорию

u

(
i
)

{\displaystyle u\_{(i)}}

 на число

i

{\displaystyle i}

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

2

q
−
1

−
1

{\displaystyle 2^{q-1}-1}

 вариантам.
Для задачи регрессии с MSE-функционалом это тоже будет верно, если упорядочивать значения признака по среднему ответу объектов с таким значением:

1

N

m

(

u

(
1
)

)

∑

x

i

∈

R

m

(

u

(
1
)

)

y

i

≤
⋯
≤

1

N

m

(

u

(
q
)

)

∑

x

i

∈

R

m

(

u

(
q
)

)

y

i

{\displaystyle {\dfrac {1}{N\_{m}(u\_{(1)})}}\sum \_{x\_{i}\in R\_{m}(u\_{(1)})}y\_{i}\leq \dots \leq {\dfrac {1}{N\_{m}(u\_{(q)})}}\sum \_{x\_{i}\in R\_{m}(u\_{(q)})}y\_{i}}

## CART-деревья

Реализация решающего дерева — за подробностями милости просим сюда.