Деревья решений с градиентным усилением

Подобно пакетированию и повышению, повышение градиента — это методология, применяемая поверх другого алгоритма машинного обучения. Неофициально повышение градиента включает в себя два типа моделей:

  • «слабая» модель машинного обучения, которая обычно представляет собой дерево решений.
  • «сильная» модель машинного обучения, состоящая из нескольких слабых моделей.

При повышении градиента на каждом этапе новая слабая модель обучается для прогнозирования «ошибки» текущей сильной модели (которая называется псевдоответом ). Мы подробно опишем «ошибку» позже. А пока предположим, что «ошибка» — это разница между прогнозом и регрессивной меткой. Слабая модель (то есть «ошибка») затем добавляется к сильной модели с отрицательным знаком, чтобы уменьшить ошибку сильной модели.

Повышение градиента является итеративным. Каждая итерация вызывает следующую формулу:

\[ F_{i+1} = F_i - f_i \]

где:

  • $F_i$ — сильная модель на шаге $i$.
  • $f_i$ — слабая модель на шаге $i$.

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

Давайте проиллюстрируем повышение градиента на простом наборе данных регрессии, где:

  • Цель состоит в том, чтобы предсказать $y$ из $x$.
  • Сильная модель инициализируется нулевой константой: $F_0(x) = 0$.
# Simplified example of regressive gradient boosting.

y = ... # the labels
x = ... # the features

strong_model = []
strong_predictions = np.zeros_like(y) # Initially, the strong model is empty.

for i in range(num_iters):

    # Error of the strong model
    error = strong_predictions - y

    # The weak model is a decision tree (see CART chapter)
    # without pruning and a maximum depth of 3.
    weak_model = tfdf.keras.CartModel(
        task=tfdf.keras.Task.REGRESSION,
        validation_ratio=0.0,
        max_depth=3)
    weak_model.fit(x=x, y=error)

    strong_model.append(weak_model)

    weak_predictions = weak_model.predict(x)[:,0]

    strong_predictions -= weak_predictions

Давайте применим этот код к следующему набору данных:

A plot of ground truth for one feature, x, and its label, y. The plot is a
series of somewhat damped sine
waves.

Рисунок 25. Синтетический регрессионный набор данных с одним числовым признаком.

Вот три графика после первой итерации алгоритма повышения градиента:

Three plots. The first plot shows the prediction of the strong model, which is
a straight line of slope 0 and y-intercept 0. The second plot shows the error of
the strong model, which is a series of sine waves. The third plot shows the
prediction of the weak model, which is a set of square
waves.

Рисунок 26. Три графика после первой итерации.

Обратите внимание на следующие моменты относительно графиков на рисунке 26:

  • Первый график показывает прогнозы сильной модели, которая в настоящее время всегда равна 0.
  • Второй график показывает ошибку, которая является признаком слабой модели.
  • Третий график показывает слабую модель.

Первая слабая модель изучает грубое представление метки и в основном фокусируется на левой части пространства признаков (часть с наибольшим разнообразием и, следовательно, наибольшим количеством ошибок для постоянной неправильной модели).

Ниже приведены те же графики для другой итерации алгоритма:

Three plots. The first plot shows the prediction of the strong model, which is
an inverse of the plot of the prediction of the weak model from the previous
Figure. The second plot shows the error of the strong model, which is a noisy
set of sine waves. The third plot shows the prediction of the weak model, which
is a couple of square
waves.

Рисунок 27. Три графика после второй итерации.

Обратите внимание на графики на рисунке 27:

  • Сильная модель теперь содержит прогноз слабой модели предыдущей итерации.
  • Новая ошибка сильной модели немного меньше.
  • Новое предсказание слабой модели теперь фокусируется на правой части пространства признаков.

Прогоняем алгоритм еще на 8 итераций:

The plots show the strong model gradually becoming closer to ground truth
while the prediction of the weak model gradually becomes, well,
weaker.

Рисунок 28. Три графика после третьей и десятой итерации.

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

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

Предыдущие графики показывают суть повышения градиента. Однако в этом примере отсутствуют следующие две реальные операции:

  • Усадка
  • Оптимизация значений листьев за один шаг метода Ньютона

Усадка

Слабая модель $f_i$ перед добавлением к сильной модели $F_i$ умножается на небольшое значение $\nu$ (например, $\nu = 0,1$). Эта небольшая величина называется усадкой . Другими словами, вместо каждой итерации используется следующая формула:

\[ F_{i+1} = F_i - f_i \]

Каждая итерация использует следующую формулу:

\[ F_{i+1} = F_i - \nu f_i \]

Сокращение при повышении градиента аналогично скорости обучения в нейронных сетях. Усадка контролирует скорость обучения сильной модели, что помогает ограничить переобучение. То есть значение усадки ближе к 0,0 уменьшает переобучение больше, чем значение усадки ближе к 1,0.

В нашем коде выше сжатие будет реализовано следующим образом:

shrinkage = 0.1   # 0.1 is a common shrinkage value.
strong_predictions -= shrinkage * weak_predictions