TGViewer
Data Science | Machinelearning [ru] Data Science | Machinelearning [ru] @devsp · 19.8K subscribers
Post #5713 1.41K
⁣Когда GBDT молча убивает качество: детекция дрейфа на уровне дерева

Ловили такое: модель на продакшене внезапно начинает выдавать аномалии, а метрики ещё зелёные? Концептуальный дрейф в GBDT подкрадывается незаметно. Распределения признаков сдвигаются, и те самые "умные" границы разбиения становятся источником ошибок. Классический мониторинг F1 или AUC срабатывает как CHECK ENGINE — когда уже всё горит. Но есть способ для тех, кто копает глубже: смотреть статистики разбиения деревьев прямо в serving-пайплайне.

Идея: дрейф на уровне узлов дерева
GBDT принимает решения через цепочку бинарных разбиений (split point). Каждое дерево фиксирует конкретные границы на обучении. В онлайне мы считаем:
- сдвиг среднего значения в каждом узле относительно обучения;
- изменение дисперсии выборки, которая попадает в узел;
- резкое падение количества наблюдений на листьях (volume drop).

Реализация в serving-пайплайне
Добавляем в serving-пайплайн сбор статистик по каждому дереву (среднее, std, объём выборки). На каждом батче считаем агрегаты и сравниваем с эталоном через Hellinger distance или CUSUM. Находим "больные" деревья — те, где дрейф превышает порог.

def detect_tree_drift(model, X_online, threshold=3):
leaf_indices = model.predict(X_online, pred_leaf=True)
drift_scores = []
for tree_id in range(leaf_indices.shape[1]):
freq = np.bincount(leaf_indices[:, tree_id], minlength=model.num_leaves())
train_freq = model._Booster.dump_model()['tree_info'][tree_id]['leaf_freq']
h = np.sqrt(np.sum((np.sqrt(freq/sum(freq)) - np.sqrt(train_freq))**2))
drift_scores.append(h)
bad_trees = np.where(np.array(drift_scores) > threshold)[0]
return bad_trees


Когда это критично
- высокочастотная торговля или рекомендации, где концепт меняется за минуты;
- модели с Time2Vec или категориальными фичами, подверженными дрейфу;
- low-latency пайплайны, где переобучение каждые 5 минут дорого. Типичная ошибка — ждать падения метрик качества вместо мониторинга внутреннего состояния дерева.

Практический совет и trade-offs
Лайфхак: если процент плохих деревьев перевалил за 30% — пора бить тревогу. Но не обязательно переучивать всю модель: можно просто снизить веса "больных" деревьев или отключить их. Это даёт выигрыш в latency и cost по сравнению с полным ретренингом. Однако учитывайте, что отключение дерева может изменить композицию ансамбля и снизить interpretability — балансируйте между качеством и надёжностью.

Вывод: Детекция дрейфа на уровне разбиений деревьев даёт раннее предупреждение за 5-10 батчей до падения метрик, позволяя реагировать точечно, а не глобально.
  • 👍 2
  • 😁 1
More from @devsp
  1. Sep 26, 2026Тем, кто только лезет в ML Начинаешь щупать машинное обучение и хочешь нормально въехать в…
  2. Sep 26, 2026NVIDIA тоже подтянулась к тренду: LeetCode-собесы — на выход И весь замес — вокруг трёх те…
  3. Sep 26, 2026От готовых реплик до памяти о контексте: как AI-чаты дошли до нынешнего уровня В первой ча…
  4. Sep 26, 2026Post #5961
  5. Sep 25, 2026[Перевод] Jev за 25 строк на Python Про Jev галдят все, кому не лень. Jev там, Jev сям. Тв…
  6. Sep 25, 2026Что под капотом у рекомендаций Авито на главной Они решают две задачи: 1️⃣ Показывают поль…
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 →