世界是一个不可预测的环境,而智能系统必须从嘈杂或混乱的输入中得出结论。概率理论(特别是贝叶斯定理)提供了一个系统的框架,用于整合以前的知识和实际信息。概率机器学习为建模不确定性、执行概率推理和生成预测或判断提供了一套强大的技术。本文重点介绍用PyMC3为一个回归问题建立贝叶斯层次模型。以下是将要涉及的主题。
内容列表
- 关于贝叶斯推理
- 概率编程的好处和坏处
- 用PyMC为回归问题建立贝叶斯层次结构模型
贝叶斯推断使用贝叶斯概率总结关于预测可能性的证据。让我们来看看对贝叶斯推断的高层次理解。
关于贝叶斯推理
贝叶斯定理是贝叶斯推理的基础。在贝叶斯推理中,事件被观察和参数集所取代,概率被密度所取代。观察的参数集的联合后验分布现在被定义为参数集的先验分布和观察的概率除以边际似然的产物。
观察的 "边际似然",也被称为 "先验预测分布",可以被设置为一个未知的常数c。对于y的边际似然,只采用先验概率的集合和模型的似然函数。观察的边际似然使联合后验分布正常化,保证它是一个合适的分布,可以整合成一个。
贝叶斯定理在基于模型的贝叶斯推理中被用来估计未归一化的联合后验分布,以便评估和推断边际后验分布。
贝叶斯推理的组成部分
- 参数集的先验分布在考虑数据之前使用概率来量化参数的不确定性。
- 在一个全面的概率模型中, 似然或似然函数描述了所有变量的连接方式。
- 在考虑了先验和数据后,联合后验分布表明了参数选择的不确定性。如果参数集被划分为一个感兴趣的参数,其余参数被认为是滋生参数,那么这个感兴趣的单一参数的密度就是边际后验分布。
概率编程的好处和坏处
有三个主要的好处:
不依赖于数据量
在概率编程中,个人可以将领域知识纳入模型,然后让模型从数据中边学边做。这是深度神经网络无法实现的。这意味着一个人可以从比典型机器学习所需的更少的数据开始。
不确定性转变为确定性
另一个重要的优势是,概率模型通常包括不确定性分布。因此,你将得到一个概率分布,而不是得到任何东西的概率。
让我们通过一个例子来理解这一点。假设我们正在开发一辆自动驾驶汽车。我们的人工智能对前方信号是绿灯的信心分数是0.99。我们有多大把握认为99%的数字是正确的?通常情况下,我们就是不知道。我们从概率编程中得到一个分布。也就是说,你知道,你有多确定,99%的可能性是正确的。
算法的高可解释性
可解释性在机器学习开发中是需要的,尽管它经常是一种稀有资源。许多机器学习模型从头到尾都是黑箱的,你不会知道为什么模型会得出某个结论。这在很多情况下是个问题。例如,考虑到你有一个提供贷款的金融机构。如果一个贷款申请被你的机器学习者拒绝了,那么要解释拒绝背后的原因就非常容易。概率编程的解释要容易得多。
概率论编程也有一些缺点。
技术上的挑战
因为这是一个新的领域,仍有某些技术问题有待解决。例如,推理通常相当迟缓,导致模型训练慢得令人难以置信。这个行业正在迅速发展,每天都有新的策略被开发出来,但目前你仍然需要跳过一些障碍。
这不是一个典型的编程
因此,这种范式包括编程、机器学习和统计技术。这是一个巨大的帮助组合,但也是一个对创造者有负担的组合。大多数开发人员没有接受过统计学教育,需要在这个领域获得新的技能。在寻找开发人员时,这使得发现合适的人变得有点困难。
使用PyMC的贝叶斯层次模型进行回归
PyMC是一个用于贝叶斯统计建模的Python库,专注于复杂的蒙特卡洛马尔科夫链和变异推理方法。它的适应性和可扩展性使其适用于广泛的挑战。
在这篇文章中,我们将用两个MC模拟链为一个回归问题建立一个层次化的贝叶斯模型。
本文中使用的数据与一个棒球队俱乐部有关。这个数据有23个特征,包括目标变量 "工资"。这个问题是一个回归问题,需要根据球员的历史数据来预测他们的薪水。
让我们检查一下PyMC是否存在
! pip show pymc3
印度分析杂志
如果没有,可以通过以下代码进行安装。
! pip install pymc3
导入库
import pymc3 as pm
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import arviz as az
读取和预处理数据
data=pd.read_csv("Hitters.csv")
data[:5]
当数据被加载时,有一些缺失值需要处理,并对分类列进行编码。
data_utils=data.dropna(axis=0)
from sklearn.preprocessing import LabelEncoder
encoder=LabelEncoder()
data_utils['League_enc']=encoder.fit_transform(data_utils['League'])
data_utils['Division_enc']=encoder.fit_transform(data_utils['Division'])
data_utils['NewLeague_enc']=encoder.fit_transform(data_utils['NewLeague'])
由于有23个特征包括目标变量,让我们检查一下是否可以做一些特征选择或特征消除。
import seaborn as sns
plt.figure(figsize=(15,8))
sns.heatmap(data_utils.corr(),annot=True)
plt.show()
印度分析杂志
在热图的帮助下,可以观察到有一些特征是相互高度相关的。所以,进行特征消除,消除大于0.8的列的相关度。
df=data_utils.drop(['AtBat', 'Hits','Runs', 'RBI','Years', 'CAtBat',
'CHits','CRuns', 'CRBI', 'CWalks'],axis=1)
X=df.drop(['League','Division','NewLeague','Salary'],axis=1)
y=df['Salary']
构建层次贝叶斯模型
with pm.Model() as hierarchical_model:
mu_a = pm.Normal('mu_alpha', mu=0., sigma=1)
sigma_a = pm.HalfCauchy('sigma_alpha', beta=1)
mu_b = pm.Normal('mu_beta', mu=0., sigma=1)
sigma_b = pm.HalfCauchy('sigma_beta', beta=1)
a = pm.Normal('alpha', mu=mu_a, sigma=sigma_a, shape=len(X))
b = pm.Normal('beta', mu=mu_b, sigma=sigma_b, shape=len(X))
eps = pm.HalfCauchy('eps', beta=1)
est = a[X['Division_enc']] + b[X['Division_enc']] * X['Errors'].values
y_like = pm.Normal('y', mu=est, sigma=eps, observed=y)
为了使用PyMC的模型,它必须被定义为一个 "with "语句,并且可以使用 "as "给一个别名。
在 "est "变量中,通过使用自变量 "Errors "来定义线性回归的公式,对于斜率和常数,正在利用 "Division_enc"。
由于问题是多变量线性回归,这就是使用分层建模的原因。
with hierarchical_model:
step = pm.NUTS()
hierarchical_trace = pm.sample(2000, tune=1000, init=None, step=step, cores=2, return_inferencedata=True)
在这一点上,我们要对模型的统计数据进行采样推断。在上面的创建2个有1000个曲子的样本链,并使用并行处理来减少时间。
印度分析杂志
让我们深入了解一下从样本函数中获得的推论。由于结果被存储在一个变量中,它可以很容易地被访问,不要忘记保存。
hierarchical_trace
印度分析杂志
如果点击下拉菜单(小箭头),它会展开,我们可以了解更多关于推论的内容。也许有另一种方法来访问推理,数据是以数据框的形式存在的,所以后验、对数、样本统计和观察数据是不同的列。这些可以像pandas数据帧一样处理。
hierarchical_trace['sample_stats']
印度分析杂志
让我们检查一下形成的链的树的深度。
hierarchical_trace.sample_stats["tree_depth"].plot(col="chain", ls="none", marker="o", alpha=0.3)
印度分析杂志
树越多,这里的预测是,第一条链有密集的二进制树,但第二条链没有,这意味着性能可以得到提高。但更多的树也意味着更多的时间。
让我们看一下后验分布。
az.plot_posterior(
hierarchical_trace, group="sample_stats", var_names="acceptance_rate", hdi_prob="hide", kind="hist"
)
印度分析杂志
分布的这种失真意味着观察数据中存在着离群值。也可以得出结论,形成的链并不稳定。
我们还可以绘制多元线性回归算法的α和β。
with hierarchical_model:
az.plot_trace(hierarchical_trace,var_names=['alpha','beta','mu_alpha','mu_beta'],figsize=(15, 20))
印度分析杂志
结论
贝叶斯模型是建立在我们对过去事件的了解上。先验代表你在接收数据之前对参数的理解。似然是给定参数值的数据的概率。鉴于数据,后验是参数的概率。先验、似然和后验分布通过贝叶斯定理联系起来。通过这篇文章,我们了解了贝叶斯推理及其实现,用PyMC解决了一个回归问题。