Sobes.tech
Назад к вопросам
Senior
12

Что такое probabilistic programming (PyMC, Stan, NumPyro)?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Probabilistic programming — это способ описывать модель как набор вероятностных допущений, а не как жёсткую формулу. Вместо одного ответа система оценивает распределение возможных значений и неопределённость. Это особенно полезно, когда важно не только предсказать, но и понять доверие к прогнозу.

Определение:

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

Такие фреймворки, как PyMC, Stan и NumPyro, позволяют:

  • задавать вероятностную модель декларативно;
  • автоматически строить вывод по MCMC, variational inference или их вариациям;
  • работать с неопределённостью, иерархическими структурами и латентными переменными.

Пример использования:

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

import pymc as pm

with pm.Model() as model:
    p_control = pm.Beta("p_control", alpha=1, beta=1)
    p_treat = pm.Beta("p_treat", alpha=1, beta=1)

    y_control = pm.Binomial("y_control", n=1000, p=p_control, observed=120)
    y_treat = pm.Binomial("y_treat", n=980, p=p_treat, observed=140)

    diff = pm.Deterministic("diff", p_treat - p_control)

    trace = pm.sample(1000, tune=1000, chains=4)

Пояснение кода:

В этом примере код строит простую байесовскую модель двух конверсий.

  1. p_control и p_treat — неизвестные вероятности конверсии для контрольной и тестовой групп.
  2. Beta(1, 1) задаёт слабый априор: до наблюдений все значения вероятности считаются одинаково возможными.
  3. Binomial(...) связывает скрытые вероятности с наблюдаемыми данными: сколько успешных действий было при заданном числе пользователей.
  4. diff хранит разницу между конверсиями как производную величину, которую удобно анализировать.
  5. pm.sample(...) запускает MCMC-вывод и строит выборку из апостериорного распределения, а не одну точку.

После этого можно оценить:

  • среднюю разницу конверсий;
  • вероятность, что p_treat > p_control;
  • интервалы неопределённости для эффекта.

Ключевые моменты:

  • Probabilistic programming описывает не только модель, но и неопределённость в ней.
  • Главная цель — получить апостериорное распределение, а не одну оценку параметра.
  • PyMC и NumPyro чаще используют Python-экосистему, Stan — отдельный DSL с сильным inference engine.
  • Подход особенно полезен для байесовских моделей, иерархий, latent variables, A/B-тестов, GP и Bayesian optimization.
  • Основная цена — вычислительная сложность и необходимость понимать, как работает inference.
  • На практике важно уметь выбирать между MCMC, variational inference и более простыми приближениями.