Какие значения могут принимать предсказания в случае бустинга?

Ответ

В задачах регрессии предсказания бустинга (например, Gradient Boosting, XGBoost, LightGBM) — это вещественные числа (ℝ), так как результат представляет собой взвешенную сумму предсказаний базовых моделей (обычно деревьев решений).

В задачах классификации значения зависят от реализации и функции потерь:

  • Бинарная классификация: Модель обычно предсказывает логарифм шансов (log-odds). Чтобы получить вероятность класса, это значение пропускается через сигмоидальную функцию.
  • Мультиклассовая классификация: Для K классов модель предсказывает K значений (логитов), которые затем преобразуются в вероятности с помощью функции softmax.

Пример с XGBoost:

import xgboost as xgb
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=20)
model = xgb.XGBClassifier(objective='binary:logistic')
model.fit(X, y)

# Получить "сырые" предсказания (логарифмы шансов) до преобразования в вероятность
raw_predictions = model.predict(X, output_margin=True)
print(f"Диапазон сырых предсказаний: от {raw_predictions.min():.2f} до {raw_predictions.max():.2f}")
# Вывод: Диапазон сырых предсказаний: от -X.XX до X.XX (ℝ)

# Получить вероятности
probabilities = model.predict_proba(X)[:, 1]
print(f"Диапазон вероятностей: от {probabilities.min():.2f} до {probabilities.max():.2f}")
# Вывод: Диапазон вероятностей: от 0.00 до 1.00

Ответ 18+ 🔞

А, ну ты про бустинг, да? Ну это ж классика, ебать мои старые костыли. Смотри, тут всё просто, как палка.

Вот представь, у тебя задача регрессии — типа цену на хату предсказать или сколько бензина тачка хавает. Так вот, бустинг (этот твой Gradient Boosting, XGBoost, LightGBM) на выходе тебе плюнет просто какое-то число. Вещественное. Потому что он, сука, тупо складывает предсказания кучи мелких дебильненьких моделек (обычно деревьев), как пазл. Получается что угодно, хоть -10, хоть +100500. Это ℝ, если по-умному.

А вот если классификация, тут уже начинается ёперный театр. Зависит от того, как реализовано и какая функция потерь.

  • Бинарная классификация (типа спам/не спам): Модель по сути предсказывает логарифм шансов (log-odds). Это типа сырое, необработанное число. А чтобы получить вменяемую вероятность, от 0 до 1, эту хуйню с горы пропускают через сигмоиду. Ну, логично же.
  • Мультикласс (типа определить, кот это, собака или хомяк): Тут уже предсказывается K значений (логитов), по одному на каждый класс. Потом через softmax это всё превращается в набор вероятностей, которые в сумме дают единицу. А то без этого нихуя не понятно.

Смотри на примере XGBoost, чтобы вообще ни хуя себе не путать:

import xgboost as xgb
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=1000, n_features=20)
model = xgb.XGBClassifier(objective='binary:logistic')
model.fit(X, y)

# Вот это ключевой момент! Получить "сырые" предсказания ДО того, как их в сигмоиду запихнули
raw_predictions = model.predict(X, output_margin=True)
print(f"Диапазон сырых предсказаний: от {raw_predictions.min():.2f} до {raw_predictions.max():.2f}")
# Вывод: Диапазон сырых предсказаний: от -X.XX до X.XX (ℝ) — вот они, логарифмы шансов, любые числа!

# А это уже привычные всем вероятности, после обработки
probabilities = model.predict_proba(X)[:, 1]
print(f"Диапазон вероятностей: от {probabilities.min():.2f} до {probabilities.max():.2f}")
# Вывод: Диапазон вероятностей: от 0.00 до 1.00 — всё аккуратно, красиво, для людей.

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