В этой статье обсуждается концепция байесовского вывода, вероятностного подхода к машинному обучению, который включает обновление априорного распределения вероятностей на основе наблюдаемых данных. В нем исследуется использование байесовского вывода для прогнозирования будущих данных на основе имеющихся данных.
Байесовский вывод — это мощный подход к машинному обучению, который позволяет нам делать прогнозы и принимать решения на основе неполной или недостоверной информации. По своей сути байесовский вывод включает в себя обновление априорного распределения вероятностей на основе новых данных, что позволяет нам получить апостериорное распределение вероятностей, отражающее вероятность различных исходов с учетом имеющихся данных.
Чтобы проиллюстрировать, как байесовский вывод работает на практике, рассмотрим простой пример. Предположим, мы заинтересованы в прогнозировании вероятности покупки клиентом определенного продукта на основе его демографической информации и прошлой истории покупок. Мы могли бы подойти к этой проблеме, используя байесовский вывод, следующим образом:
- Определение априорного распределения вероятностей: мы начинаем с определения априорного распределения вероятностей, которое отражает наши убеждения о вероятности того, что клиент купит продукт, прежде чем мы получим какие-либо данные. Это предварительное распределение может быть основано на экспертных знаниях, исторических данных или других источниках информации.
- Сбор данных. Затем мы собираем данные о ряде клиентов, включая их демографическую информацию и историю прошлых покупок, а также информацию о том, купили ли они продукт.
- Обновление априорного распределения: используя теорему Байеса, мы обновляем априорное распределение вероятностей на основе наблюдаемых данных, чтобы получить апостериорное распределение вероятностей, которое отражает вероятность того, что клиент купит продукт, с учетом его демографической информации и прошлой истории покупок.
- Делайте прогнозы. Наконец, мы можем использовать апостериорное распределение, чтобы делать прогнозы о будущих клиентах, например, оценивать вероятность того, что новый клиент купит продукт, на основе их демографической информации и прошлой истории покупок.
Как во всем этом работает математика?
Предположим, мы наблюдали данные 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
). Распределения дают информацию о наиболее вероятных значениях параметров (обозначаются пиками распределений), а также о неопределенности и достоверности оценок (обозначаются шириной и формой распределений). Например, график предполагает, что возраст и доход положительно связаны с вероятностью покупки продукта. В то же время перехват близок к нулю, что указывает на отсутствие сильной предвзятости в отношении покупки или отказа от покупки на основе демографической информации клиента.
Заключение:
Байесовский вывод — это мощный подход к машинному обучению, который обеспечивает основу для вероятностных рассуждений и принятия решений. Включая предшествующие знания и обновляя их на основе наблюдаемых данных, байесовский вывод можно использовать для точных прогнозов и решений в широком диапазоне приложений, от персонализированного маркетинга до медицинской диагностики.
Хотя байесовский вывод может потребовать больше вычислительных ресурсов, чем другие методы машинного обучения, последние алгоритмы и достижения в области вычислительных ресурсов сделали его более доступным и практичным для реальных приложений. Кроме того, возможность количественной оценки неопределенности и включения априорных знаний делает байесовский вывод особенно ценным в ситуациях, когда данные ограничены или зашумлены.