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

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

Чтобы проиллюстрировать, как байесовский вывод работает на практике, рассмотрим простой пример. Предположим, мы заинтересованы в прогнозировании вероятности покупки клиентом определенного продукта на основе его демографической информации и прошлой истории покупок. Мы могли бы подойти к этой проблеме, используя байесовский вывод, следующим образом:

  1. Определение априорного распределения вероятностей: мы начинаем с определения априорного распределения вероятностей, которое отражает наши убеждения о вероятности того, что клиент купит продукт, прежде чем мы получим какие-либо данные. Это предварительное распределение может быть основано на экспертных знаниях, исторических данных или других источниках информации.
  2. Сбор данных. Затем мы собираем данные о ряде клиентов, включая их демографическую информацию и историю прошлых покупок, а также информацию о том, купили ли они продукт.
  3. Обновление априорного распределения: используя теорему Байеса, мы обновляем априорное распределение вероятностей на основе наблюдаемых данных, чтобы получить апостериорное распределение вероятностей, которое отражает вероятность того, что клиент купит продукт, с учетом его демографической информации и прошлой истории покупок.
  4. Делайте прогнозы. Наконец, мы можем использовать апостериорное распределение, чтобы делать прогнозы о будущих клиентах, например, оценивать вероятность того, что новый клиент купит продукт, на основе их демографической информации и прошлой истории покупок.

Как во всем этом работает математика?

Предположим, мы наблюдали данные y и хотим оценить параметр θ. Мы начинаем с априорного распределения вероятностей p(θ), которое представляет наше первоначальное мнение о значении θ. Затем, после наблюдения за данными, мы обновляем наши представления о θ, вычисляя апостериорное распределение p(θ|y) с помощью теоремы Байеса:

p(θ|y) = p(y|θ) * p(θ) / p(y)

где p(y|θ) — функция правдоподобия, которая измеряет вероятность наблюдения данных y при заданном параметре θ, а p(y) — предельное правдоподобие или свидетельство, то есть вероятность наблюдая за данными y по всем возможным значениям θ. Апостериорное распределение p(θ|y) представляет обновленное мнение о значении θ с учетом наблюдаемых данных y.

Апостериорное распределение можно использовать для прогнозирования будущих данных путем вычисления апостериорного прогнозирующего распределения:

p(y_new|y) = ∫ p(y_new|θ) * p(θ|y) dθ

где p(y_new|θ) — вероятность новых данных с учетом параметра θ, а интеграл берется по всем возможным значениям θ. Апостериорное прогностическое распределение представляет собой распределение вероятностей новых данных с учетом наблюдаемых данных.

Заднее распределение:

Апостериорное распределение представляет обновленное распределение вероятностей интересующего параметра. Пример апостериорного распределения для простой модели с одним параметром:

import pymc3 as pm
import arviz as az
import numpy as np
import matplotlib.pyplot as plt

# Define the model
with pm.Model() as model:
    # Prior distribution
    theta = pm.Beta('theta', alpha=1, beta=1)
    # Observed data
    y = pm.Bernoulli('y', p=theta, observed=[1, 0, 1, 0, 1])

    # Compute the posterior distribution
    trace = pm.sample(1000, tune=1000)
    posterior = trace['theta']

# Plot the posterior distribution
az.plot_posterior(posterior)
plt.axvline(np.mean(posterior), color='red', linestyle='--')
plt.title('Posterior Distribution of Theta', fontsize=14)
plt.xlabel('Theta', fontsize=12)
plt.ylabel('Density', fontsize=12)
plt.show()

Сюжет трассировки:

График трассировки показывает выборки интересующего параметра из алгоритма Монте-Карло цепи Маркова (MCMC), используемого для оценки апостериорного распределения. Пример графика трассировки для простой модели с одним параметром:

import numpy as np
import matplotlib.pyplot as plt
import pymc3 as pm

# Define a simple model with a single parameter
with pm.Model() as model:
    mu = pm.Normal('mu', mu=0, sd=1)
    y_obs = pm.Normal('y_obs', mu=mu, sd=1, observed=[1, 2, 3])

# Use MCMC to estimate the posterior distribution
with model:
    trace = pm.sample(1000)

# Plot the trace plot
pm.traceplot(trace, var_names=['mu'], compact=True)
plt.xlabel('Parameter Value', fontsize=10)
plt.ylabel('Posterior Distribution', fontsize=10)
plt.title('Trace Plot of Posterior Distribution')
plt.show()

Пример:

Мы моделируем набор данных из 1000 клиентов, где у каждого клиента есть возраст и доход, а также бинарная история покупок, указывающая, покупали ли они продукт в прошлом. Мы определяем байесовскую модель, которая предполагает связь логистической регрессии между возрастом покупателя, его доходом и вероятностью покупки продукта. Мы используем нормальные распределения в качестве априорных для параметров модели и выбираем апостериорные распределения, используя методы Монте-Карло с цепями Маркова (MCMC).

import pymc3 as pm
import numpy as np
import matplotlib.pyplot as plt

# simulate customer data
np.random.seed(123)
N = 1000  # number of customers
age = np.random.normal(35, 10, N)  # customer ages
income = np.random.normal(50000, 10000, N)  # customer incomes
purchased = np.zeros(N, dtype=int)  # customer purchase histories
purchased[(age > 30) & (age < 40) & (income > 40000)] = np.random.binomial(1, 0.5, np.sum((age > 30) & (age < 40) & (income > 40000)))

# define Bayesian model
with pm.Model() as model:
    # prior distributions
    alpha = pm.Normal('alpha', mu=0, sd=10)
    beta_age = pm.Normal('beta_age', mu=0, sd=10)
    beta_income = pm.Normal('beta_income', mu=0, sd=10)

    # likelihood function
    p = pm.math.sigmoid(alpha + beta_age*age + beta_income*income)
    y = pm.Bernoulli('y', p=p, observed=purchased)

    # posterior sampling
    trace = pm.sample(1000, tune=1000)

# plot posterior distributions
pm.plot_posterior(trace, var_names=['alpha', 'beta_age', 'beta_income'])
plt.show()

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

Заключение:

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

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