Может ли градиентный бустинг на деревьях дать отрицательное предсказание при положительной целевой переменной?

«Может ли градиентный бустинг на деревьях дать отрицательное предсказание при положительной целевой переменной?» — вопрос из категории Деревья и ансамбли, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

  1. Аддитивная природа бустинга: Предсказание — это сумма предсказаний последовательных деревьев. Каждое новое дерево вносит поправку (положительную или отрицательную) к остаткам предыдущего шага. Накопление отрицательных поправок может вывести итоговое значение в отрицательную область.
  2. Функция потерь: Стандартная регрессия с MSE минимизирует квадрат ошибки и не накладывает ограничений на выход модели.
  3. Начальное приближение (initial prediction): Часто это среднее значение целевой переменной, но алгоритм не гарантирует, что последующие шаги не сдвинут предсказание.

Пример с XGBoost:

import xgboost as xgb
import numpy as np

# Все таргеты положительные
X = np.array([[10], [20], [30], [40]])
y = np.array([15, 25, 35, 45])

model = xgb.XGBRegressor(n_estimators=10, max_depth=3)
model.fit(X, y)

# Предсказание для точки, выходящей за пределы обучающего диапазона по X
print(model.predict(np.array([[5]])))  # Может выдать, например, -2.1

Как с этим бороться в продакшене:

  • Трансформация таргета: Использовать np.log1p(y) для обучения и np.expm1(pred) для обратного преобразования.
  • Специфичные функции потерь: Например, 'reg:gamma' или 'reg:tweedie' в XGBoost для данных, имеющих природу счетов или величин.
  • Постобработка: Применить np.maximum(pred, 0) или порог, если отрицательные значения физически невозможны.