TGViewer
Data Science | Machinelearning [ru] Data Science | Machinelearning [ru] @devsp · 19.8K subscribers
Post #5757 1.39K
⁣Аппроксимация оптимального порога бинаризации признаков в GBDT через дифференцируемую оценку информационного выигрыша

Классические GBDT ищут точки разбиения перебором на каждом узле. Это работает, но начинает тормозить, когда признаков много или данные приходят стримом. Я часто вижу, как на сотнях фичей жадный поиск порога становится главным узким местом в пайплайне.

Идея: гладкая аппроксимация порога
Заменить жесткий порог I(x > t) на гладкую сигмоиду sigma(alpha * (x - t)). Крутизна alpha управляет тем, насколько эта штука похожа на ступеньку. Теперь информационный выигрыш -- дифференцируемая функция от t. Можно гонять градиент и не перебирать варианты.

Пример на PyTorch:
def differentiable_gain(x, y, t, alpha=10):
weights = torch.sigmoid(alpha * (x - t))
left_weight = weights.mean()
right_weight = 1 - left_weight
left_var = (y * weights).sum() / (weights.sum() + 1e-8)
right_var = (y * (1 - weights)).sum() / ((1 - weights).sum() + 1e-8)
gain = left_weight * left_var + right_weight * right_var
return gain

t = nn.Parameter(torch.tensor(0.5))
optimizer = torch.optim.SGD([t], lr=0.01)
for _ in range(100):
loss = -differentiable_gain(x_data, y_data, t)
loss.backward()
optimizer.step()


Практические советы и trade-offs
-- Высокий alpha ближе к ступеньке, но градиенты становятся резкими -- без регуляризации будете ловить NaN. Рекомендую добавлять L2 на t или использовать gradient clipping.
-- Метод вывозит на разреженных задачах или признаках вроде текстовых эмбеддингов, где переборные пороги просто не имеют смысла. Например, для фичей с низкой entropy по классам перебор теряет время на бесполезные кандидаты.
-- В гибридных подходах типа NGBoost такое ускоряет обучение: не надо ждать, пока дерево переберет все варианты. Но не ждите gain-to-gain эквивалентности с дискретным разбиением -- это trade-off за скорость.

Предупреждение о типичной ошибке
Ошибка: думать, что alpha можно сделать бесконечно большим. Это приводит к взрыву градиентов и потере дифференцируемости. Держите alpha в диапазоне 5-20, и всегда проверяйте стабильность loss. При малом alpha аппроксимация грубая -- проигрываете в точности. Компромисс обычно есть, и он оправдывает себя по скорости.

Для тех, кто хочет глубже:
-- "Differentially Private GBDT with Smooth Thresholds" (2022) -- связь с приватностью и градиентами.
-- "XGBoost with Continuous Gradient" -- модификации от сообщества.

Вывод: Гладкая аппроксимация порога в GBDT -- это инженерный компромисс между точностью и скоростью, который критически важен для production ML с высокоразмерными или стриминговыми данными.
  • 👍 1
  • 🔥 1
More from @devsp
  1. Sep 25, 2026[Перевод] Jev за 25 строк на Python Про Jev галдят все, кому не лень. Jev там, Jev сям. Тв…
  2. Sep 25, 2026Что под капотом у рекомендаций Авито на главной Они решают две задачи: 1️⃣ Показывают поль…
  3. Sep 25, 2026🤣 «Смотря какой fabric, смотря какой details» 💥 xCode Journal
  4. Sep 24, 2026Post #5957
  5. Sep 24, 2026Как мы обучили детектор джейлбрейков для русскоязычных AI-агентов Привет, Хабр! На связи R…
  6. Sep 24, 2026Методология нейрослопа Нейронки прилипли к нам всерьёз и надолго. Снеси завтра OpenAI, Ant…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →