Решающие деревья
Структура модели
Решающее дерево — бинарное дерево, где каждая внутренняя вершина \(v\) содержит предикат \(\beta_v: \mathbb{X} \to \{0, 1\}\), а каждый лист содержит прогноз \(c_v \in \mathbb{Y}\).
Типичные предикаты:
- \(\beta_v(x) = [x_j \geq t]\) — самый простой и часто используемый.
- \(\beta_v(x) = [\langle w, x \rangle \geq t]\) — линейный предикат.
- \(\beta_v(x) = [\rho(x, x_0) \geq t]\) — предикат по расстоянию.
Как обучать деревья
Если в выборке нет двух одинаковых объектов с разными ответами, существует дерево с нулевой ошибкой на обучении. Найти наименьшее такое дерево — NP-трудная задача, поэтому используют жадные алгоритмы.
Алгоритм построения (псевдокод):
SplitNode(m, Rm):
если выполнен критерий останова:
c_m = средний ответ / самый частый класс
выход
иначе:
j, t = argmax Q(Rm, j, t)
Rl = {(x,y) in Rm | x_j < t}
Rr = {(x,y) in Rm | x_j >= t}
SplitNode(l, Rl)
SplitNode(r, Rr)
Критерии останова:
- Ограничение на максимальную глубину.
- Минимальное число объектов в листе.
- Допустимая доля ошибок в листе.
Критерии качества предиката (impurity)
\(H(R)\) — impurity, показывает разнородность ответов в регионе \(R\). Общий подход:
\[H(R) = \min_{c \in \mathbb{R}} \frac{1}{|R|} \sum_{(x,y) \in R} L(y_i, c)\]
Примеры для регрессии:
\[H(R_m) = \frac{1}{|R_m|} \sum_{(x,y) \in R_m} (y_i - \bar{y}_m)^2\]
Примеры для классификации (доля класса \(k\): \(p_k = \frac{1}{|R_m|} \sum [y_i = k]\)):
- Энтропия: \(H(R) = -\sum_k p_k \log p_k\)
- Критерий Джини: \(H(R) = \sum_k p_k(1 - p_k)\)
Функционал качества разбиения:
\[Q(R_m, j, t) = H(R_m) - \frac{|R_l|}{|R_m|} H(R_l) - \frac{|R_r|}{|R_m|} H(R_r)\]
Обработка пропусков
Вариант 1 — штраф за пропуски
Штрафуем предикат по признаку \(j\) пропорционально доле объектов без пропусков:
\[Q(R, j, t) = \frac{|R \setminus V_j|}{|R|}\ Q(R \setminus V_j(R),\ j, t)\]
Объекты с пропуском отправляем и влево, и вправо с весами \(\frac{|R_l|}{|R|}\) и \(\frac{|R_r|}{|R|}\).
Вариант 2 — суррогатный предикат
Выбираем лучший предикат \(\beta(x)\), затем ищем суррогатные \(\beta'(x), \beta''(x), \dots\), дающие похожее разбиение. На инференсе используем первый доступный предикат:
\[x \xrightarrow{\beta(x)\ \text{н/д}} \beta'(x) \xrightarrow{\text{н/д}} \beta''(x) \xrightarrow{\text{н/д}} \dots\]
Категориальные признаки
Для признака \(x_j \in \{u_1, \dots, u_q\}\) ищем оптимальное разбиение \(Q = Q_1 \sqcup Q_2\) и используем предикат \(\beta(x) = [x_j \in Q_1]\). Перебор всех \(2^{|Q|}\) разбиений заменяется линейным алгоритмом: сортируем категории по доле положительных объектов, затем перебираем префиксы.
Связь деревьев и линейных моделей
Дерево делит пространство на регионы \(\mathbb{X} = J_1 \sqcup \dots \sqcup J_n\) и выдаёт прогноз:
\[a(x) = \sum_{j=1}^n w_j [x \in J_j]\]
Индикаторы регионов — нелинейные признаки, а \(w_j\) — веса. То есть дерево само строит нелинейные признаки, а затем применяет к ним линейную модель. На этой идее основан метод PmXTree.