使用 Fastai 的贝叶斯深度学习:如何不确定自己的不确定性!
Bobby Axelrod speaks the words!
今天,神经网络已经成为许多领域的头条新闻,如癌症组织的图像分类,文本生成,甚至信用评分。然而,这些模型很少解决的一个大问题是预测的不确定性。
当我们人类学习时,我们最大的优势之一是知道我们的弱点,并且在有太多不确定性时不采取行动。然而,对于大多数机器学习模型来说,情况并非如此,在这些模型中,决策是在没有考虑不确定性的情况下做出的。
例如,如果你训练一个关于猫和狗的分类器,它将只能输出猫或狗。但如果你给它一张卡车的图片,模型仍然会做出预测,有时概率很大,即猫的概率接近 1,狗的概率接近 0,而你的模型应该简单地说“好吧,这是我无法识别的东西”。当我们着眼于医疗应用时,这一点尤其重要,因为医疗应用必须处理不确定性。
因此,理想情况下,我们希望有一种方法在我们的模型中添加不确定性评估,以便知道模型何时不应做出决定,并将其传递给能够做出正确决定的人,以帮助模型学习。这被称为主动学习,我们将在另一篇文章中讨论这个话题。
最后,获得不确定性的度量是非常可取的,因为这是我们人类所拥有的,而大多数模型都缺乏。在本文中,我们将看到如何在我们的模型中用几行代码实现这一点,并看到流行任务的结果,如情感分析、图像分类或信用评分。
一.快速浏览贝叶斯神经网络
Bayesian Neural Networks seen as an ensemble of learners
贝叶斯神经网络(BNNs)是一种在我们的模型中增加不确定性处理的方法。这个想法很简单,我们不是学习确定性权重,而是学习随机变量的参数,我们将使用这些参数在前向传播过程中对权重进行采样。然后,为了学习参数,我们将使用反向传播,有时用一点小技巧使我们的参数可微。
Comparison of a standard NN with a Bayesian NN
这张图可以帮助你理解其中的区别。虽然常规 NN 通过将预测损失反向传播到权重来学习权重,但这里我们使用分布的参数(这里是高斯分布)对 W 进行采样,并照常进行,但这次我们一直反向传播到高斯分布的参数(这里是均值和方差)。
尽管乍一看,使用随机变量而不是确定性权重来对权重进行采样似乎很奇怪,但如果您认为这不是一个单一的网络,而是一个潜在的无限网络集合,这实际上是有意义的。
事实上,每次你对你的网络的权重进行采样,就像从一个群体中采样一个批评家,并且每次向前传递可以有不同的输出,因为对于你采样的每个批评家。即使你可能有大量(甚至无限)的批评者,每个批评者都将帮助整个群体变得更好,因为我们将对这个给定批评者的表现使用反向传播,以适应整个群体的参数。在上面的例子中,我们不是只学习 W ,而是学习 W 的均值和方差。
所以最后,使用贝叶斯神经网络时的训练过程如下:
- 从 BNN 分布的随机参数开始,即使用一些参数初始化您的总体,例如,如果您想要高斯权重,从 0 均值和单位方差开始。
- 对于训练循环中的每一批:
-根据与每一层相关的分布对你的体重进行抽样。
-使用这些权重进行正向传递,就像使用常规网络一样
-将损失反向传递给生成权重的分布参数
数学细节将在另一篇文章中解释,这里我们将只关注 bnn 如何工作的全局思想,所以如果你记得 bnn 的行为就像一种神经网络的集合,这已经是很好的一步了!
那么最后,为什么我们要学习权重的概率分布,而不是直接学习权重呢?有两个主要原因:
- 首先,这防止了过度拟合
- 第二,这允许我们得到不确定性估计
我们将更详细地讨论第二点。事实上,因为我们的模型本质上是随机的,所以对于相同的输入,我们的模型可以有不同的输出,因为对于每个前向传递,我们将有不同的权重被采样,因此可能有不同的输出。
然后,您可以选择采样 T 次,这样您将拥有 T 不同的权重,以及 T 不同的输出。因此,您现在可以通过对这些结果进行平均来进行投票,但是您也可以计算方差来查看您的模型之间的一致程度!
通过相同输入的预测方差,贝叶斯神经网络能够输出关于其预测的不确定性。让我们来看看下面这个简单的回归问题:
Source : http://www.cs.ox.ac.uk/people/yarin.gal/website/blog_3d801aa532c1ce.html
这里,我们使用蓝色虚线之前的训练数据点,并要求模型预测虚线之前和之后的点。我们训练一个贝叶斯神经网络,输出几个我们平均的估计值,并基于方差用置信区间来绘制它。
有趣的是,我们注意到模型在左侧输出的点没有任何差异,正如在训练期间所看到的那样,模型对其预测很有信心,但之后,随着我们看到的点离我们的训练集越来越远,差异也在增加。
这是意料之中的,因为我们不知道虚线之外是什么,所以我们越往前走,不确定性越大的模型是合理的。
现在我们已经了解了贝叶斯神经网络的原理,以及如何使用它们来输出模型的不确定性,我们将看到一种简单的方法,用几行代码就可以使您的模型贝叶斯化!
二。辍学作为一种方式,使你的 NNs 贝叶斯
Dropout 是一种流行的正则化技术,其目标是通过在给定层中随机将激活设置为零来帮助减少过拟合。
Illustration of Dropout from the paper “Dropout: A Simple Way to Prevent Neural Networks fromOverfitting”
这个想法很简单,我们不希望让一些神经元变得过于专业,只依赖这些神经元进行预测,因此我们在我们的层中随机置零神经元,每层都有不同的丢失概率 p 。这样,没有神经元变得过度专业化,这是一种确保所有神经元都对预测做出贡献的方法,而不会过度拟合。
Dropout 通常以下列方式使用:
- 在训练过程中,我们激活 Dropout,这意味着我们每一层都有不同的概率丢弃神经元。一旦神经元被丢弃,我们通常会除以保留神经元的概率,以保持相同的数量级。
- 在推理过程中,我们停用丢弃,因此我们使用所有的神经元,并且我们的输出是完全确定的,因为随机丢弃神经元的随机部分被关闭。
那么辍学和贝叶斯神经网络有什么关系呢?嗯,使用辍学可以被视为使用伯努利随机变量来采样你的权重,因此简单地添加辍学,你使你的神经网络贝叶斯!
数学在论文“作为贝叶斯近似的辍学:表示深度学习中的模型不确定性”中进行了探索。我强烈推荐你阅读,尽管乍一看并不容易,但它解释了作为贝叶斯神经网络的辍学背后的许多理论,尤其是它们涵盖了什么是先验、后验和相关的 KL 项,但我们将在另一篇文章中讨论这一点。
因此,通过简单地添加 Dropout,我们现在了解了一个贝叶斯模型,其中权重是从行(或列,取决于矩阵乘法是如何完成的)伯努利分布中采样的。需要注意的一点是,训练将与之前完全相同,唯一的区别是在推断过程中,我们不关闭随机性,而是采样几个权重,将其传递给前向传递,并获得输出的分布。我们在推断过程中使用多个权重样本的事实被称为蒙特卡洛遗漏(或 MC 遗漏)。
How Dropout creates an ensemble of NNs which can output a distribution of results
在这里,我们可以看到压差如何为我们提供不同的网络,每个网络提供不同的输出,这允许我们对网络的输出进行分布。这样,我们就可以知道有不确定性度量,比如方差用于回归,或者如我们将看到的,熵用于分类。
因此,在我们用具体的例子探究这些结果之前,让我总结一下我们目前所看到的一切:
- 贝叶斯神经网络使用权重的概率分布,而不是具有确定性的权重。每次向前传递将采样不同的权重,因此具有不同的输出。人们可以将贝叶斯神经网络视为不具有单一模型,而是模型的集合,这为每个样本提供了不同的预测器。
- 假设相同的输入在向前传递后可以有不同的输出,我们可以通过查看不同预测的方差来了解我们的模型有多确定,因为如果模型不确定,我们预计方差会很高。
- 辍学是一种让你的神经网络贝叶斯几乎免费的方式,在推理过程中使用它,你只需要保持辍学,并对几个模型进行采样,这被称为 MC 辍学。
三世。探索 MC 辍学的 Fastai 示例
现在我们已经看到了 bnn 是如何工作的,以及如何用 Dropout 轻松地实现它们,我们现在将看到一些使用 Fastai 的例子。
代码可以在这个 Github 的资源库中找到:https://github.com/DanyWind/fastai_bayesian,如果你想直接在 Colab 上运行,这里有链接:https://Colab . research . Google . com/drive/1 bifawl _ o _ _ zkfsvve 9994 wj2 CFD 9976 I
无论任务是什么,流程都是一样的:
- 首先用我们都知道的 Fastai API 训练你的模型:lr_find,fit_one_cycle 等…
- 最后,要在 MC Dropout 推断期间保持 Dropout,只需添加以下代码行:
定义函数和类的代码行就在这里,它们并不复杂。我选择用一个模块函数来替换另一个模块,因为我们将在以后的文章中使用它来计算自动退学率。
Colab 中也定义了度量标准,但我们不会涉及它们,因为它非常标准。我们将特别使用一个只对分类有效的不确定性度量:熵。
如果有 C 类要预测,并且我们采样 T 倍我们的模型进行推断,那么熵被定义为:
Definition of Entropy
这个度量可以看作是对无序度的度量,无序度越高,我们模型的不确定性就越高。这比简单地查看分类概率的方差更有意义,因为 softmax 有压缩一切的趋势。
A .猫狗分类器
Cats and Dogs dataset
在这里,我们将重点放在猫和狗的数据集。从这张图片上可以看出,我们将尝试对图片上的狗或猫的品种进行分类。
我不会详细介绍如何训练该模型,这是使用 Resnet34 的经典迁移学习,您可以直接查看代码以了解更多细节。
更有趣的是,用我们用辍学训练的模型做推断,看看猫和狗的常规图像,也看看分布图像,看看模型有多确定。
Entropy of regular and out of distribution images
正如您在这里看到的,已知模型的图像具有低熵,而完全不在分布范围内的图像具有高熵。有趣的是,我们注意到 softmax 的概率并没有给出不确定性的信息,因为在 Colab 笔记本中,我们可以看到分配给夜王类的最高概率是 90%,甚至超过了猫的 78%!
您可以看到,在某些应用中,测量不确定性是多么重要,尤其是在医疗领域,例如,如果我们想对一个人是否应该接受化疗进行分类,我们希望知道我们的模型有多确定,如果不确定,就让一个人参与进来。
Distribution of entropy based on classification results on Cats and Dogs
每个分类结果的熵分布直方图也可以帮助我们诊断我们的模型。正如我们在上面可以看到的,当我们的模型正确执行时,即当存在真阳性或真阴性时,我们观察到熵往往比它错误时(即假阳性和假阴性)低得多。
有趣的是,无论我们的模型正确与否,熵的表现都是不同的,高熵似乎与错误分类高度相关!如果我们回头看看夜王的例子,我们会发现 2.2 的熵确实很高,并且通常出现在错误分类的样本中,而普通猫的熵通常只有 0.7。
B .使用 IMDB 评论进行情感分析
现在我们将快速回顾另一个著名的数据集:IMDB 评论。这个数据集只是收集正面和负面的评论。这里我们将跳过绘制直方图,直接显示数据集最确定和最不确定的样本:
下面的评论拥有最高的熵,这是可以理解的,因为评论很难定义是好是坏。即使我们人类可以感觉到整体情绪是好的,但这也不是微不足道的,我们可以预计机器会更加挣扎。
(Text xxbos xxmaj just got my copy of this xxup dvd two disc set and while not perfect , i found the overall experience to be a fun way to waste some time . i have to say right up front that i am a huge fan of xxmaj zombie movies , and i truly think that the fine people who made these films must be too . i also have a soft spot for people who are trying , sometimes against all odds , to live a dream . xxmaj and again , these people are doing it . xxmaj is this some award - winning collection of amazing film ? xxmaj no . xxmaj not even close . xxmaj but for what they do on their xxunk xxunk , these films should be recommended . xxmaj for me , the bottom line is always , was i entertained ? xxmaj did i have a good time with this movie ? xxmaj and here the answer to both was " xxmaj yes ... Category positive)
C .成年人收入分类表
最后,我们将在这里探索成人收入数据集,我们试图根据社会经济变量来预测某人的年收入是否超过 5 万英镑。我们也将看看最确定和不确定的预测。
我认为这个例子很有趣,因为它可能会对没有考虑不确定性的模型提出一些伦理问题。
事实上,该模型对预测某人是否有高工资非常有信心,这些人通常是白人、男性和受过高等教育的人。因此,该模型很容易区分这些情况。
但另一方面,当处理第二种更困难的情况时,这个模型就更不确定了,比如一个白人男性,受过一些大学教育,工作时间比平均水平长得多。这里的模型是相当不确定的,因为这个人可能在 50K 以上或以下。相反,如果目标是决定是否给予信用,一个好的模型应该让人类在存在巨大不确定性时决定是否做出决定,我们可能会重现模型中可能存在的偏差。
结论
在这篇文章中,我们已经看到了贝叶斯神经网络是什么,我们如何在已经训练好的架构上快速使用它们的属性,通过使用简单的 MC Dropout 在推断过程中简单地利用 Dropout,最后我们如何通过这些模型获得不确定性估计。
这些不确定性估计是宝贵的,因为它们在人工智能的大多数应用中是至关重要的,不仅可以为可信任的人工智能提供保障,而且正如我们将在未来的文章中看到的那样,还可以帮助我们通过主动学习将人类置于循环中。
所以,我希望你喜欢读这篇文章,如果能得到你的反馈,那就太好了,我会在未来试着发布更多的文章。
如果您有任何问题,请不要犹豫,通过 Linkedin 联系我,您也可以通过 Twitter 找到我!
贝叶斯超参数优化
调整机器学习模型的明智方法
超参数是用于调整机器学习算法学习方式的旋钮、杠杆和螺钉。你可以从一个适当调整的机器学习系统中获得更高的性能。
行业状况
超参数在机器学习领域中最常见的使用方式是,要么盲目地使用默认值,要么使用在另一个问题上似乎很有效的超参数的某种组合,或者你在互联网上看到有人“尊敬”地使用。其他修炼者使用网格搜索或者随机搜索。这些具有可大规模分发的优势。但是它们是蛮力的,并且在计算上极其昂贵。他们浪费了大量的试验,在超参数空间的愚蠢部分探索无意义的超参数组合。也没有任何保证随机跌跌撞撞地达到全局最大值。此外,网格搜索在准确性和要检查的点数方面深受维数灾难之苦。
Photo by John Moeses Bauan on Unsplash
高斯过程来拯救
为了简单起见,让我们考虑一维贝叶斯优化。对于更高维的超参数空间来说,这个想法是一样的。假设黑色曲线是我们的基本函数,点是观察值。观察结果可能是,而且实际上是有噪声的,这意味着它们没有完美地达到潜在的“地面真相”功能。X-轴代表单个超参数的值,就像你的机器学习算法的学习速率。Y-轴是使用指标的模型性能,其中数字越大表示性能越好。
我们使用一个随机过程来创建一大堆候选函数,这样红点观测值可能就是那个函数的输出。我们假设这些函数是连续光滑的。下面 gif 中的置信界限代表了这些函数的可能值和路线。换句话说,我们从穿过(或靠近)所有红点的所有光滑连续函数集中随机抽取样本。
接下来,我们通过采用最大化预期改进的超参数组合来选择下一个要探索的候选。1D 迭代过程看起来像这样:
在 Python 上使用 GPU 加速的 XGBoost 实现
对于那些希望跟随 Python 代码的人,我在 Google Colab 上创建了 notebook,其中我们在 Scania 卡车气压系统数据集上使用贝叶斯优化来优化 XGBoost 超参数。然后我们将结果与随机搜索进行比较。您可以点击下面的“在 Colab 中打开”按钮,亲自尝试一下。
脚注
[1]平滑意味着我们使用协方差函数来确保 X 的邻近值对应于 y 的邻近值。
[2]还有其他方法,或者更恰当地说是采集函数,来选择下一个候选点。预期改进(EI)是最常见的,因为它非常高效,计算成本低,并且易于理解。
贝叶斯推理和微分方程
结合两种基本范式,从生物学实验中学到更多
生物学实验通常产生清楚地表明测量变量之间的非线性关系的观察结果,并且通常是费力的,并且提供有限数量的观察和重复。常微分方程系统提供了一种建立复杂的非线性现象的机械模型的方法。贝叶斯推理提供了一种范式来拥抱现实世界实验的不确定性,并利用我们的先验知识。生物学是复杂的,实验是困难的,但我们确实有一些成功的建模范例,对生物系统能做什么也有明确的物理约束,以及大量的定量实验文献。在这篇文章中,我展示了一个例子,说明贝叶斯数据分析和微分方程系统是如何结合在一起,从一个只有少量测量值的实验中获取最多信息的。这篇文章中使用的所有代码都可以在这里找到。
正在生长的酵母培养物的玩具模型
下面的玩具模型是为了模拟一个简单的实验而制作的。想象一下,你获得了几克干酵母,并想估计其生存能力。即活酵母细胞占干酵母重量的比例是多少?
您可以尝试的一个实验是,在 1 升分批发酵中接种 1 克干酵母,并在几个时间点测量葡萄糖和生物量浓度。通过这样一个实验,你对你买的酵母有什么了解?
让我们先做一个玩具模型来模拟实验。在这里,我提出了一个酵母培养物的简单模型。它由两个动态质量平衡组成,一个用于生物量,一个用于葡萄糖。请注意,这两种平衡的不同之处仅在于表达式的符号和葡萄糖平衡中 Yxs 的除法。在一个没有噪音或不确定性的世界,我们可以通过测量葡萄糖或生物量来推断系统中的所有参数。在现实世界中存在不确定性,一些变量的测量比其他变量更可信。因此,我们受益于执行冗余测量。下面是我们玩具示例的常微分方程系统:
其中 glc 代表以 mmol 为单位的葡萄糖, X 代表以 g 为单位的生物质干重, μ 是最大生长率*,Yxs* 是以 mmol 葡萄糖/克生物质为单位的生物质产量, f(glc) 是决定葡萄糖消耗速率的动力学表达式。它由以下速率定律描述:
参数和初始条件
模型参数是基于对在糖上有氧生长的面包酵母的测量。
我们知道初始葡萄糖量(我们制备了培养基)为 100 mmol。最初的生物量,干酵母的生存能力,是未知的,我们想推断出来。对于生成合成实验数据的模拟,我们将使用 0.2 克的初始生物质量。
模拟实验
Synthetic observations. The model ran with the parameters in the table above is shown in blue. Four “observations” are made by adding noise to the model output at four different times.
上图用蓝色显示了模拟我们的玩具模型的输出。在 5、6、7 和 8 小时的黑色圆圈代表我们在这个实验中进行的观察。它们是通过在当时的模拟结果中加入噪声计算出来的。下面我们将假设我们对酵母的所有了解是,当我们在含有 100 mmol 葡萄糖的培养基中接种 1 克干重时,它产生了这八个观察值(四个时间点和两个变量)。
贝叶斯数据分析
选择先验概率分布
有两个参数可以推断,葡萄糖上的生物产量,葡萄糖消耗的最大比速率;和两个初始条件。
葡萄糖的生物产量
葡萄糖的最大可能生物量产量由假设的情况给出,其中所有消耗的葡萄糖将被并入生物量。也就是说,没有葡萄糖会在脱羧反应中损失,也没有分解代谢来驱动生物合成。假设基本生物质成分如下:C₁H₁.₈N₀.₂O₀.₅认为氨是用作氮源,我们可以写出一个生物质合成反应:
这意味着对葡萄糖的最大生物产量( Yxs )为每毫摩尔葡萄糖 0.139 克干重。
最大生物量比增长率
以前,我们对酵母知之甚少。我们确实知道它是一种酵母,而且这种酵母比大肠杆菌生长得慢,据报道,大肠杆菌在合成培养基中的最大生长速率为 0.89 升/小时。
初始条件
我们知道初始葡萄糖浓度在实验误差范围内。我们期望我们的溶液在 100 毫摩尔的预期浓度的 1 或 2 毫摩尔之内。但是我们对接种培养物的活细胞数量知之甚少。我们知道我们加入了 1 克,活细胞的比例大于 0 小于 1。
先验概率分布
我选择使用正态概率分布来模拟所有的前科。对于这两个参数,选择平均值和标准偏差,以便我们上面计算的最大值是可能的,但不太可能。我将初始葡萄糖的先验建模为具有小标准偏差的正态分布,将初始生物量建模为对称的β分布。
估计后验概率分布
这里我用 Stan 来推断与观测值相符的参数分布。Stan 提供了一个内置的系统来解决 ODEs [ link 。这是 Stan 型号代码:
functions {
real[] myodes(
real t,
real[] y,
real[] p,
real[] x_r,
int[] x_i
)
{
real dydt[2];
dydt[1] = -y[2] * (p[1] / p[2]) * (y[1]/1) / (1 + (y[1]/1));
dydt[2] = (y[2] * p[1] * (y[1]/1) / (1 + (y[1]/1)));
return dydt;
}
}data {
int<lower=1> N;
int<lower=1> T;
real y[N, 2];
real t0;
real t_obs[N];
real t_sim[T];
}transformed data {
real x_r[0];
int x_i[0];
}parameters {
real<lower=0> y0[2]; // init
vector<lower=0>[2] sigma;
real<lower=0> p[2];
}transformed parameters {
real y_hat[N, 2];
y_hat = integrate_ode_rk45(myodes, y0, t0, t_obs, p, x_r, x_i);
}model {
sigma ~ normal(0, 1);
p[1] ~ normal(0.445, 0.178);
p[2] ~ normal(0.0695, 0.027800000000000002);
y0[1] ~ normal(100, 0.5);
y0[2] ~ beta(2, 2);
for (t in 1:N)
y[t] ~ normal(y_hat[t], sigma);
}generated quantities {
real y_hat_n[T, 2];
real y_hat_sigma[T, 2];y_hat_n = integrate_ode_rk45(myodes, y0, t0, t_sim, p, x_r, x_i);
// Add error with estimated sigma
for (i in 1:T) {
y_hat_sigma[i, 1] = y_hat_n[i, 1] + normal_rng(0, sigma[1]);
y_hat_sigma[i, 2] = y_hat_n[i, 2] + normal_rng(0, sigma[2]);
}
}
有几个检查来诊断我们在 MCMC 运行中获得的后验样本的代表性。首先,四个链的轨迹图(右手边的图)混合得很好,似乎探索了参数空间,而没有在不同的迭代中陷入不同的区域。由 Stan 生成的下表显示,所有参数的有效样本数(n _ eff——不相关样本数)均大于 5000,所有参数的 Gelman-Rubin 统计量均为 1.0。同样重要的是,当使用不同的种子运行模型时,密度图和高密度概率(HPD)区间几乎相同。
HPD 区间除以它们的平均值表明,初始葡萄糖(y0[1])是相当确定的(我们先前已经有了确定性)。根据 HPD 区间,我们预计活细胞占据的干酵母质量分数在 0.17 和 0.46 之间。我们开始了解这一分数,在实验和分析之前,我们只知道该分数限制在 0 和 1 之间。经过观察,我们将可能性范围缩小到初始范围的 30%。
比较先验分布和后验分布
除了初始葡萄糖,后验概率比先验概率更集中。我们非常确定我们的初始葡萄糖量,我们的观察似乎并不质疑这种确定性。在另外三个例子中,观察结果使我们能够更新我们的预期,它偏离了我们先前设定的范围的中间值。
从后面学习
后验概率分布的样本显示最大生长率( μ )与初始生物量之间呈负相关。后验概率也显示了最大生长率和生物量产量之间的正相关,尽管较弱。下图对初始生物量和最大生长率进行了空间编码,而生物量产量用于给点着色。
这些相关性告诉我们,在符合观察结果时,高的初始生物量可以被低的生长速率所抵消,而低的生长速率可以被高的产量所抵消。因此,有一组模型参数可以同样好地解释观察结果。
模型预测
从后验概率分布中获得代表性样本后,可以对模型进行前向模拟,创建模型输出的后验分布。此外,如果我们使用测量的估计方差,我们假设未来独立重复实验的预测。下图显示了模型输出(左侧)和独立重复实验(右侧)的 50%、75%和 95%可信区间。用于拟合模型的数据点显示落在 95%可信区间内,表明我们获得的数据生成模型可能确实生成了那些观察结果。
免责声明。本文所表达的观点仅属于作者,不一定属于作者的雇主。
AR§模型的贝叶斯推断
以“贝叶斯”方式实现 AR 模型。用 Julia 写的代码,可以在这里找到(Jupyter 笔记本上的图和输出)或者在这里找到(。jl 文件)。
Example of Time Series Data; Photo by Isaac Smith on Unsplash
你好!
单变量时间序列大致是指在每个等距有序的时间间隔上有一个值(某个期望量)的序列。对于多变量情况,在每个时刻都有一个以上的值(不同的期望量)。这篇文章主要集中在单变量时间序列,现在将被称为只是时间序列。
时间序列数据的例子包括过去几年中特定地区的月降雨量和特定城市的日最高温度。从这两个例子可以明显看出,获得给定时间序列的准确预测是非常有用的。这些预测让我们得以一窥未来,帮助拯救无数生命。
AR 模型可用于获得时间序列的预测。本文描述了使用贝叶斯推理对此类模型进行参数估计的过程。对于那些不熟悉这种技术的人,我将提供一个简短的描述。用户提供数据以及待估计参数的先验分布。顾名思义,这些先验分布是基于用户对被估计参数的先验信念。基于这些输入,给定数据,模型输出参数的分布。这种分布称为后验分布,然后可以用于获得对未知数据的预测,在我们的情况下,这是指我们的时间序列的未来值。
这是对贝叶斯推理的一个极其简短的描述,它并不完全符合其广泛而令人兴奋的应用。然而,这对于本文的目的来说已经足够了,尽管我强烈建议您进一步阅读这个主题。如果你现在感到困惑,不要担心。事情会越来越明朗:)。
我目前正在 Julia Season of Contributions(JSoC)2019 下向 Turing.jl 投稿,这篇文章描述了我作为 JSoC 的一部分实现的其中一个模型。图灵是一种用 Julia 编写的概率编程语言(PPL ),它使得在纸上定义模型成为一个无缝的过程。此外,它有助于从成分分布中轻松取样。
从 AR§模型开始
AR§模型是指具有 p 滞后项的自回归模型。自回归意味着变量相对于他自己过去的值线性回归。滞后参数 p 决定了在每个时刻使用多少过去的值。对于给定的由 x 表示的时间序列,我们得到 AR§模型的以下预测方程:
其中,ε表示白噪声。现在,有了这些基本信息,让我们来看看代码。
导入库
我们从导入所需的库开始。我们将使用 Turing.jl ,一种 Julia 中的概率编程语言。从定义模型到从后验分布中获取样本,会让整个过程变得流畅,毫不费力。
加载和可视化数据集
让我们首先加载数据集。我们将使用洗发水销售数据集,可以从这里下载。原始数据集归功于 Makridakis、Wheelwright 和 Hyndman (1998 年)。它包含了一种洗发水在 3 年内的月销售额。该部分的代码和绘制该数据集时获得的图形如下:
Plot of the Complete Time Series
分成训练和测试数据
我们使用 90:10 的训练测试分割。由于总共有 36 个观察值(3 年数据,每月一次),我们将使用过去 32 天的数据(训练集)预测最后 4 天(测试集)。
Plot of the Training Set
分析 ACF 和 PACF 图
相关性是两个量(比如 A 和 B)之间的统计度量,它决定了它们的值相对于彼此的增加或减少。如果 A 随着 B 的增加而增加(反之亦然),那么就说它们具有正相关性。例如,给定质量的物体所受的力越大,其加速度就越大。如果 A 随着 B 的减少而增加(反之亦然),也就是说,如果两个量的变化方向相反,那么就说它们具有负相关性。
显示时间序列与其过去值的相关性的图称为自相关函数(ACF)。 Auto 来源于这样一个事实:我们正在计算一个序列与该序列的值的相关性。
xₜ(时间索引 t 的时间序列中的元素)与其滞后 xₜ ₋ ₚ之间的偏相关是在去除 xₜ和 xₜ ₋ ₚ与 xₜ ₋ ₁、xₜ ₋ ₂、…、xₜ ₋ ₍ₚ ₋ ₁₎中的每一个相关的影响后,即滞后短于 p 的这两个量之间的相关。显示时间序列与其过去值的偏相关的图称为偏相关函数(PACF)。
下面显示的是我们训练数据的 ACF 和 PACF 图:
ACF and PACF plots
自回归模型以 ACF 和 PACF 图中的以下观察结果为标志:
- 滞后 1 时的正自相关
- PACF 在某个滞后 k 处突然截止。这个 k 值等于我们应该在 AR§模型中使用的 p 值。
- ACF 图逐渐减少到 0
我们可以看到,我们的 ACF 和 PACF 图满足上述三点的条件。此外,我们为 AR§模型获得的 p 值是 p = 2 ,因为 PACF 曲线在第二个滞后截止。我们继续定义 AR(2)模型。
模型定义
我们现在使用前面讨论的预测方程来定义 AR§模型。我们取 p = 2 ,这是借助于 ACF 和 PACF 图得到的。我们可以用图灵的直观界面很容易地定义模型:
这里,我们假设β系数具有一致的(-1,1)先验,α系数具有正态的(0,1)先验。现在,有了模型定义,是时候对我们的后验进行采样了!
抽样
我们使用不掉头采样器(NUTS)采样器采样,重复 5000 次(抽取 5000 个样本)。如果您不熟悉马尔可夫链蒙特卡罗抽样,您可以将其视为一个黑盒,当提供模型定义和相关参数作为输入时,它会给出后验概率。关于在图灵中使用这个采样器和参数定义的更多信息,你可以在这里参考文档。
分析采样参数
运行上述代码将产生一个输出,提供关于链的基本信息和估计参数的汇总统计信息,如下所示:
只需一行代码,我们就可以得到采样参数的分布,以及它们在所有迭代中的值。
我们还可以用另一行代码查看这些采样参数的角图。
Output of: L: corner(chain), R: plot(chain)
我们现在拥有了我们之前讨论过的窥视未来所需的所有工具。我们将首先从采样链中移除预热样本。这些样本是在最初几次迭代期间在链中最初采样的,并且在我们已经获得所需的后验分布之后不再需要。然后,我们将所有采样参数的平均值作为该参数值的点估计值。
正是这些点估计值,我们将把它们代入预测方程以得到预测值。注意,为了预测前几个元素,我们将不得不使用来自训练集末尾的元素(确切地说,必须对多少个元素进行预测取决于 p 的值)。这是因为我们需要时间序列先前的滞后值来预测当前值。例如,在我们使用的 AR(2)模型中,前两个预测将使用来自训练集的值。因此,我们可以计算预测的时间序列 s_pred ,如下面的代码所示:
绘制预测和测试集(原始数据):
我们可以看到,在要预测的四个值中,只有一个接近,而其他三个非常不准确。一个原因可能是这个时间序列不是协方差平稳的。我们可以通过使用更复杂的 ARIMA 模型来改进这一缺点,这些模型使用差分来首先使序列平稳,然后使用自回归和移动平均项对差分序列进行建模。
这就是我关于 AR§模型的贝叶斯推断的文章的结论。我要感谢 Cameron Pfiffer 在实施过程中以及在过去的几个月里提供的巨大帮助和指导。如果你对这篇文章有任何问题或疑问,请随时通过 s shah@iitk.ac.in 联系我,或者你可以在 Julia slack 上用@Saumya Shah 给我加标签。感谢阅读!😃.
参考
[1] Jason Brownlee,机器学习的 7 个时间序列数据集,机器学习掌握,可从https://machinelingmastery . com/Time-Series-Datasets-for-Machine-Learning/,2019 年 8 月 26 日访问。
[2]资料来源:时间序列数据库(引用:Makridakis、Wheelwright 和 Hyndman (1998 年))
贝叶斯推理问题、MCMC 和变分推理
统计学中的贝叶斯推断问题综述。
Credit: Free-Photos on Pixabay
本帖与 巴蒂斯特·罗卡 共同撰写。
介绍
贝叶斯推理是统计学中的一个主要问题,也是许多机器学习方法中遇到的问题。例如,用于分类的高斯混合模型或用于主题建模的潜在狄利克雷分配都是在拟合数据时需要解决这种问题的图形模型。
同时,可以注意到,根据模型设置(假设、维度等),贝叶斯推理问题有时很难解决。在大型问题中,精确的解决方案确实需要大量的计算,这些计算往往变得难以处理,必须使用一些近似技术来克服这个问题,并构建快速和可扩展的系统。
在这篇文章中,我们将讨论两种主要的方法来解决贝叶斯推理问题:马尔可夫链蒙特卡罗(MCMC),这是一种基于抽样的方法,和变分推理(VI),这是一种基于近似的方法。
概述
在第一部分,我们将讨论贝叶斯推理问题,并看到一些经典的机器学习应用程序的例子,其中这个问题自然出现。然后在第二部分,我们将全面介绍 MCMC 技术来解决这一问题,并给出一些关于两个 MCMC 算法的细节:Metropolis-Hasting 和 Gibbs 抽样。最后,在第三节中,我们将引入变分推理,看看如何在一个参数化的分布族上通过优化过程得到一个近似解。
注。标有 a (∞)的小节非常数学化,可以跳过,不会影响对这篇文章的整体理解。还要注意,在这篇文章中,p(.)用于表示取决于上下文的概率、概率密度或概率分布。
贝叶斯推理问题
在本节中,我们将介绍贝叶斯推理问题,并讨论一些计算困难,然后给出潜在狄利克雷分配的示例,这是一种主题建模的具体机器学习技术,其中会遇到该问题。
什么是推论?
统计推断在于根据我们观察到的东西来了解我们没有观察到的东西。换句话说,它是根据这个群体或这个群体的一个样本中的一些观察变量(通常是效果)得出关于群体中一些潜在变量(通常是原因)的结论如准时估计、置信区间或分布估计的过程。
特别是,贝叶斯推断是从贝叶斯的角度产生统计推断的过程。简而言之,贝叶斯范式是一种统计/概率范式,其中由概率分布建模的先验知识在每次记录新的观察时被更新,该新的观察的不确定性由另一个概率分布建模。支配贝叶斯范式的整个思想嵌入在所谓的贝叶斯定理中,该定理表达了更新的知识(“后验”)、先验知识(“先验”)和来自观察的知识(“可能性”)之间的关系。
一个经典的例子是参数的贝叶斯推断。让我们假设一个模型,其中数据 x 由依赖于未知参数θ的概率分布产生。我们还假设我们有一个关于参数θ的先验知识,它可以表示为一个概率分布 p(θ)。然后,当观察到数据 x 时,我们可以使用贝叶斯定理更新关于该参数的先验知识,如下所示
Illustration of the Bayes theorem applied to the inference of a parameter given observed data.
计算困难
贝叶斯定理告诉我们,后验概率的计算需要三个条件:先验、似然和证据。前两个可以很容易地表达出来,因为它们是假设模型的一部分(在许多情况下,先验和可能性是明确已知的)。然而,第三项,即归一化因子,需要计算如下
虽然在低维中计算这个积分没有太多困难,但是在高维中它会变得难以处理。在最后一种情况下,后验分布的精确计算实际上是不可行的,必须使用一些近似技术来解决需要知道该后验分布的问题(例如,均值计算)。
我们可以注意到,一些其他的计算困难可能产生于贝叶斯推理问题,例如,当一些变量是离散的时,组合学问题。在最常用于克服这些困难的方法中,我们找到了马尔可夫链蒙特卡罗和变分推断方法。在这篇文章的后面,我们将描述这两种方法,特别是集中在“归一化因子问题”上,但是人们应该记住,当面临与贝叶斯推理相关的其他计算困难时,这些方法也可能是宝贵的。
为了使接下来的章节更具一般性,我们可以观察到,假设 x 是给定的,因此可以作为一个参数,我们面临这样一种情况,θ的概率分布定义为一个归一化因子
在下两节描述 MCMC 和 VI 之前,我们先举一个具体的例子,用潜在的狄利克雷分配来说明机器学习中的贝叶斯推理问题。
例子
贝叶斯推理问题自然地出现,例如,在假设概率图形模型的机器学习方法中,并且在给定一些观察的情况下,我们想要恢复模型的潜在变量。在主题建模中,潜在狄利克雷分配(LDA) 方法为语料库中的文本描述定义了这样的模型。因此,给定大小为 V 的完整语料库词汇表和给定数量的主题 T,该模型假设:
- 对于每个主题,存在词汇表上的“主题-词”概率分布(假设有 Dirichlet 先验)
- 对于每个文档,存在主题上的“文档-主题”概率分布(假设另一个狄利克雷先验)
- 对文档中的每个单词进行采样,首先,我们从文档的“文档-主题”分布中采样主题,其次,我们从附加到采样主题的“主题-单词”分布中采样单词
该方法的名称来源于模型中假设的 Dirichlet 先验,其目的是推断观察到的语料库中的潜在主题以及每个文档的主题分解。即使我们不深入 LDA 的细节,我们也可以非常粗略地说,表示 w 是语料库中的单词向量,z 是与这些单词相关联的主题向量,我们希望以贝叶斯方式基于观察到的 w 来推断 z:
这里,除了归一化因子由于巨大的维度而绝对难以处理的事实之外,我们还面临着组合学的挑战(因为问题的一些变量是离散的),需要使用 MCMC 或 VI 来获得近似解。对主题建模及其具体的底层贝叶斯推理问题感兴趣的读者可以看看这篇关于 LDA 的参考论文。
Illustration of the Latent Dirichlet Allocation method.
马尔可夫链蒙特卡罗(MCMC)
正如我们之前提到的,处理贝叶斯推理问题时面临的主要困难之一来自规范化因素。在本节中,我们描述了 MCMC 采样方法,它构成了一个可能的解决方案来克服这个问题以及一些其他与贝叶斯推理相关的计算困难。
抽样方法
抽样方法的思想如下。让我们首先假设我们有一个方法(MCMC)来从一个概率分布中抽取样本,这个概率分布被定义为一个因子。然后,我们可以从该分布中获取样本(仅使用非标准化部分定义),并使用这些样本来计算各种准时统计,如均值和方差,甚至通过核密度估计来近似分布,而不是试图处理涉及后验的棘手计算。
与下一节描述的 VI 方法相反, MCMC 方法对研究的概率分布(贝叶斯推理情况下的后验概率)不采用模型。因此,这些方法具有较低的偏差,但具有较高的方差,这意味着大多数时候获得结果的成本更高,但也比我们从 VI 中获得的结果更准确。
为了结束这一小节,我们再次概述这样一个事实,即我们刚刚描述的这个抽样过程并不局限于后验分布的贝叶斯推断,而且更一般地说,还可以用于概率分布被定义为其归一化因子的任何情况。
Illustration of the sampling approach (MCMC).
MCMC 的理念
在统计学中,马尔可夫链蒙特卡罗算法旨在从给定的概率分布中生成样本。该方法名称中的“蒙特卡罗”部分是由于采样的目的,而“马尔可夫链”部分来自我们获取这些样本的方式(我们让读者参考我们关于马尔可夫链的介绍文章)。
为了产生样本,我们的想法是建立一个马尔可夫链,它的平稳分布就是我们想要从中取样的分布。然后,我们可以从马尔可夫链中模拟一个随机的状态序列,它足够长,足以(几乎)达到稳态,然后保留一些生成的状态作为我们的样本。
在随机变量生成技术中,MCMC 是一种非常先进的方法(我们已经在关于 GANs 的帖子中讨论了另一种方法),它使得从一个非常困难的概率分布中获取样本成为可能,该概率分布可能只定义到一个乘法常数。反直觉的事实是,我们可以用 MCMC 从一个没有很好归一化的分布中获得样本,这来自于我们定义对这些归一化因子不敏感的马尔可夫链的特定方式。
The Markov Chain Monte Carlo approach is aimed at generating samples from a difficult probability distribution that can be defined up to a factor.
马尔可夫链的定义
整个 MCMC 方法是基于建立马尔可夫链的能力,该马尔可夫链的平稳分布就是我们想要从采样的分布。为了做到这一点,Metropolis-Hasting 和 Gibbs 抽样算法都使用了马尔可夫链的一个特殊性质:可逆性。
状态空间 E 上的马尔可夫链,转移概率表示为
如果存在一个概率分布γ,使得
对于这样的马尔可夫链,我们可以很容易地证明我们有
然后,γ是一个平稳分布(如果马氏链是不可约的,它是唯一的)。
现在让我们假设我们想要采样的概率分布 π 只定义了一个因子
(其中 C 是未知的乘法常数)。我们可以注意到下面的等价关系成立
然后是转移概率为 k(.,.)定义来验证最后的等式将有,如预期的那样, π 为平稳分布。因此,我们可以定义一个马尔可夫链,它对于平稳分布有一个不能明确计算的概率分布 π 。
吉布斯采样跃迁(∞)
让我们假设我们想要定义的马尔可夫链是 D 维的,这样
吉布斯抽样方法基于这样的假设,即使联合概率难以处理,也可以计算出给定其他维度的单个维度的条件分布。基于这一思想,定义转移,使得在迭代 n+1 时,要访问的下一个状态由以下过程给出。
首先,我们在 X_n 的 D 维中随机选择一个整数 D。然后,在所有其他维保持固定的情况下,我们根据相应的条件概率为该维采样一个新值:
在哪里
是在给定所有其他维度的情况下,第 d 个维度的条件分布。
形式上,如果我们表示
然后可以写出转移概率
因此,局部平衡如预期的那样被验证,对于唯一重要的情况,
大都市的急速转变(∞)
有时,甚至吉布斯方法中的条件分布也太复杂而难以获得。在这种情况下,可以使用 Metropolis-Hasting 。为此,我们从定义侧跃迁概率 h(.,.)这将用于建议过渡。然后,在迭代 n+1 时,马尔可夫链要访问的下一个状态由下面的过程定义。我们首先从 h 画出一个“建议转移”x,并计算接受它的相关概率 r:
那么选择有效转换,使得
形式上,转移概率可以写成
因此,本地余额如预期的那样得到验证
取样过程
一旦定义了我们的马尔可夫链,我们就可以模拟一个随机的状态序列(随机初始化),并选择其中的一些状态,以获得既遵循目标分布又相互独立的样本。
首先,为了使样本(几乎)遵循目标分布,我们需要只考虑离生成序列的开始足够远的状态,以几乎达到马尔可夫链的稳态(理论上,稳态只是渐近达到)。因此,第一个模拟状态不可用作样本,我们将达到稳态所需的这个阶段称为老化时间。注意,实际上很难知道这个老化时间需要多长。
第二,为了有(几乎)独立的样本,我们不能在老化时间之后保持序列的所有连续状态。事实上,马尔可夫链的定义意味着两个连续状态之间的强相关性,因此我们只需要保留彼此相距足够远的状态作为样本,以被认为是几乎独立的。实际上,两个状态之间被认为几乎独立所需的滞后可以通过自相关函数的分析来估计(仅针对数值)。
因此,为了获得遵循目标分布的独立样本,我们保留来自所生成序列的状态,这些状态彼此相隔一个滞后 L,并且在老化时间 B 之后出现。因此,如果马尔可夫链的连续状态被表示为
我们只保留州作为我们的样本
MCMC sampling requires to consider both a burn-in time and a lag.
变分推理(六)
另一种克服与推理问题相关的计算困难的可能方法是使用变分推理方法,该方法在于在参数化族中寻找分布的最佳近似值。为了找到最佳近似值,我们遵循一个优化流程(针对系列参数),该流程只要求将目标分布定义为一个因子。
近似方法
VI 方法包括在给定的家族中寻找一些复杂目标概率分布的最佳近似。更具体地说,其思想是定义一个参数化的分布族,并对参数进行优化,以获得相对于明确定义的误差度量最接近目标的元素。
让我们仍然考虑定义为归一化因子 C 的概率分布 π :
然后,用更数学的术语来说,如果我们表示参数化的分布族
并且我们考虑两个分布 p 和 q 之间的误差度量 E(p,q ),我们搜索最佳参数使得
如果我们可以解决这个最小化问题,而不必显式归一化 π ,我们就可以使用 f_𝜔*作为一种近似来估计各种量,而不是处理棘手的计算。变分推理方法所隐含的最优化问题实际上被认为比直接计算(归一化、组合学等)要简单得多。
与抽样方法相反,假设了一个模型(参数化家族),这意味着一个偏差和一个较低的方差。总的来说,VI 方法不如 MCMC 方法精确,但产生结果的速度快得多:这些方法更适合于大规模、非常统计的问题。
Illustration of the approximation approach (Variational Inference).
分布族
我们需要设置的第一件事是参数化的分布族,它定义了我们搜索最佳近似的空间。
家庭的选择定义了一个控制方法的偏倚和复杂性的模型。如果我们假设一个非常严格的模型(简单的家庭),那么我们有一个高偏差,但优化过程是简单的。相反,如果我们假设一个相当自由的模型(复杂的家庭),偏差会低得多,但优化会更困难(如果不是难以处理的话)。因此,我们必须在一个足够复杂以确保最终逼近的良好质量的族和一个足够简单以使优化过程易于处理的族之间找到正确的平衡。我们应该记住,如果族中没有一个分布接近目标分布,那么即使是最好的近似也只能给出很差的结果。
平均场变分族是一个概率分布族,其中所考虑的随机向量的所有分量都是独立的。这个系列的分布具有产品密度,使得每个独立的成分由产品的不同因素控制。因此,属于平均场变分族的分布具有可以写成的密度
这里我们假设一个 m 维随机变量 z,注意,即使在符号中省略了它,所有的密度 f_j 都是参数化的。因此,例如,如果每个密度 f_j 是具有均值和方差参数的高斯分布,则全局密度 f 由来自所有独立因素的一组参数来定义,并且在整个参数组上进行优化。
The choice of the family in variational inference sets both the difficulty of the optimisation process and the quality of the final approximation.
库尔贝克-莱布勒散度
一旦定义了这个族,一个主要的问题仍然存在:如何在这个族中找到一个给定概率分布的最佳近似(明确定义到它的归一化因子)?即使最佳近似值明显取决于我们考虑的误差测量的性质,但似乎很自然地假设最小化问题对归一化因子不敏感,因为我们更想比较质量分布而不是质量本身(对于概率分布必须是单一的)。
所以,现在让我们定义一下 Kullback-Leibler (KL) 散度,看看这个度量使问题对归一化因子不敏感。如果 p 和 q 是两个分布,KL 散度定义如下
根据这个定义,我们可以很容易地看到
对于我们的最小化问题,这意味着以下等式
因此,当选择 KL 散度作为我们的误差度量时,优化过程对乘法系数不敏感,并且我们可以在我们的参数化分布族中搜索最佳近似,而不必像预期的那样计算目标分布的痛苦的归一化因子。
最后,作为一个附带事实,我们可以通过为感兴趣的读者注意到 KL 散度是交叉熵减去熵来结束这一小节,并且在信息论中有很好的解释。
优化过程和直觉
一旦定义了参数族和误差测量,我们就可以初始化参数(随机或根据明确定义的策略)并进行优化。可以使用几个经典的优化技术,例如梯度下降或坐标下降,这将在实践中导致局部最优。
为了更好地理解这个优化过程,让我们举一个例子,回到贝叶斯推理问题的具体情况,我们假设一个后验概率如下
在这种情况下,如果我们想要使用变分推断获得这个后验的近似,我们必须解决下面的优化过程(假设定义的参数化族和 KL 散度作为误差度量)
最后一个等式有助于我们更好地理解如何鼓励近似值分配其质量。第一项是预期对数似然,其倾向于调整参数,以便将近似值的质量放在解释最佳观察数据的潜在变量 z 的值上。第二项是近似值和先验分布之间的负 KL 散度,其倾向于调整参数,以便使近似值接近先验分布。因此,这个目标函数很好地表达了通常的先验/似然平衡。
Optimisation process of the Variational Inference approach.
外卖食品
这篇文章的主要观点是:
- 贝叶斯推理是统计学和机器学习中的一个非常经典的问题,它依赖于众所周知的贝叶斯定理,其主要缺点是,大多数时候,在一些非常繁重的计算中
- 马尔可夫链蒙特卡罗(MCMC)方法旨在模拟来自密度的样本,这些密度可能非常复杂和/或定义到某个因子
- MCMC 可以用在贝叶斯推理中,以便直接从后验的“非归一化部分”生成样本来处理,而不是处理棘手的计算
- 变分推断(VI)是一种近似分布的方法,使用参数的优化过程在给定的族中找到最佳近似
- VI 优化过程对目标分布中的乘法常数不敏感,因此,该方法可用于近似仅定义到归一化因子的后验
正如已经提到的,MCMC 和 VI 方法具有不同的属性,这意味着不同的典型用例。一方面,MCMC 方法的采样过程相当繁重,但是没有偏差,因此,当期望精确的结果时,这些方法是优选的,而不考虑所花费的时间。另一方面,尽管 VI 方法中家族的选择会明显引入偏差,但它伴随着合理的优化过程,使这些方法特别适合于需要快速计算的超大规模推理问题。
MCMC 和 VI 之间的其他比较可以在优秀的变分推断:统计学家回顾中找到,我们也强烈推荐给仅对 VI 感兴趣的读者。关于 MCMC 的进一步阅读,我们推荐这本总论以及这本面向机器学习的导论。有兴趣了解更多关于应用于 LDA 的 Gibbs 抽样的读者可以参考这篇关于主题建模和 Gibbs 抽样的教程(结合这些关于 LDA Gibbs 抽样器的讲义进行谨慎推导)。
最后,让我们以一点调侃来结束,并提到在即将到来的帖子中,我们将讨论变分自动编码器,这是一种基于变分推理的深度学习方法…所以请保持关注!
感谢您的阅读,如果您认为值得分享,请随意分享!
巴蒂斯特·罗卡的最后一篇文章:
几种主要推荐算法综述。
towardsdatascience.com](/introduction-to-recommender-systems-6c66cf15ada) [## 整体方法:装袋、助推和堆叠
理解集成学习的关键概念。
towardsdatascience.com](/ensemble-methods-bagging-boosting-and-stacking-c9214a10a205)
贝叶斯模型选择:作为一种特征约简技术
一个温和的介绍应用贝叶斯模型选择,以确定机器学习模型生成的重要特征。
Photo by Franki Chamaki on Unsplash
通常,我们在构建预测性机器学习模型时面临的一个重要障碍是找到能够忠实映射描述符和预测符之间潜在关系的最佳特征子集。当我们的机器学习模型中有冗余特征时,它们不仅会增加训练时间(因为训练时间与特征向量的长度和特征的数量成正比),还会给模型添加噪声,从而恶化机器学习性能。解决这个问题的一种方法是选择与信号具有适当相关性的描述符子集。为了实现这一目标,有几种可用特征/指纹减少工具,例如,
自下而上的方法在初始步骤中,根据性能指标选择最佳特性。然后迭代地添加下一个最佳特征,直到边际性能增益可以忽略。
自上而下的方法最初使用所有的特征,然后逐渐丢弃最差的一个,直到获得满意的折衷。
遗传算法特征相互融合,以产生更好的特征,但如果后代不够合适,它就会被丢弃。
所有这些技术都有其优点和缺点。我不想对它们进行任何比较,因为这超出了这篇小文章的范围。相反,在本文中,我将讨论一种不同的特征约简方法——贝叶斯模型选择。
贝叶斯模型选择
贝叶斯模型选择可以应用于我们有多个竞争模型并且需要选择最佳模型的情况。根据贝叶斯定理,任何模型的后验概率都可以写成:
Bayes’s Formula for the probability of a model (M) being a true model given the data (D)
这里,P(M|D)是给定数据 D 的模型 M 的后验概率,P(D|M)是模型 M 的证据,P(M)是关于模型 M 的先验知识,P(D)是归一化因子。当我们有两个竞争模型时,我们可以比较它们的后验概率,
Formula for Bayesian Model Comparison using posterior probability distribution
有了这个等式,我们可以比较两个模型,并采用具有更大模型证据的模型(当我们有无信息先验时)。在上述方程中比较模型的困难部分是模型证据的计算,这是一项非常复杂的任务。幸运的是,对于线性回归模型,有分析公式可以直接计算模型证据。在本文中,我们将使用贝叶斯信息标准(BIC),而不是模型证据来选择最佳模型。贝叶斯信息标准与负对数边际似然成比例,这意味着具有最低 BIC 的模型可能是最大化后验预测能力的最佳模型。如果线性回归模型的残差是正态分布的,我们可以使用下面的公式来计算每个模型的 BIC,
Formula for Bayesian Information Criteria for linear regression model with normal error distribution
这个方程,通过构造,试图优化偏差-方差的权衡。第一项奖励低模型 RMSE(均方根误差),第二项惩罚模型复杂性。此外,我们拥有的数据点越多,关于模型的证据就越多。现在,这一切都归结为计算每个线性回归模型的上述公式,并选择一个最低的 BIC。
作为特征约简技术的贝叶斯模型选择
BMS 主要用于模型比较。但是我们也可以把它作为一个特征选择工具。如果我们为所有特征组合建立线性回归模型,那么具有最低 BIC 的模型就是包含所有相关特征的模型。有了这个想法,下面我将展示一个如何实现这个想法的例子。
让我们先加载数据:
Loading the diabetes dataset available in sklearn
现在,根据这些数据制作一个熊猫数据框架:
Organizing the data into a pandas dataframe
为了简化我们的模型选择任务,我写了一个代码来完成它,它使用 sklearn 来构建模型。运行这个例子的代码可以在我的 GitHub repo ( 贝叶斯框架)中找到。
使用上面的代码,首先我们将构建模型动物园(包含所有模型的信息):
Building the linear regression zoo and plotting the model performance envelope
运行上述代码片段将在 matplotlib GUI 中显示以下图形:
Model performance envelope for all the model considered in our analysis
或者,我们可以使用以下代码直接选择最佳模型:
Selecting the best model from the zoo
它将在控制台上打印以下输出:
Model parameters of the best selected model
因此,基于我们的模型选择方法,我们确定 10 个特征中的 5 个是最重要的描述符集,它们是性别、bmi、bp、s3 和 s5。正如预期的那样,我们的模型表明性别、体重指数和血压是决定一个人患糖尿病的最重要因素,这与我们的直觉知识一致。
有了这个贝叶斯模型选择框架,我们可以很容易地减少我们的模型中的特征数量,也将有助于使模型更具可解释性。此外,它选择一个简单的线性回归模型,该模型可以用作基线模型,通过引入非线性机器学习模型来训练我们的数据,从而提高模型性能。
贝叶斯建模航空公司客户服务 Twitter 响应时间
Photo credit: Pixabay
学生的 t 分布、泊松分布、负二项分布、分层建模和回归
Twitter 最近在美国进行了一项研究,发现的顾客愿意多付近 20 美元乘坐一家在六分钟内回复他们推文的航空公司。当他们的推文在 67 分钟后得到回应时,他们只会多付 2 美元乘坐那家航空公司的航班。
当我在 twitter 数据集上遇到客户支持时,我忍不住想建模并比较航空公司客服 Twitter 响应时间。
我希望能够回答这样的问题:
- 数据中所有航空公司的客服 twitter 响应时间有显著差异吗?
- 周末会影响反应时间吗?
- 更长的推文需要更长的时间来回应吗?
- 哪个航空公司的客服 twitter 响应时间最短,反之亦然?
数据
这是一个庞大的数据集包含了来自各行各业的数百家公司。以下数据争论过程将会完成:
- 得到客户的询问,以及每一行公司相应的回复。
- 将日期时间列转换为日期时间数据类型。
- 计算响应时间,精确到分钟。
- 在数据中仅选择航空公司。
- 任何超过 60 分钟的客户咨询都将被过滤掉。我们正在处理在 60 分钟内得到回应的请求。
- 创建时间属性和响应字数。
preprocessing_airline.py
响应时间分布
plt.figure(figsize=(10,5))
sns.distplot(df['response_time'], kde=False)
plt.title('Frequency of response by response time')
plt.xlabel('Response time (minutes)')
plt.ylabel('Number of responses');
Figure 1
我的直接印象是,高斯分布不是数据的恰当描述。
学生的 t 分布
当处理异常值和高斯分布时,一个有用的选择是用一个学生的 t-分布代替高斯似然。这个分布有三个参数:平均值(𝜇)、标度(𝜎)(类似于标准差)和自由度(𝜈).)
- 将平均值均匀分布的边界设置为 0 和 60。
- 𝜎只能是正的,因此使用半正态分布。
- 将𝜈设为平均值为 1 的指数分布。
students_t_distribution
MCMC 诊断
- 从下面的迹线图中,我们可以直观地得到𝜇的似是而非的后验值。
- 我们应该把这个结果与我们用解析方法得到的结果进行比较。
az.plot_trace(trace_t[:1000], var_names = ['μ']);
Figure 2
df.response_time.mean()
- 左图显示了为𝜇.收集的值的分布我们得到的是 7.4 到 7.8 分钟之间的𝜇的不确定性和可信值的度量。
- 显然,从与目标分布显著不同的分布中抽取的样本。
后验预测检查
一种可视化的方法是看模型是否能再现真实数据中观察到的模式。例如,推断平均值与实际样本平均值的接近程度:
ppc = pm.sample_posterior_predictive(trace_t, samples=1000, model=model_t)
_, ax = plt.subplots(figsize=(10, 5))
ax.hist([n.mean() for n in ppc['y']], bins=19, alpha=0.5)
ax.axvline(df['response_time'].mean())
ax.set(title='Posterior predictive of the mean', xlabel='mean(x)', ylabel='Frequency');
Figure 3
推断平均值与实际样本平均值相差甚远。这证实了学生的 t 分布对于我们的数据不是一个合适的选择。
泊松分布
泊松分布一般用于描述给定数量的事件在固定的时间/空间间隔内发生的概率。因此,泊松分布假设事件彼此独立发生,并以固定的时间和/或空间间隔发生。该离散分布仅使用一个值𝜇来参数化,该值对应于分布的均值和方差。
poisson.py
MCMC 诊断
az.plot_trace(trace_p);
Figure 4
𝜇的不确定性和可信值的测量在 13.22 和 13.34 分钟之间。听起来已经好多了。
自相关
我们希望自相关随着图中 x 轴的增加而下降。因为这表明我们的样本之间的相关性很低。
_ = pm.autocorrplot(trace_p, var_names=['μ'])
Figure 5
我们来自泊松模型的样本已经下降到低自相关值,这是一个好迹象。
后验预测检查
我们使用后验预测检验来“寻找真实数据和模拟数据之间的系统性差异”。进行后验预测检验有多种方法,我想用各种方法来检验我的模型是否有意义。
y_ppc_p = pm.sample_posterior_predictive(
trace_p, 100, model_p, random_seed=123)
y_pred_p = az.from_pymc3(trace=trace_p, posterior_predictive=y_ppc_p)
az.plot_ppc(y_pred_p, figsize=(10, 5), mean=False)
plt.xlim(0, 60);
Figure 6
解释:
- 单线(黑线)是数据的核密度估计 (KDE ),许多紫色线是从 100 个后验预测样本中的每一个计算的 KDE。紫色线条反映了我们对预测数据的推断分布的不确定性。
- 从上面的图中,我不能认为一个泊松分布的规模是数据标准差的一个合理的实际代理,即使在去除异常值之后。
后验预测检查
ppc = pm.sample_posterior_predictive(trace_p, samples=1000, model=model_p)
_, ax = plt.subplots(figsize=(10, 5))
ax.hist([n.mean() for n in ppc['y']], bins=19, alpha=0.5)
ax.axvline(df['response_time'].mean())
ax.set(title='Posterior predictive of the mean', xlabel='mean(x)', ylabel='Frequency');
Figure 7
- 推断的均值比我们从学生的 t 分布得到的均值更接近实际样本均值。但还是有一点小差距。
- 使用泊松分布的问题是均值和方差由相同的参数描述。因此,解决这个问题的一个方法是将数据建模为一个混合的泊松分布和来自伽马分布的比率,这给了我们使用负二项分布的理由。
负二项分布
负二项分布具有与泊松分布非常相似的特征,除了它有两个参数(𝜇和𝛼),这使得它能够独立于其均值改变其方差。
negative_binomial.py
MCMC 诊断
az.plot_trace(trace_n, var_names=['μ', 'α']);
Figure 8
𝜇的不确定性和可信值的测量在 13.0 和 13.6 分钟之间,并且非常接近目标样本均值。
后验预测检查
y_ppc_n = pm.sample_posterior_predictive(
trace_n, 100, model_n, random_seed=123)
y_pred_n = az.from_pymc3(trace=trace_n, posterior_predictive=y_ppc_n)
az.plot_ppc(y_pred_n, figsize=(10, 5), mean=False)
plt.xlim(0, 60);
Figure 9
在我们的模型中使用负二项分布会产生预测样本,这些样本在分布的峰值位置及其分布方面似乎更符合数据。
后验预测检查
ppc = pm.sample_posterior_predictive(trace_n, samples=1000, model=model_n)
_, ax = plt.subplots(figsize=(10, 5))
ax.hist([n.mean() for n in ppc['y_est']], bins=19, alpha=0.5)
ax.axvline(df['response_time'].mean())
ax.set(title='Posterior predictive of the mean', xlabel='mean(x)', ylabel='Frequency');
Figure 10
综上所述,以下是我们对不确定性和可信值的度量(𝜇):
- 学生 t 分布:7.4 到 7.8 分钟
- 泊松分布:13.22 到 13.34 分钟
- 负二项分布:13.0 到 13.6 分钟。
后验预测分布
posterior_predictive_dist.py
Figure 11
后验预测分布有点类似于观察数据的分布,表明负二项式模型更适合基础数据。
分层建模的贝叶斯方法
- 我们想把每家航空公司作为一个独立的实体来研究。我们希望建立一个模型来估计每家航空公司的响应时间,同时估计整个数据的响应时间。这种类型的模型被称为分层模型或多级模型。
- 我的直觉告诉我,不同的航空公司有不同的反应时间。例如,阿拉斯加航空公司的客户服务 twitter 响应可能比亚洲航空公司的响应更快。因此,我决定独立地为每家航空公司建模,为每家航空公司估计参数 μ 和 α 。
- 一个考虑是,一些航空公司可能比其他航空公司更少收到来自 twitter 的客户咨询。因此,与有大量客户咨询的航空公司相比,我们对有少量客户咨询的航空公司的响应时间的估计具有更高的不确定性。下图说明了每家航空公司样本量的差异。
plt.figure(figsize=(12,4))
sns.countplot(x="author_id_y", data=df, order = df['author_id_y'].value_counts().index)
plt.xlabel('Airline')
plt.ylabel('Number of response')
plt.title('Number of response per airline')
plt.xticks(rotation=45);
Figure 12
用负二项分布对各航空公司进行贝叶斯建模
hierarchical_negative_binomial.py
每个航空公司的后验预测分布
posterior_pred_1.py
Figure 13
观察值 :
- 在上述三家航空公司中,英国航空公司的后验预测分布与阿拉斯加航空公司和西南航空公司相差很大。英国航空公司向右分布。
- 这可以准确地反映其客户服务 twitter 响应时间的特征,这意味着通常英国航空公司比阿拉斯加航空公司或西南航空公司需要更长的时间来响应。
- 或者由于样本量小,它可能是不完整的,因为我们从西南航空公司得到的数据比从英国航空公司得到的多得多。
posterior_pred_2.py
Figure 14
与此类似,在上述三家航空公司中,亚航的分布向右,这可以准确反映其客服 twitter 响应时间的特点,这意味着一般情况下,亚航比达美或弗吉尼亚航空的响应时间更长。或者可能由于样本量小而不完整。
posterior_pred_3.py
Figure 15
对于航空公司我们有相对充分的数据,例如,当我们比较美国的上述三家大型航空公司时,后验预测分布似乎没有显著变化。
贝叶斯分层回归
模型的变量:
df = df[['response_time', 'author_id_y', 'created_at_y_is_weekend', 'word_count']]
formula = 'response_time ~ ' + ' + '.join(['%s' % variable for variable in df.columns[1:]])
formula
在下面的代码片段中,我们:
- 将分类变量转换为整数。
- 估计每个航空公司客户服务响应时间的基线参数值𝛽0。
- 估计数据中所有航空公司的所有其他参数。
bayesian_hl.py
MCMC 诊断
az.plot_trace(trace_hr);
Figure 16
观察:
- 每个航空公司都有不同的基线响应时间,但是,其中一些非常接近。
- 如果您在周末发送请求,那么在得到响应之前,您可能会等待稍长的时间。
- 回复的字数越多,等待回复的时间就越长。
森林小区
_, ax = pm.forestplot(trace_hr, var_names=['intercept'])
ax[0].set_yticklabels(airlines.tolist());
Figure 17
该模型估计每个航空公司的上述β0(截距)参数。点是每个航空公司最可能的参数值。看起来我们模型对每家航空公司的不确定性都很小。
ppc = pm.sample_posterior_predictive(trace_hr, samples=2000, model=model_hr)
az.r2_score(df.response_time.values, ppc['y_est'])
Jupyter 笔记本可以位于 Github 上。祝你一周工作顺利!
参考资料:
这本书:用 Python 进行贝叶斯分析
这本书:做贝叶斯数据分析
这本书:统计学再思考
【https://docs.pymc.io/notebooks/GLM-poisson-regression.html
https://docs . pymc . io/notebooks/hierarchical _ partial _ pooling . html
本教程改编自达恩·埃尔伯斯和托马斯·威奇的博客文章,名为…
docs.pymc.io](https://docs.pymc.io/notebooks/GLM-hierarchical.html)
https://docs . pymc . io/notebooks/GLM-负数-二项式-回归. html
对 alpha 应用了间隔转换,并将转换后的 alpha_interval_ 添加到模型中。将区间变换应用于 mu…
nbviewer.jupyter.org](https://nbviewer.jupyter.org/github/markdregan/Bayesian-Modelling-in-Python/blob/master/Section%203.%20Hierarchical%20modelling.ipynb) [## PyMC3 和 Theano-pymc 3.6 文档
Theano 是一个包,它允许我们定义涉及数组操作和线性代数的函数。当我们定义一个…
docs.pymc.io](https://docs.pymc.io/PyMC3_and_Theano.html)
https://www . ka ggle . com/PS bots/customer-support-meets-spacy-universe
使用 PyMC3 对福特 GoBike 乘客量进行贝叶斯建模—第一部分
Photo by Andrew Gook on Unsplash
自行车共享是世界各地城市交通等式的重要组成部分。在旧金山,自行车共享游戏的主要参与者之一是福特公司及其 GoBike 计划。方便的是,他们友好地发布他们的数据给像我这样的人研究。我想知道,根据过去的信息,是否可以很容易地预测第二天的乘客量,以确保有足够的自行车可供乘客使用?
如果我要使用 sklearn 建立一个线性回归模型,这将是一个相当简单的任务。我经常发现自己在寻找数据集,以学习机器学习中的一种新工具或技能。多年来,我一直试图找到一个借口来尝试一个概率编程包(如 PyStan 或pymc 3】,这个自行车共享数据似乎非常适合。
许多公司正在为他们的内部预测模型寻找贝叶斯推断。随着计算成本的降低,这些系统众所周知的长训练时间也减少了。值得注意的是优步发布了 Pyro ,这是一个开源框架,看起来相当灵活且易于使用。 Quantopian 是 PyMC3 的常客。据我所知,Booz Allen Hamilton 和 GoDaddy 是另外两家追求这种 ML 模式的公司。
在这篇文章中,我构建了一个简单的例子,希望对 PyMC3 初学者有所启发。我下载了 2017 年—2018 年 9 月的 GoBike 数据。然后,我每天汇总数据,以收集关于乘车者详细信息(例如,平均年龄、订阅会员)、乘车时长和乘车者总数的信息。
这些贝叶斯 ML 工具的问题是,它们可能需要很长时间来训练,尤其是在海量数据上。对于这个聚合数据集,我只有 100 多行,这在笔记本电脑上很容易训练。经过一点研究,我决定学习 PyMC3 作为我的选择。看起来它有很多很棒的教程,一个充满活力的社区,和一个相当容易使用的框架。
在这个说明性的例子中,我首先用一个健壮的定标器对数据进行定标,并绘制出 seaborn 关联热图,看看我们的模型是否可以学习任何模式。我们试图预测第二天*的值。*从热图中,我们可以看到变量之间的一些简单关系,
既有正的( scaled_total_riders ),也有负的( scaled_duration_hrs )。
让我们做一个简单的预测,并以此为基准。如果我们只取平均每日乘车人数,并以此作为我们的预测,RMSE 会是多少?通过这种简单的方法,我们预计每天可以减少大约 1900 名乘客。
具有 sklearn 的线性模型在 RMSE 表现稍好,并且非常容易实现。这个模型是我们数据中每个变量的一系列权重,还有一个截距。我们如何解释我们的模型对每一个参数的信心?
这可能是贝叶斯魔法真正闪耀的地方。与上面的 sklearn 示例相比,它无疑需要更多的代码行、更多的思考和更长的训练时间。亲爱的读者,我向你保证,这一切都是值得的。
首先,PyMC3 在引擎盖下的 Theano 上运行。我们必须对我们的 pandas/numpy 数据做一些细微的修改,最主要的修改是通过设置一个共享张量,如下所示。
When we look to make predictions for our model, we can swap out X_train for X_test and use the same variable name.
现在我们已经建立了数据,我们需要构建我们的模型,我们通过调用 pm 来初始化它。型号()。在这个模型环境中,我们需要建立一套完整的关于先验(参数)和输出的假设。对于您的第一个模型,正态(高斯)分布是相当安全的。
这构成了我们的模型规格。现在我们必须了解模型权重的后验分布。与 sklearn 不同,系数现在是值的分布,而不是单个点。我们对一系列可能的权重进行采样,看起来与我们的数据吻合的系数被保留在一个叫做 trace 的东西中。采样函数(NUTS、Metropolis、等)远远超出了本文的范围,但是有大量的知识库描述它们。在这里,我们从模型中构建我们的跟踪:
NUTS sampler 抱怨说使用 find_MAP()不是一个好主意,但是这经常在教程中使用,并且似乎没有影响我的性能。
我们还可以尝试一种不同的采样器,试图逼近后验分布:
轨迹可以被绘制出来,通常看起来像这样。 beta 参数在分布上看起来相当受约束(左图),并且在我们跟踪的最后 1000 个采样项目上看起来相当一致(右图)。阿尔法参数看起来不太确定。
现在我们有了后验样本,我们可以做一些预测。我们通常会在 PyMC3 中观察到一个所谓的“老化”期,在此期间,我们会丢弃跟踪的前一千个样本( trace[1000:] ),因为这些值可能没有收敛。然后,我们从该轨迹中抽取 1000 个样本权重,计算可能的预测,并取该值的平均值作为该数据点最可能的预测。从这里,我们简单地计算 RMSE。
如果我们想在维持数据集上进行测试:
因此,我们建立的这个模型比我们的原始方法(平均乘客量)表现得更好,但比我们的 sklearn 模型稍差。在 Github repo 中包含的一个示例中,我能够通过缩放 Y 值并将其建模为正态分布变量来构建一个类似的模型,该模型优于 sklearn 模型。
进一步调整模型参数,使用不同的标度,假设更宽范围的可能β参数都可以用来降低这个例子的 RMSE。这篇文章的目的是介绍模型构建的基础知识,并提供一个可编辑的例子,你可以尝试和学习!我鼓励你在下面的评论区提供反馈。
总而言之,贝叶斯模型是有代价的。实现和编写模型肯定需要更长的时间。这需要一些贝叶斯统计的背景知识。训练时间比使用 sklearn 长几个数量级。然而,像 PyMC3 这样的工具可以为您的数据和模型工件提供更好的控制、理解和欣赏。
虽然 PyMC3 中有很多好的教程(包括它的文档页面)但是我找到的最好的资源是 Nicole Carlson 的视频。它探讨了熟悉 sklearn 的数据科学家如何构建 PyMC3 模型。细心的读者会发现我从那个视频中采用了许多例子。我还从概率编程和黑客贝叶斯方法中学到了很多,这是一个基于笔记本的免费教程,介绍使用 PyMC3 的实用贝叶斯模型。这两个资源绝对惊人。杜克大学也有一个示例网站,其中有大量数据情况,我发现这些数据很有参考价值。“走向数据科学”在这一年里也发布了许多关注贝叶斯分析的酷帖,并帮助激发了这篇帖子。
在下一篇博文中,我将说明如何构建一个分层线性模型(HLM ),这将极大地提高我们最初方法的性能。下面是一个可以派生的 Kaggle 内核和一个 Github repo,你可以克隆它来处理数据和开发你自己的 PyMC3 模型。感谢您的阅读!
[## 逐日预测| Kaggle
编辑描述
www.kaggle.com](https://www.kaggle.com/franckjay/daybydaypredictions)
基于 PyMC3 的职业掩护比赛贝叶斯建模
Photo by AC De Leon on Unsplash
职业电子竞技变得越来越受欢迎,这个行业正在迅速发展。这些职业游戏联盟中的许多都是基于有两个团队进行比赛的游戏。使命召唤、英雄联盟、守望相助都是例子。虽然这些可以与传统的团队运动相媲美,但电子竞技的新颖性意味着人们对预测这一新兴行业的结果关注较少。
你如何模拟对抗性团队游戏?我最初是在阅读克里斯托弗·毕晓普(Christopher Bishop)的新机器学习电子书时受到启发开始这个项目的,其中有一章专门介绍了使用 Elo 评级系统计算游戏中玩家的排名。对于那些熟悉国际象棋的人来说,你可能以前遇到过这个指标。我在数据怀疑论者上找到了一篇非常有启发性的博文。下面贴的所有方程式都是从前面提到的怀疑论者那里借来的。
本质上,Elo 是一个框架,用一个单一的数字(R1 = 2000)来衡量一个玩家的实力。任何给定球队的预测实力由逻辑函数( R )表示,给定比赛的结果由单个球队的实力与其得分之和的比率表示( E )。
Logistic Function for player i.
Expected Outcome for player i
如果一个力量为 2000 的玩家面对一个 Elo 等级为 1000 的玩家,我们可以预测前者很有可能获胜( E=0.9968 )。
Rating update for player i (K~32 in Chess)
在每场比赛结束时,球员的分数会根据他们的相对实力进行更新。如果被看好的玩家赢了(S_i = 1.0),他们的分数会有一个小的正调整。如果失败者赢得了比赛,他们可以获得更大的金额,因为结果是出乎意料的。在给定的处于劣势的一方获胜的例子中,他们的分数将从 1000 变为 1031。受青睐的玩家的分数也会降低。
这和非常受欢迎的团队射手看守有什么关系?我想知道,有人如何能够在不求助于令人难以置信的复杂架构的情况下,对如此动态的基于团队的运动的难以置信的复杂性进行建模?我在 PyMC3 网站上看到了一个关于使用分层正态分布对职业橄榄球队进行编码的示例代码。刚刚写了一篇关于等级模型的博文,我想我可以尝试类似的东西!
本质上,我们将每个团队视为一个单独的实体。尽管团队由多个成员组成,每个成员都独立工作。我们将从两个方面证明这一选择:1)将一个团队建模为一个单独的等级,而不是每个单独的玩家,更容易;2)队友们在一起工作(理想情况下),因此他们可以被建模为一个集体单位。如果两个队以前没有交手过,Elo 等级也是非常有用的。没有任何历史比赛,我们可以利用两个对手共有的团队比赛来进行预测。
数据从守望联盟 2018 赛季刮来的。不幸的是,我们可以用来训练模型的比赛并不多。由于 2019 赛季正在进行中,任何感兴趣的读者都可以开始将这些数据添加到模型中,看看它的表现如何!在训练我们的模型之前,必须清理和处理原始数据格式。
Win/Loss aggregations for the regular season
我们可以用两种基本方法来表示我们的数据,这将改变我们构建模型的方式。最简单的方法是让这成为一个分类挑战。每场看守对决都包括多个回合,比赛的获胜者将获得最多回合的胜利。例如,旧金山冲击以 3 比 2 击败佛罗里达大混乱。我们可以将这表示为数据中总共 5 个记录,具有不同程度的成功和失败(0/1)。
Classification or Bernoulli trial for this simple example
我们可以如下构造我们的数据分割。对于常规赛中的每一场比赛,我们都将每一场输赢建模为一个二元目标。每个团队的 Elo 评级将根据上面列出的等式进行推断,这些等式将评级转换为伯努利试验。然后,我们将使用我们学到的评级来预测季后赛中的所有比赛。我们的 PyMC3 模型将包含一个二项式:对于给定的比赛,我们预测成功还是失败?
A sample trace of our simple model.
我们也可以用分数来表示我们的比赛。同样是一场 3 比 2 的比赛,旧金山休克队获胜,我们可以把它编码为 0.6 分。现在我们有了稍微多一点的灵活性,因为我们可以将它建模为一个回归任务,或者仍然保持它作为一个分类。这个结果也为模型提供了更多的细微差别。一场 0.8 分的胜利比一场 0.6 分的胜利对同一个对手要有利得多。
The ROC suggests the model is decent at predicting matchups
不管您的选择如何,训练误差似乎相当稳定。我们的模型能够根据他们的 Elo 分布预测哪个队会赢。当我们把这种模式应用到季后赛中会发生什么?
我们在季后赛评估中做了一些假设:
- 常规赛结束的球队在技术、球员、策略等方面都是固定的。
- 季后赛足够重要,不太可能发生的事件不能主导结果(少量样本)
- 我们的常规赛在所有球队中公平分配(循环赛)
这些假设肯定会露出丑陋的嘴脸。2018 年季后赛只有 12 场,淘汰来得很快。这意味着,如果一个球队有一场相当糟糕的比赛,这不是他们真正技术的特征,他们可能没有机会挽回自己。当真正的挑战出现时,球队也可以增强实力,这是季后赛的本质。
当我们将我们的模型应用于季后赛数据时,我们得到了非常差的性能。我们的模型还不如随机猜测!这里发生了什么?
Playoff Record and the predictions
简单来说,我们有几个团队颠覆了苹果车。费城融合(第 9 队)击败了波斯顿和纽约州(赢了 4/5 场比赛),尽管 Elo 评分较低。Fusion然后输给了伦敦 Spitfire,尽管排名比 LA Valiant* 低,但后者最终赢得了比赛。真不敢相信这就是为什么人们喜欢看体育比赛,因为你永远不知道谁会赢。*
如果你渴望尝试一些不同的贝叶斯方法来玩这样的游戏,艾伦·唐尼的书 Think Bayes 有一节是关于通过泊松过程和他们的历史得分记录来建模团队的。最近 Tuan 发表了一篇关于建立职业足球联盟投注策略的文章。
请随意通过我的 Kaggle repo 下载数据和我的笔记本。我还有一个 Git 回购一些精选笔记本。请在下面留下你的评论或问题,我会尽力回答。感谢阅读!
张量流概率中的贝叶斯神经网络:快速入门。
前言:贝叶斯神经网络允许我们利用不确定性,因此允许我们开发稳健的模型。因此,关于不确定性的知识是开发健壮和安全的机器学习技术的基础。在这篇文章中,我们概述了两种主要类型的不确定性,以及如何通过简单模型使用张量流概率对它们建模。我们采用贝叶斯框架,它适用于深度学习和强化学习。为了完整起见,让我们重申一下贝耶法则:后验概率是先验概率乘以可能性。
*后验,P(H|E) =(先验 P(H) 似然 P(E|H))|证据 P(E)
其中 H 是一些假设,E 是证据。
在贝叶斯世界中,我们使用概率分布。例如,考虑我们是否使用高斯分布作为先验假设,个体概率为 P(H)。我们知道这个先验可以用一个均值和标准差来表示,因为我们知道它的概率分布函数。
我们应用 Bayes 规则,在观察到一些证据 E 后,得到后验分布 P(H|E),这个分布可能是也可能不是高斯!假设如下图所示的对数正态分布,也可以用均值和方差及其概率密度函数来表示。这种使用分布的概念允许我们量化不确定性。在模型方面,假设是我们的模型,证据是我们的数据。
不确定性可以分为两大类:
任意不确定性**(又名已知未知)**
这是一种增加更多数据也无法解释的不确定性。例如,在掷硬币的随机性{H,T}中,我们知道 p=0.5 的结果将是随机的,进行更多的实验,即掷硬币不会改变这种不确定性,即每个结果/数据点具有相同的概率 0.5。
一个具体的深度学习示例是自动驾驶汽车、医学图像分割(患者在扫描仪中的移动非常常见)、金融交易/风险管理,其中生成我们的数据/观察的底层过程是随机的。来源包括不同种类的设备/传感器(包括摄像机和与之相关的问题),或金融资产和拥有它们的交易对手,对象不同。在医学上,这些可能是不同的基因型,有不同的临床病史。这里,如果不确定性估计值很高,我们不会开诊断处方。事实上,如果医生不知道根本原因,他们可能会进行专家咨询。
任意的不确定性,不会随着样本数据集的增加而增加。因此有两种类型同方差(常数/任务相关)和异方差(变量)随机不确定性。
我发现从一个例子开始很有用(这些例子来自 Josh Dillion,他在 Tensorflow dev submit 2019 上展示了非常棒的幻灯片)。考虑 Keras 中的以下简单模型,其中我们将先验置于目标函数之上,以量化我们估计中的不确定性。注意红线是线性拟合(β),绿线是线性回归β的标准差
完整的自下而上示例也可从获得,建议阅读。
认知不确定性(又名未知的未知)
这是数据驱动的不确定性,主要是由于缺乏训练数据。通过将先验置于神经网络的权重 w 之上或采用大型训练数据集,采用变分/近似推理(例如贝叶斯的反向支持)来减少认知不确定性也是可行的。
Alex Kendal 和 Yarin Gal 在他们的博客文章和论文《有原则的方式》中将这些结合起来用于深度学习。它们在这些背后提供了基本的数学基础。
在我们讨论的例子中,我们假设一个 1 层隐藏网络。如果我们不知道模型或目标函数的结构会怎样?
我们可以使用高斯过程,高斯过程优先于函数!注意函数而不是变量(例如网络或目标/损失函数的权重)!下面是一个玩具示例。神经网络是一种函数估计器。我们将在另一篇文章中详细讨论这些问题。
但是通过改变我们的目标函数,我们获得了更好的数据拟合!!
希望仔细阅读这三张幻灯片可以展示贝叶斯框架的力量和它与深度学习的相关性,以及它在张量流概率中是多么容易。总结一下的要点
- 我们可以应用贝叶斯原理来创建贝叶斯神经网络。
- 在贝叶斯框架中,将先验分布置于神经网络、损失函数或两者的权重之上,我们基于证据/数据学习后验分布。这允许通过放置先验权重和目标函数,通过获得由我们的数据最佳解释的后验概率,来减少/估计建模中的不确定性。
- 例如,可以通过放置先验过损失函数来管理任意不确定性,这将导致模型性能的改善。
- 认知不确定性可以通过先验加权来减少
- 高斯过程,可以允许确定最佳损失函数!
- 这一切都归结为后验计算,需要采样方法或变分推断技术来近似后验分布。
- 当前的限制是在大规模或实时生产环境中进行这项工作是后验计算。变分推理技术和/或有效的采样方法来获得后验是计算要求高的。特别是在处理具有数百万个参数的交易学习模型时。Yarin Gal 提供了一个特别见解,他认为漏失是深度模型的合适替代。推导和详细解释见 Yarin 的博文。然而,还需要做更多的工作。
- 当前技术水平已经在张量流概率中可用
贝叶斯神经网络(LSTM):实现
贝叶斯推理允许量化不确定性,因此,能够开发健壮的机器学习模型。在实践中,需要采用抽样方法来近似贝叶斯设置中遇到的后验分布/积分。对于实践中典型使用的大型神经网络,采样方法是计算密集型的。变分推理方法已经被发展来克服这个限制。在早先的帖子中,我们讨论了实践的理论方面,变分推理算法,Bayes (BBB)的 Back Prop。BBB 通过设置权重先验,提供了一种减少认知不确定性的有效方法。认知不确定性通常与缺乏训练数据有关。在这篇文章中,我们考虑了 BBB 的实际应用,特别是对 LSMT 的应用。
From Fortunato et al, 2017
Tensorflow probability 已经为标准层提供了一个实现,比如密集、卷积。下面显示了一个网络模型示例,请注意,API 与 Tensorflow API 非常相似。因此,如果您需要使用这些标准图层之一,请查阅官方文档。
LSMT: 需要更多工作的一个例子是 LSTM。LSTM 是一类递归神经网络。Colah 的博客对此做了很好的解释。LSTM 的一步一步的 Tensorflow 实现也可以在这里找到。如果你对 LSTM 的基本知识不确定,我强烈建议你在继续之前阅读它们。 Fortunato 等人,2017 年验证了贝叶斯 LSTM。原始源代码是可用的,不幸的是,我发现它很难跟上。
实现包含 LSTM 的这四个方程
我们需要权重的先验和变分后验。
我们通过为每个权重指定其(均值=0,标准差=1)来使用正态/高斯先验。
通过效用函数获得每个权重“w”的变分后验概率
该函数还计算这些权重的 KL,并将其添加到张量流集合中。该功能在 github 上可用。
为了实现贝叶斯 LSTM,我们从 tensorflow 的基本 LSMT 类开始,并通过向权重添加变分后验来覆盖调用函数,之后我们照常计算门 f、I、o、c 和 h。这里的非常简单明了。
这确保了我们拥有一致的 tensorflow API,然后能够在此基础上构建我们的模型,例如,使用多层 LSTM 的情感分析任务。请注意,结果测量的不确定性相当简单(二元)。
这里我们定义贝叶斯 LSTM 层,并通过单元格函数执行展开。这个实现的一个缺点是不能使用 tf.nn.dynamic_rnn,因为它会产生与梯度检查相关的循环错误。
然后,我们可以获得逻辑和损失,注意,我们对 softmax 层采用变分后验概率
在训练中,我们获得了我们创建的每个变分后验概率的 KL 集合。这使我们能够计算总 KL 损失,除以批量大小以获得基于证据的下限,如 Fortunato 等人的论文中所述。
仅此而已。其余代码只是标准数据输入和训练循环,模型保存等可以在这里找到。然后我们可以补充文中提到的其他方面。
贝叶斯噩梦。解决了!
通过 Python PyMC3 中的示例和代码对贝叶斯数据分析进行了温和的介绍。
在本文中,我们提供了一种温和而实用的方法来轻松使用贝叶斯机器学习。结合实例和说明,介绍了先验、生成模型、后验分布、贝叶斯定理、可信区间等贝叶斯概念。你将在使用 Python 的营销活动中应用贝叶斯方法来估计注册率。20 世纪被零假设显著性测试所主导,而 21 世纪正在变成贝叶斯(来源:JK Kruschke)。
如果你看完这篇文章还没有开始热爱贝叶斯,那就向拉普拉斯伸出援手吧!
credits: Sophie Madeleine
谁没听说过贝叶斯统计很难,计算速度慢,无法扩展到大数据,结果是主观的;而我们根本不需要?在接触贝叶斯技术之前,我们真的需要先学习大量的数学和经典统计学吗?为什么最流行的关于贝叶斯统计的书都有 500 多页?
贝叶斯噩梦是真实的还是神话?
有人曾将贝叶斯方法比作米其林星级厨师的厨房,配有高质量的厨师刀、汤锅和昂贵的煎锅;而频率主义就像你的普通厨房,有香蕉切片器和意大利面锅。人们谈论 Bayesianism 主义和 Frequentism,好像他们是两个不同的宗教。你是哪个厨师?Bayes 真的在一开始就给数据科学家增加了使用大脑的负担吗?因为 Bayesian 主义是最聪明的人的宗教?“贝叶斯”这个词到底对不对?
贝叶斯数据分析的构建模块
贝叶斯方法的本质特征是在基于统计数据分析的推理中明确使用概率来量化不确定性。最近,人们越来越重视区间估计,而不是假设检验。这为贝叶斯观点提供了一个强大的驱动力,因为大多数标准置信区间的用户似乎通过常识给出了贝叶斯解释。如果需要的话,我们建议浏览下面的文章作为概率的复习。
数据科学家概率概念实用指南
towardsdatascience.com](/understanding-probability-finally-576d54dccdb5)
数据分析的贝叶斯方法通常需要数据,一个生成模型和先验。在传统方法中,数据用于拟合线性回归线,例如,为了估计最适合描述线性趋势的截距和斜率。没有直接的方法来包含我们对正在估计的那些参数的先验信念。贝叶斯方法允许我们基于我们现实生活中的领域知识和常识,对截距和斜率进行事先的良好猜测。此外,我们还可以陈述这个猜测的不确定性。例如,我们可以说,根据经验,斜率是从具有均值μ和标准差σ的正态分布绘制的,而典型截距值将是具有均值θ 和标准差ρ的正态分布。给定描述我们先前信念的分布,我们可以使用生成模型生成模拟数据,如下图所示。
用贝叶斯方法估计注册率
让我们考虑一个现实生活中的例子,我们感兴趣的是估计销售漏斗中的线索转化率:有多少网站的访问者变成了付费客户。通常情况下,营销部门会开展一项活动来吸引观众并鼓励他们注册。如果我们观察到 16 个访问者中有 6 个注册了,这是否意味着注册率 θ 是 6/16=38%?这个百分比有多大的不确定性,尤其是在数据量很小的情况下?贝叶斯数据分析有助于找到这些问题的答案。
先验信念
我们从寻找先验开始,这是销售部门根据经验或给定的行业现状观察到的典型注册率的信念。让我们假设,根据销售额,0%到 100%之间的任何注册率都是同样可能的。因此,我们可以将注册率的先验分布设为均匀分布。
样本生成
接下来,我们构建了一个生成模型,该模型针对之前发行的任意随机选择的注册率来模拟大量营销活动。例如,如果选择 55%作为注册率,这就像问 16 个潜在客户,其中每个客户注册的机会是 55%。因此,生成模型是参数为 16 和θ的二项式分布。我们模拟生殖模型 10 万次。每次,我们从均匀分布中抽取一个随机θ,并通过从二项分布中创建 16 个“假”客户来运行生成模型。在这个过程结束时,我们有 100,000 个样本。
后验分布
现在,是时候引入我们的数据了,它告诉我们,真正的营销活动取得了什么,这是 6/16=38%的注册率。因此,我们过滤掉模拟注册率不是 6/16 的模拟样本,只保留那些模拟注册率是 6/16 的模拟样本。下图显示了这一过程。请注意,相同的先前抽奖(例如 21%)可以从二项式分布中产生不同的注册率(例如 4/16 和 6/16)。
下图说明了贝叶斯抽样和剔除过程。
现在,我们一方面考虑来自均匀分布的所有 100,000 次θ抽取,另一方面,我们查看在过滤掉那些没有产生 6/16 注册率的样本后保留的θ。如果我们计算两个桶中每个值的频率,那么我们最终得到下面的直方图。
结果解释
蓝色曲线显示了注册率的所谓后验分布。这就是我们一直在寻找的答案。正如我们所看到的,注册率是相当不确定的,我们不能 100%肯定地说它是营销部门发现的 38%。很可能在 20%-60%之间。利用后验分布,我们可以给出关于不确定性的陈述。最有可能产生我们观察到的数据的参数值将是后验分布中概率最高的注册率:38%。这也叫最大似然估计,是经典统计学中估计未知参数最常见的方法之一。这就是为什么贝叶斯方法可以被视为最大似然估计的扩展。我们还可以计算所有概率的均值,即后验均值作为注册率 39%的最佳嘉宾。通常还会计算包含后验分布中 90%概率的最短区间,称为可信区间,在这种情况下,可信区间介于 30%和 40%之间。因此,我们可以说,有 90%的概率签约率在 30%到 40%之间。
16 个销售线索中有 6 个注册并不总是意味着 38%的注册率!
贝叶斯定理
我们是如何从先验走向后验的?我们来看一个例子,我们从均匀分布中画出θ=35%,概率为 P(35%)。为了不丢弃θ,它必须允许我们模拟与营销数据相匹配的数据。换句话说,在θ=35%的情况下,有 6 次注册的概率 P(6|35%)。通过将这两个量相乘,我们得到绘制θ=35%的概率,并模拟与我们观察到的注册率相匹配的数据。该值将与 35%的概率成比例,该概率是导致 6 个观察到的注册的最佳参数值。如果我们将该数量除以产生所有可能参数值的数据的总概率,我们得到在给定数据 P(35%|6)的情况下具有 35%注册率的确切概率。当我们对从先验分布中提取的所有注册率重复这一过程时,我们获得了绘制蓝色直方图所需的所有概率,即后验分布。下图说明了这一过程。
上面的练习可以扩展到多参数θ、任何生成模型和任何数据集 d。这种概括由下面的等式说明,通常称为贝叶斯定理。
缩放贝叶斯数据分析
为了说明贝叶斯数据分析的普遍性,让我们考虑营销部门实际上开展了两次活动。在第一个实验中,他们获得了 6/16 的注册人数,而第二个实验的结果是 10/16 的注册人数。此外,销售部门事先认为注册率从未超过 20%,过去一直在 5%到 15%之间。现在,我们有两个参数 θ 1 和θ2 以及两个生成模型。我们还得到一个不均匀的信息先验,我们可以用参数为 2 和 25 的 Beta 分布来表示,如下图所示。
我们现在可以从两个生成模型中抽取 100,000 个样本,保留那些匹配的营销数据,并构建两个后验分布,每个活动一个。当考虑销售人员的先验信念时,后验分布可用于得出活动有效性的结论。我们还可以通过计算两个后验分布之间的差异来比较这两个活动。
贝叶斯线性回归
在我们对贝叶斯哲学感到更舒服之后,我们将对更扩展的营销数据集执行贝叶斯线性回归,该数据集描述了线索转化( y 对时间( x )的关系。在下图中, x 表示在时间 x=0 推出新公司网站前后的周数,其中 x=-10 为推出前 10 周, x=+10 为推出后 10 周。 y 表示 y 正值的签约率,或者 y 负值的流失率。当网站失去访问者时,就会发生流失。营销感兴趣的是估计未来预期的注册率或流失率的不确定性。
正如前面几节所介绍的,贝叶斯统计是一种将概率应用于统计问题的数学方法。它为人们提供了工具来更新他们对新数据证据的信念。贝叶斯定理描述了基于数据的事件的条件概率,以及关于事件或与事件相关的条件的先验信息或信念。贝叶斯定理可用于计算后验概率(考虑新信息后事件发生的修正概率)。通过更新先验概率来计算后验概率。先验概率是基于实验前的现有知识的结果的概率。
贝叶斯线性回归可能允许一种有用的机制来处理数据不足或分布不良的数据,就像上面图中出现的情况一样。它允许我们在参数和噪声上加上一个先验,这样在没有数据的情况下,先验就可以接管。
生成模型
在贝叶斯观点中,我们用概率分布来表述线性回归。响应 y 不被估计为单一值,而是假设从概率分布中提取。
然而,根据线性回归方程,我们认为 y 最可能的值如下*。*
尽管 μ 是 y 的最可能值, y 也可能包含一些误差或噪声。因此,我们通过调整方差项 σ 来补偿 y 与 μ 的偏差,从而对观测值中的这种误差 ϵ 进行建模。
传道者
不仅响应是由概率分布生成的,而且模型参数也被假定来自一个分布。假设 y 上的噪声呈正态分布,我们还包括斜率和截距的先验信息,如下所示。
后验分布
模型参数的后验概率取决于训练输入和输出:
上面的等式再次反映了我们之前在一个更简单的例子中学到的贝叶斯定理。到目前为止,我们通过生成 100,000 个样本并排除那些与数据不匹配的样本来计算后验概率的特定计算方法仅在极少数情况下有效。它被称为近似贝叶斯计算。尽管它在概念上很简单,但对于大型数据集来说,它可能会慢得令人难以置信,而且伸缩性也很差。还有更快的方法,主要是所谓的马尔可夫链蒙特卡罗 ( MCMC )算法家族。具体流行的例子包括汉密尔顿蒙特卡罗和大都会-黑斯廷斯。
下面我们使用 Python 库 PyMC3 实现 MCMC 来寻找模型参数的后验分布。
贝叶斯模型提供了比普通最小二乘回归更多的解释机会,因为它提供了后验分布。贝叶斯线性回归将给出模型权重的后验分布,而不是模型权重的单点估计。我们可以使用这个分布来找到最可能的单个值,以及模型参数的整个可能值范围。
PyMC3 有许多用于可视化和检查模型运行的内置工具。这些让我们看到分布,并提供一定程度的不确定性的估计,这应该是任何模型的必要部分。下面我们看到所有模型参数的轨迹。轨迹图往往围绕真实参数呈正态分布,这是样本向目标分布收敛的好迹象。
pm.traceplot(linear_trace, figsize = (12, 12))
结果解释
模型参数的后验分布如下所示。营销部门预计注册率(斜率)平均每年增长 4.7%。有 94%的可能性签约会以 4.4 之间的速率增加。%和未来的 5.1%。网站启动时的注册率(在第 0 周截距)在 4.6%和 7.2%之间,概率为 94%。签约率的标准差预计平均为 6.6%。
pm.plot_posterior(linear_trace, figsize = (12, 10), text_size = 20);
我们还可以可视化模型参数的可信区间。注册的变化率(斜率)比第 0 周的注册率具有更小的不确定性。
pm.forestplot(linear_trace);
贝叶斯数据分析的优势
我们还可以使用模型结果生成线性回归线的预测。下图显示了从后验概率绘制的回归线的 100 个不同估计值。线的分布给出了估计中不确定性的估计。贝叶斯线性回归的好处是,它给我们一个后验分布,而不是一个单点估计的频率普通最小二乘回归(OLS)。
结论
在这篇文章中,我们对统计学和机器学习的贝叶斯方法做了一个简单的介绍。特别是,我们量化了营销活动中注册率点估计的不确定性。结合实例和说明,介绍了先验、生成模型、后验分布、贝叶斯定理、可信区间等贝叶斯概念。我们还介绍了使用贝叶斯方法的线性回归的 Python 实现,并将其与经典的普通最小二乘法进行了比较。本文对 PyMC3 提供了一些提示,pymc 3 是一个用于贝叶斯分析的简单易用的 Python 库。
不要试图在一篇文章中塞进太多内容,你可以转向书籍,比如 Andrew Gelman 等人的 Bayesian 数据分析。艾尔。
这篇文章的灵感来自拉斯穆斯·巴斯的材料,他以非常直观的方式讲授贝叶斯数据分析。我强烈推荐他在数据营关于 R 的贝叶斯数据分析基础的课程和他在 YouTube 上的视频。
好吧,这篇文章不知何故已经激发了读者开始喜欢 Bayes。如果你仍然喜欢机器学习的非贝叶斯方法,我可以理解。在这种情况下,你会得到我下面的文章。
在开始是神经元:梯度下降,反向传播,回归,自动编码器,细胞神经网络…
towardsdatascience.com](/why-deep-learning-works-289f17cab01a)
交易中的贝叶斯优化
算法交易和机器学习有类似的问题。今天,我将展示如何应用贝叶斯优化来调整交易策略超参数。
让我们假设你用几个超参数创建了一个交易策略。这种策略在回溯测试中是有利可图的。您希望将策略部署到生产模式,但是还有一个问题:“这组参数是最优的吗?”。
通常,网格搜索方法用于搜索最佳超参数。这种方法也用于机器学习,但这需要大量的计算,通常在错误的参数空间中。
另一种方法是随机搜索,它的性能比网格搜索稍好。
我在 Quora 上找到了一个很棒的解释:
**问题:**目标是找到某个“昂贵”函数的近似最小值。这样一个函数接受一个实值向量 𝐱 ∈ℝ,返回一个标量,并且花费了相当长的时间。此外,没有可用的梯度计算。让我们想象一个简单的一维情况:
虚线暗示我们看不到这个函数——我们只能选择在某些点上对它求值。
因为这个函数是昂贵的,假设我们有一个固定的评估预算——我们可能只评估它,比如说,10 次。
有了这个,你如何找到最好的最小值?
**想法是这样的:**对一些输入-输出(少于 10 个)进行采样,并使用它们用一种叫做“高斯过程”(或这里的“GP”)的东西来猜测真正的函数。然后使用猜测函数来确定下一步在哪里求值。评估该点,将其添加到我们的输入-输出集,并再次推断猜测的函数。重复这个过程,直到你用完了你的评估预算(或者其他一些停止标准)。如果 GP 擅长猜测真实函数,我们会比随机抽样做得更好。
为了对 GP 有一个感觉,让我们从我们昂贵的函数中抽取四个点,把它们交给 GP,让它推断函数的其余部分。可能是这样的:
绿色实线是我们对真实函数的猜测。每增加一个绿色条带,就是输出分布的另一个半标准差。
所以现在问题变成了:给定所有这些有用的猜测信息,我们下一步应该检查哪一点?在回答这个问题时,我们关心两件事:
我们应该评估我们认为会产生低产值的点。也就是说,我们应该评估绿色实线较低的点。
我们应该检查我们不太了解的领域。因此,在上图中,检查 0.65 和 0.75 之间的某个位置比检查 0.15 和 0.25 之间的某个位置更明智,因为我们对后一个区域的情况有相当好的了解。换句话说,我们应该检查最能减少我们猜测中的方差的区域。
平衡这两者是勘探开发的权衡。到目前为止,你会寻找新的地点或者开发你已经发现的金矿吗?我们用一个获取函数来明确我们的偏好。这是𝑥x 的一个函数,它将产生一个数字,告诉我们这两个目标实现得有多好。这个函数很便宜,所以我们可以优化它,并使用𝑥x 作为我们下一个搜索点。
那么哪个采集函数呢?嗯,有几个选择,但我会选择期望改善。也就是说,评估预期改进最高的下一点。
所以如果:
𝜇(𝑥)μ(x)是𝑥x 函数的猜测值(绿线)。
𝜎(𝑥)σ(x)是𝑥x 产量的标准偏差(与绿色带成比例)。
那么我们对改善的获得/期望(称之为𝐴(𝑥)A(x))是:
其中φ(⋅)和 N(⋅)分别指标准正态分布的 CDF 和 PDF。准确理解这个公式并不重要——只要知道它是低𝜇(𝑥)μ(x 和高𝜎(𝑥)σ(x).的某种平衡
要了解这是如何操作的,请查看我们之前的图表:
这将告诉我们检查𝑥=1,因为该点的激活度最高。
然后重复。就是这样!就像我之前说的,如果 GP 擅长猜测真实函数,它会击败随机抽样。
这篇文章比较了机器学习中超参数调整的不同方法。它表明贝叶斯优化是一种比随机、网格搜索或手动更好的方法。
贝叶斯优化
Siraj Raval 的这段视频也有很好的解释:
如果你想深入这个话题,你应该阅读这篇文章。
实际例子
我们将考虑我之前讨论过的一个策略。该策略有 4 个超参数,让我们定义所需的库:
贝叶斯优化在hyperpt包中实现。你可以在 Will Koehrsen 的文章中找到这个包的介绍。
通常,研究者使用回测来寻找最优超参数和样本外检验进行评估。我喜欢这种方法,但是我认为如果我们使用一些回溯测试周期(折叠),我们可以得到一个更有意义的结果
当折叠更接近样本期外时,则折叠在最终加权分数中具有更大的权重。
此外,如果某个文件夹的性能不佳,该函数应该惩罚最终值。作为交易中的一个评分函数,你可以使用成交比率,或者任何评估策略质量的函数。就我们的目的而言,值越低越好。这意味着我们应该反转 Sortino 比率值。
在本例中,我们将使用:
- 训练(优化)步骤一个月五倍
- 一个月为测试期,三周为验证期(出样期)
测试阶段允许选择将在验证阶段进行测试的配对。
- 培训时间:2018 年 6 月 1 日至 2018 年 10 月 31 日
- 测试时间:2018 年 11 月 1 日至 2018 年 11 月 30 日
- 验证期:2018 年 12 月 1 日至 2018 年 12 月 21 日
让我们定义周期、超参数空间和一个weighted_mean
函数。该代码允许通过period_weights
定义不同的折叠长度。
下一步是定义运行算法和测量性能的得分函数(在本例中是 Sortino ratio)。
这个函数太长了,因为它还包含了上一篇文章中算法的嵌套函数。用于将参数从hyperopt
包传递到催化剂框架的替代变体是使用os.environ
模块。如果你知道更好的方法,请在评论中告诉我。也许来自谜项目的人会给出正确的答案。
核心是objective
函数,通过weighted_mean
函数衡量几个褶皱的表现,否则取最大褶皱(惩罚)。
接下来的代码运行 300 次迭代的优化。
输出如下所示:
此表包含按分数排列的试验前几名。最后一行是最佳超参数集。我使用 Bitfinex 数据为 ETH/BTC、LTC/BTC、XMR/BTC 和 ZEC 等公司进行了这个实验。
理论上可以把objective value
在 3D 空间中可视化,像维度 1 — 维度 2 — 目标值,最优解具有全局最小值:
3D space of objective function
该超参数表显示了每项资产的最佳参数值:
Best hyperparameters
资产选择(测试步骤)
在这一步,我们应该在测试阶段为特定资产运行具有固定超参数的策略。具有正面性能的资产将被选择用于下一步(样本外测试)。
这个代码允许这样做,你只需要改变超参数并设置加密货币。
如您所见,两项资产(ETH/BTC 和 XMR/BTC)取得了积极的业绩。
Testing period performance
样品外测试(验证步骤)
当我们找到最佳超参数和选定的资产时,我们可以在不用于优化的时段(验证时段)运行交易算法。
让我们根据这两种资产建立一个投资组合。在 *t = 0 时,*根据其目标值(-15.45 和-9.72)的比例设置每个资产资本。
理论上,每项资产的权重可能不同。例如统一分配或其他方法。投资组合的最终权益结合了这些资产的表现。
Equity and drawdowns of portfolio
Performance of portfolio
总的来说,该策略在样本外期有积极的表现。表中展示了基本指标。
正如你在上面的图表中看到的,提取期太长了。很可能,算法无法适应之前快速增长后的下降。你可以在制定目标函数时考虑到这一点。
在测试阶段,我们从投资组合中剔除了两项资产(LTC/BTC 和 ZEC/BTC)。让我们看看这是不是一个正确的决定:
Dropped out assets
是的,这个决定是正确的。如果包括这些资产,投资组合会更糟糕。混淆矩阵看起来像这样:
Confusion matrix
如我们所见,我们没有 I 型错误。我们只从投资组合中剔除了 ZEC/BTC,但这一资产在验证阶段表现良好(第二类错误)。在这种情况下,这没有包括一些不能盈利的资产重要。
结论
在本文中,我们介绍了以下内容:
- 建议优化交易策略的方法,包括培训、测试和验证步骤。
- 公式化的目标函数结合了不同折叠的得分值。
- 你可以在 github 上探索开发的脚本。
这个例子不是最终的交易策略——给定的结果可能是随机的。需要大量的实验才能得出适合交易的结论。
如何改进这种方法:
- 根据你的目标定义你自己的目标和得分函数。
- 定制培训/测试/验证周期。
- 创建一个包含大量资产的投资组合,以测试这种方法可能对你有效的假设。
- 使用移动步行测试获得更有意义的结果。它允许模拟更接近真实交易的情况。你会得到更多的数据用于统计推断。
让我知道你对自己的交易策略使用什么优化方法。
最诚挚的问候,
贝叶斯优化和量子计算
贝叶斯优化如何帮助量子计算成为现实
量子计算机有可能比传统计算机快得多,这将彻底改变我们目前解决许多应用程序的方式。你可以在这篇详细的文章中找到答案,但是我们距离通用量子计算机还有几年的时间。然而,对于某些应用,贝叶斯优化可以帮助稳定量子电路,这篇文章将在提交给科学的论文中总结 OPTaaS 是如何做到这一点的。这篇论文背后的团队由来自马里兰大学、UCL、剑桥量子计算、思维铸造、中央康涅狄格州立大学、康涅狄格州立大学和康涅狄格州立大学的研究人员组成。
任务
这篇论文背后的研究人员正在一台捕获离子量子计算机上应用一种混合量子学习方案,以完成一项生成性建模任务。生成模型旨在学习数据的表示,以便使后续任务更容易。混合量子算法使用经典和量子资源来解决潜在的困难问题。研究中使用了条纹(BAS)数据集,因为它可以很容易地在包含水平条纹和垂直条纹的图像中可视化,其中每个像素代表一个 q ubit 。
该实验是在一台七位全可编程的囚禁离子量子计算机中的四个量子位上进行的。量子电路被构造成多层参数化的门,这些门将被优化算法校准。下图摘自该论文,说明了该设置。
训练量子电路
研究人员在论文中对训练算法使用了两种优化方法:
- 粒子群优化(PSO):一种随机方案,它通过创建许多随机分布的“粒子”来协作探索地形
- 使用 OPTaaS 的贝叶斯优化:一种全局优化范例,可以通过构建和更新底层目标函数的代理模型来处理多参数函数的昂贵采样。
你可以在下面找到关于贝叶斯优化的更详细的文章:
在某些应用中,目标函数是昂贵的或难以评估的。在这些情况下,一般…
towardsdatascience.com](/the-intuitions-behind-bayesian-optimization-with-gaussian-processes-7e00fcc898a0)
优化过程包括对于给定的一组参数,模拟经典模拟器的训练过程,而不是量子处理器。一旦确定了最佳参数,就可以在图 1 所示的离子量子计算机上运行训练程序。用于量化 BAS 分布和电路实验测量值之间差异的成本函数是原始 Kullback-Leibler 散度的变体,详见本文。
结果和展望
PSO 和 OPTaaS 的训练结果如下图所示:
Quantum circuit training results with PSO
Quantum circuit training results with OPTaaS
模拟用橙色表示,离子量子计算机结果用蓝色表示。列(a)对应于具有两层门和全对全连接的电路。列(b)和©分别对应于具有两层和四层并开始连接的电路。(a)、(b)和©分别有 14、11 和 26 个可调参数。
我们观察到,该电路能够很好地收敛,从而仅对于第一个电路产生 BAS 分布,而对于 OPTaaS,所有电路都能够收敛。根据研究人员的说法,OPTaaS 在 26 参数电路上的成功代表了迄今为止最强大的混合量子应用。
如果你想更详细地了解这项工作,请阅读论文,你也可以从我的个人资料中报名参加 OPTaaS 试验。
【更新:我开了一家科技公司。你可以在这里找到更多的
团队和资源
Mind Foundry 是牛津大学的分支机构,由斯蒂芬·罗伯茨(Stephen Roberts)和迈克尔·奥斯本(Michael Osborne)教授创立,他们在数据分析领域已经工作了 35 年。Mind Foundry 团队由 30 多名世界级的机器学习研究人员和精英软件工程师组成,其中许多人曾是牛津大学的博士后。此外,Mind Foundry 通过其分拆地位,拥有超过 30 名牛津大学机器学习博士的特权。Mind Foundry 是牛津大学的投资组合公司,其投资者包括牛津科学创新、牛津技术与创新基金、、牛津大学创新基金和 Parkwalk Advisors 。
贝叶斯先验和正则化惩罚
实证检验它们的等价性
Photo by Erik Mclean on Unsplash
执行机器学习的贝叶斯方法提供了几个优于其对应方的优势,特别是估计不确定性的能力和将上下文知识编码为先验分布的选项。那么,为什么它们没有得到更广泛的应用呢?
为了明确地被认为是一种升级,贝叶斯模型必须对所有流行的机器学习模型都有一个等效的理论公式,并恢复在其中观察到的那种预测性能。它们必须同样易于使用。
这些都是艰巨的挑战,有许多技术障碍需要克服。然而,我今天在这里不是为了对概率编程的状态进行哲学探讨。相反,我想花一些时间来探索贝叶斯方法的许多初学者教科书中提出的等价性:贝叶斯线性模型中系数的先验分布与正则化最小二乘回归中使用的惩罚项之间的等价性。
The equivalence we will be exploring
我发现这种二元性令人信服,因为就其本身而言,正规化似乎有点“杂乱无章”知道它可以在一个更大的框架内被理解和形式化是令人欣慰的,这是我认为值得凭经验探究的事情。
这种等价性有许多很好的理论处理方法,因此我选择通过改变正则化线性模型的调整参数来测试它,并查看最大系数的大小以及回归问题的误差是如何响应的。我用贝叶斯 GLM 做了同样的事情,调整了参数先验分布的方差。这是一次有趣的练习,我认为结果值得分享。
该理论
我现在想强调的是,我在这里的目的不是向那些不熟悉的人介绍贝叶斯线性模型。如果你是概率编程新手,并且有 Python 经验,我推荐针对黑客的贝叶斯方法。无论如何,我的目标是提供另一个角度来看线性回归的两个公式是如何等价的。
然而,我将简要概述线性回归的贝叶斯观点。在此公式中,响应变量 Y 被视为随机变量,其平均值等于特征 βX. 的加权和
即*Y∞N(βX,σ)。*如果噪声项呈正态分布( Y=βX+ϵ,与 ϵ∼N(0,【σ】),这相当于线性回归的标准公式。
此外,我们可以指定参数 β 的先验分布。常见的选择是高斯分布。如果我们将这个分布集中在 0 附近,这将表明我们期望参数很小。为该先验的标准差选择小值将对应于更紧密的分布,表明对小参数的更强的初始信念-类似于正则化最小二乘回归中的大惩罚。
A plot showing the sampled posterior distributions of some model parameters and the “trace” of the sampling.
在概率规划方法中,一个与我们感兴趣的所有随机变量(对于线性模型,系数和截距)的后验分布成比例的非标准化函数是根据贝叶斯定理从数据和先验中生成的。一种抽样算法,通常是马尔可夫链蒙特卡罗的某种变体,然后生成这个后验估计。我使用 PyMC3 来构建我的贝叶斯模型,并对其参数的分布进行采样。
设置
我选择用 Kaggle 上的笔记本来进行我的小型实验。我的理由有两个:
- 我希望其他人能够在不需要安装依赖项的情况下使用代码。
- 我想专注于比较我的模型的行为,Kaggle 提供了干净的数据和一个简单的导入方法
一旦我知道了我想要做的比较和情节,这是一个相当简单的过程。对于那些对技术细节感兴趣的人来说,笔记本的大部分代码都放在这个实用程序脚本中。它包含了我的实验所需的主要成分:
- 一种迭代超参数、训练模型以及报告验证错误和系数幅度的方法。
- 一个贝叶斯 GLM 的实现,带有一个 scikit-learn 风格的 API,可以插入到上面的循环中。
- 一个可以获取结果并生成线图的函数。我使用了我的文章中描述的那种模板,即以编程方式生成 matplotlib 子情节。
结果呢
下面是笔记本为岭(L2)回归和具有高斯先验的贝叶斯线性模型生成的图。如我们所料,使用具有适当范围的对数 x 轴,曲线非常相似。
我们到底看到了什么?首先,让我们回顾一下超参数。
Alpha 是控制岭回归中 L2 罚项的相对重要性的调整参数。损失函数由L = MSE+α| ||θ|给出,其中 MSE 是均方误差, θ 是系数的向量。因此,当α较大时,损耗由这一项决定,将其降至最低的最佳方法是将所有系数设为 0。
适马给出贝叶斯模型中系数先验分布的标准差。该先验被选择为正态(高斯)分布。如果它很小,那么我们的先验非常紧密地以零为中心,并且需要大量的证据(数据)来将参数的后验分布的质量从零移开。
知道了这些,上面的结果有意义吗?让我们看看:
- 随着调节参数α的增加,L2 惩罚模型中的最大系数趋于零。
- 因此,如果你一直只是猜测结果数据的平均值,误差会上升到你会得到的值。
- 同样的事情发生在贝叶斯模型中,因为先验的方差被设置得非常小。
尽管这两个模型背后的实现非常不同,一个依赖于优化,另一个依赖于采样,但我们在选择的两个度量中观察到几乎相同的行为。
结论
贝叶斯线性模型通常作为寻求学习概率编程的入门材料,包含对频率主义统计学习模型的现有理解。我相信这是有效的,因为它允许一个人在现有知识的基础上构建新知识,甚至将已经理解的东西——也许只是许多工具中的一个——放入更广泛、理论上更令人满意的框架中。
贝叶斯线性模型中选择的参数的先验分布和正则化最小二乘回归中的惩罚项之间的关系已经是众所周知的。尽管如此,我觉得我能够通过实证检验调整每个模型的超参数的效果来对这种等价性有一个更直观的理解。我希望我的小实验能为你做同样的事情,并作为现有证据的补充。
贝叶斯排名系统
根据不同数量的回复进行排名
注意:假设您熟悉之前中提到的 beta 发行版。
除了计算彩票概率或疾病可能性之外,贝叶斯定理还有其他应用,例如我们可以建立一个排名系统。就拿一个电影排名网站来说吧,用户在这个网站上对电影进行上/下投票。简单的排名方案,如赞成票的百分比或上下票数执行不佳。
百分比 : 60 上升 : 40 下降 — vs — 6 上升 : 4 下降均为 60%
上减下 : 100 上 : 95 下 vs 5 上 : 0 下都是 +5
我们想要的是更多的投票来增加更多的信息;60 票比 6 票更有分量。让我们在贝叶斯推理中使用投票作为可能性。这是一组电影 A-E,带有向上/向下投票和计算的 beta 函数,从均匀 beta(1,1) 开始,在之前:
然而,贝塔分布是一个 PDF,所以我们需要一些算法来转换成一个排名标量。一种方法是找到 beta 分布的最小值,这样我们就有 95%的把握认为真实值更大。这可以通过从平均值中减去一些标准偏差来实现。
排名=平均值+ z 值×标准差
对于正态近似值,累积密度函数 CDF 在 z 得分为-1.64 时为 5%,可以在上面的公式中使用。但是,如果您可以访问 beta 发行版本身的反向 CDF(又名百分点函数),您可以直接使用它:
rank = beta.ppf(0.05,a,b) # python
rank = BETA.INV(0.05,a,b) # Excel, Sheets
rank = qbeta(0.05,a,a) # R
产生以下结果:
B 6:1 rank: 0.53
A 60:40 rank: 0.52
C 6:4 rank: 0.35
E 10:20 rank: 0.21
D 1:2 rank: 0.10
Beta distributions of five ranked movies A,B,C,D,E
这将高证据 A (60:40)和低证据 C (6:4)电影分开,但总体上不是理想的排名,特别是对于 D(红色)来说,它几乎没有证据,但却获得了最差的排名。我们知道,一般的电影比非常好或非常差的电影更常见。我们更喜欢这样一个排名,它从对普通电影的假设开始,并需要证据来走向极端。我们可以将这种偏好与对普通电影有偏好的排名系统中的优先相结合,从 Beta(11,11)而不是 Beta(1,1)的优先开始。现在将需要一些投票来远离之前的并走向极端,产生更好的总体排名:
A 60:40 rank: 0.51
B 6:1 rank: 0.43
C 6:4 rank: 0.39
D 1:2 rank: 0.32
E 10:20 rank: 0.30
Ranking with a prior biased towards an assumption of average movies
给我们一个最终结果,显示低证据 D 曲线大致在中间,而具有明显更多负面证据的 E 曲线现在具有最低等级。
这不仅适用于向上/向下评级,您还可以通过将值分配到同步向上/向下投票中,将其扩展到基于星级的系统。
星星(1,2,3,4,5):向上(0,0.25,0.5,0.75,1)向下(1,0.75,0.5,0.25,0)
因此,如果三个人每人给一部电影打了 4 颗星,那么总分就是:
3 up votes each of 0.75 value = 3×0.75 = 2.25
3 down votes each of 0.25 value = 3×0.25 = 0.75
Beta(3.25,1.75) # Uniform prior
Beta(13.25, 11.75) # Prior biased toward average movie assumption
我们已经完成了一个稳定的排名系统,该系统奖励越来越多的证据,并展示了如何将其扩展到星级系统,这都要感谢 Bayes 牧师。
如果您想亲自尝试一下,下面的 python 代码会进行排序,并为有偏差的情况绘制图表。
与 R 一起成为数据科学的化身
用 5 个最简单的步骤学习 R 编程
介绍
在过去的几年里,数据科学席卷了整个世界。以前只有最大的商业公司和企业集团在使用它,但现在这种技术也适用于小型企业。
对技术的更多使用意味着对能够使用这种技术的人的更多需求。因此,全球对熟练数据科学家的需求也大幅上升。
说到数据科学,R 是 it 领域最突出和最流行的编程语言之一。学习 R 是成为一名成功的数据科学家的必经之路。不仅如此!r 还被各种 IT 和社交媒体公司用于机器学习、情感分析和行为分析研究。它是最广泛使用的编程语言之一。
你旅途中需要的伴侣
为什么要学 R?
R 优于许多其他可用于数据科学和机器学习的语言有很多原因。其中一些原因可能是:
职业机会
r 从 1992 年开始出现,现在仍然是数据科学和学术研究中最流行的语言之一。全世界有 200 多万用户,而且这个数字似乎还在增加。
- 数据科学家的平均年收入在 60 万美元左右。
- 据 IBM 预测,到 2020 年对数据科学家的需求将增长 28%。
大型社区
r 在全球拥有超过 200 万用户。R 社区意义深远,同时也非常有帮助。全年在世界各地组织了许多会议和活动,让用户聚在一起讨论新想法,并帮助新用户。
开源
r 是开源的。它可以自由使用、贡献和开发。
强大的图形
由于 R 的基本图形包中有静态图形,加上 ggplot2 和 plotly 等提供动态和动画图形的附加包,R 的数据可视化过程是无与伦比的。
简单的统计计算
复杂的统计计算和操作可以用 r 中的几个简单命令来执行。
一大堆包裹
在线上有多个存储库,存储了数千个扩展和改进 R 环境的包。CRAN(Comprehensive R Archive Network)存储库包含超过 15,000 个 R 包。
因为你想成为明星,你可以和 R 成为明星
如何学习 R?
学习任何东西都很简单,只要努力、专注和一点点想象力。学 R 也没那么不一样。
下面是学习 R 的分步指南:
第一步:与 R 会面
(R 环境及安装介绍)
了解 R 环境应该是您的第一步。这将包括探索 R 的当前版本中的变化和更新,不同的可用 IDE,合适的包的在线存储库,等等。
之后,您应该安装 R 基础包和一个合适的 IDE(我推荐 RGUI 或 RStudio)。
第二步:“因为一切都从基础开始
(基础知识、语法和命令)
让我们从 R 的基础开始。以下主题是为 R 编程打下坚实基础所必需的。
- 数据类型
- 数据结构
- 基本操作
- 用户定义的函数
- 决策结构(if-else 语句)
- 循环结构(while、for 等。)
- 导入/导出资源
在学习这些的同时,你还应该关注各种函数、命令和控制结构的语法。r 有一个非常灵活的语法,这使得它容易学习,也容易犯错误。您应该遵循编程最佳实践,以便能够编写一致和干净的代码。
第三步:“因为数字不会说谎。”
(基础统计)
一旦你很好地掌握了 R 的基本知识和语法,你应该温习一下基本的统计学和数学。尽管 R 有可以轻松执行复杂操作集的命令,但实际了解这些命令在幕后对数据做了什么总是好的。线性和非线性回归、时间序列分析、主成分和因子分析等概念在数据科学中非常有用且常用,了解如何使用 r。
步骤 4:处理数据
(数据操作和可视化)
数据操作是任何数据分析的第一步。它是将数据更改并符合所需格式以供进一步分析的过程。r 有许多有用和方便的数据操作函数。它还有各种用于数据操作、清理和整形的库。对数据进行适当的清理和整形可以使分析过程更加容易和准确。
步骤 5:项目最大的方面
(尝试动手实时项目)
有源代码的最酷的数据科学项目
学习 R 并取得进步的最好方法是构建自己的项目并进行实践。实践经验是最好的老师。像计算器一样从简单开始,然后增加难度。很快,您将能够分析真实世界的大型数据集或执行复杂的数据科学算法。
最后
数据科学就像火,现在正是你开始在上面烹饪食物的时候。 随着高质量数据科学家的高需求和低供给之间的差距缩小,你应该尽快开始研究数据科学。学习 R 编程可能是最简单的方法。
学习 R 很容易。这对你的职业生涯和未来也将是一个非常好的决定。
按照上面的步骤,再加一点点努力,你很快就会成为一名优秀的 R 程序员。
征服数据科学最后一战的时间
XGBoost 中“特性重要性”的多面性
在 XGBoost 中解释特性的重要性时要小心,因为“特性重要性”的结果可能会产生误导!
这篇文章给出了一个简单的例子,说明为什么理解你的数据是非常重要的,不要盲目地使用你的特征重要性结果,因为由 XGBoost 生成的默认“特征重要性”可能不是你想要的。
The figure shows the significant difference between importance values, given to same features, by different importance metrics.
假设您正在为一个分类问题拟合一个 XGBoost,将会产生一个重要性矩阵。重要性矩阵实际上是一个表格,第一列包括提升树中实际使用的所有特征的名称,矩阵的其他列是使用不同重要性度量计算的结果“重要性”值[ 3 ]:
增益意味着相应特征对模型的相对贡献,该相对贡献是通过取每个特征对模型中每棵树的贡献来计算的。与另一个特征相比,该指标的值越高,意味着它对生成预测越重要。
覆盖率指标是指与该特性相关的观察的相对数量。例如,如果您有 100 个观察值、4 个特征和 3 棵树,并且假设特征 1 用于分别为树 1、树 2 和树 3 中的 10、5 和 2 个观察值决定叶节点;则该度量将该特征的覆盖率计为 10+5+2 = 17 次观察。这将针对所有 4 个功能进行计算,覆盖率将为 17,表示为所有功能覆盖率指标的百分比。
频率®/权重(python) 是表示特定特征在模型树中出现的相对次数的百分比。在上面的示例中,如果 feature1 出现在 2 个拆分中,则 tree1、tree2 和 tree3 中的每一个都有 1 个拆分和 3 个拆分;那么特征 1 的权重将是 2+1+3 = 6。特征 1 的频率计算为其权重占所有特征权重的百分比。
增益是解释每个特征相对重要性的最相关属性。
增益是一个特征给它所在的分支带来的精度提高。其思想是,在将特征 X 上的新分裂添加到分支之前,有一些错误分类的元素,在将该特征上的分裂添加之后,有两个新分支,并且这些分支中的每一个都更准确(一个分支说如果你的观察在这个分支上,那么它应该被分类为 1,而另一个分支说正好相反)。
**Coverage’**测量一个特征所涉及的观察的相对数量。”[ 3
为什么理解你的特征重要性结果很重要?
假设你有一个二元特征,比如说性别,和你的目标变量高度相关。此外,您观察到在训练集中包含/删除该特性会极大地影响最终结果。如果您通过不同的衡量标准来研究此类特性的重要性,您可能会发现一些矛盾之处:
最有可能的是,与数据中的其他预测值相比,变量性别的可能值数量要少得多(通常只有两个:男性/女性)。因此,这种二元特征在每个树中最多可以使用一次,同时,比方说, *age(具有更多可能值)*可能会更频繁地出现在树的不同级别上。因此,这种二进制特征将基于频率/权重度量获得非常低的重要性,但是基于增益和覆盖度量获得非常高的重要性!
在 scikit-learn 随机森林(或 GradientBoosting)和 XGBoost 中的特征重要性计算之间的比较在 1 中提供。查看 scikit-lean 系综的文档,权重/频率特征重要性未实现。这可能表明这种类型的特征重要性不太能表明特征对整个模型的预测贡献。
因此,在使用默认特征重要性函数(即权重/频率)得出的结果之前,花几分钟时间思考一下,确保它有意义。如果没有,也许您应该考虑探索其他可用的指标。
注意:如果您使用 python,您可以通过一行代码访问不同的可用指标:
# Available importance _ types =[’ weight ‘,’ gain ‘,’ cover ‘,’ total _ gain ']
f = ’ gain ’
xgb classifier . get _ booster()。get _ score(importance _ type = f)
参考文献:
这两种情况下的特征重要性是相同的:给定一棵树,遍历该树的所有节点,并执行以下操作…
forums.fast.ai](https://forums.fast.ai/t/feature-importance-of-random-forest-vs-xgboost/17561) [## 为什么 python 中 feature_importance 的默认值是‘weight’,R 却用‘gain’?问题#2706…
我通读了文档,注意到在 R-package 部分…
github.com](https://github.com/dmlc/xgboost/issues/2706) [## 我如何解释 XGBoost 重要性的输出?
begingroup$感谢 Sandeep 的详细回答。我想纠正一下,保险金额是跨所有拆分计算的…
datascience.stackexchange.com](https://datascience.stackexchange.com/questions/12318/how-do-i-interpret-the-output-of-xgboost-importance) [## 以随机森林为例解释特征的重要性
在许多(商业)案例中,不仅有一个准确的,而且有一个可解释的模型是同样重要的…
towardsdatascience.com](/explaining-feature-importance-by-example-of-a-random-forest-d9166011959e)
使用 mlflow 生成 ML 模型更有效
你好,在这篇文章中,我将在去年推出的一款名为 mlflow 的工具上做一个实验,以帮助数据科学家更好地管理他们的机器学习模型。
本文的想法不是为我将要构建机器学习模型的用例构建完美的模型,而是更深入地研究 mlflow 的功能,并了解如何将其集成到 ML 管道中,以便为数据科学家/机器学习工程师的日常工作带来效率。
mlflow kezako?!
mlflow 是由 databricks 开发的 python 包,被定义为机器学习生命周期的开源平台。围绕 mlflow()有三个支柱。
他们的文档真的很棒,他们有很好的教程来解释 mlflow 的组件。对于这篇文章,我将把我的测试集中在 mlflow 的跟踪和模型部分,因为我将诚实地告诉你,我没有看到项目部分的要点(看起来像一个 conda 导出和一个以特定顺序运行 python 脚本的配置文件),但我确信它可以在 ml 管道的再生方面帮助一些人。
现在让我们看一下我想用来测试 mlflow 的案例。
用例的描述
为了测试 mlflow,我将使用我在 2017 年完成 Udacity ML 工程师纳米学位时使用的相同用例:
建立法国用电量预测系统
你可以在我的 Github 库的这个文件夹中找到我此刻制作的关于纳米度的所有资源。
我不打算在数据分析中输入太多细节,你可以在存储库中的报告中找到这些数据,但基本上法国的电力消耗是季节性的。
由于家庭大部分时间都在使用电暖,耗电量很大程度上取决于室外温度。
关于这一分析更重要的是,为了在 2019 年重新运行它,我回到 RTE 的 opendata 网站,我惊喜地看到网站通过在平台上添加更多数据而发展(他们与其他能源管理公司建立了联系),所以现在有了能源消耗数据和一些额外的信息,例如地区天气。
对于这个项目,我将使用以下功能来训练一个模型:
- 当天的信息,如星期几、月份、星期几,以及是否在法国度假假期
- 关于法国每日室外温度(最低、平均和最高)的信息,一个是每个地区室外温度的全球平均值(avg ),另一个是基于每个地区人数的加权平均值
您可以在这个存储库中找到处理来自 open 的原始数据的笔记本
对于建模部分,正如我所说,这个想法不是建立一个超级模型来预测 99.999%的能源消耗,而是更多地了解如何将 mlflow 集成到我一年前为我的纳米学位建立的管道中。
我将测试以下型号:
该想法将使用 2016 年至 2019 年的数据(不包括)对 2019 年的数据进行训练和测试算法。
机器学习管道的描述
在下图中,我设想了一个简单的 ml 流管道来回答这种用例。
这个 ML 管道有 4 个主要步骤:
- 第一个步骤是收集所有数据,构建用于制作预测器的特征
- 在测试和构建阶段,将使用训练数据构建具有正确参数的正确模型,并在测试集上进行测试
- 服务部分,当你有正确的模型时,你需要服务它,用它来做预测
- 当您有新数据时,预测部分将对这些数据进行处理,以对可用于使用所提供的模型进行预测的要素进行转换
那么 mlflow 在这条管道中的位置是什么?
对我来说,这个库非常适合第 2、3 步,第 4 步也有一点点,能够涵盖所有这些范围真的很棒。
现在让我们更详细地了解一下 mlflow 的用法。
测试和构建模型(物流跟踪)
正如我们之前所说的,我们需要找到合适的模型来解决这个预测问题。为了初始化管道,我们需要定义一个实验,即电力消费预测,它也有一个实验(本例中为 1)。
模型(模型或参数)的每个测试将被定义为 mlflow 中的一次运行(并由 runid 标记),并存储在将出现在当前文件夹中的 mlruns 文件夹中。
为了组织我的代码,我保留了 mlflow 教程中的相同结构。这是我用来训练 KNN 回归器的一段代码的例子。
使用这种方法,每个模型都由模型的种类和用于构建它的特性来标记。对于评估指标,我的评估重点是:
我将这种方法应用于所有模型,所有数据都存储在 mlruns 文件夹中。
要使用 mlflow UI,只需在您的工作目录中执行以下命令。
您应该通过页面 localhost:5000 访问 UI,并选择正确的实验。有一个实验的主页面截图。
在这个页面上,有为每个模型计算的所有指标,有可能已经关联的所有标签,还有一些关于用户和记录的模型位置的额外信息。在该页面中,我们可以通过单击运行日期来访问每次运行。
在运行页面中有:
- 您可以在“参数”部分找到模型中应用的参数
- 运行期间计算的指标
- 与模型相关联的标签
UI 的另一个重要部分是工件,其中有包含模型信息的文件夹的组织。
从主页面,您可以选择所有可以在它们之间进行比较的模型。比较面板包含两个面板,一个面板带有一个表,将模型与所有分解的指标并排放置。
还有另一个面板可以用和进行可视化,并比较它们之间的模型。我快速制作了这个可视化面板的动画。
我发现这最后一个功能非常有限,因为不同类别的模型之间的比较(如 KNN 与 MLP)似乎更适合家庭模型的比较。
但是这个 UI 并不是进行日志分析的唯一方法,所有的日志都可以通过 python 中的命令收集到一个数据帧中。
mlflow.search_runs(experiment_ids="1")
这样,您就可以在 python 环境中进行更深入的分析,例如,根据 RMSE 分数获得最佳模型。有一个从 Python 中的日志进行的简单分析。
最佳模型有一个特定的 runid,可以在执行部署后使用。
模型服务(mlflow 模型)
使用 mlflow,您可以使用以下命令快速部署本地模型:
mlflow serve
-m path_to_the_model_stored_with_the_logfuction_of_mlflow
-p 1234
只需要用-m 将 mlflow serve 命令引导到模型的文件夹中,并分配一个新端口(默认端口与 mlflow UI 的端口相同,这可能会很烦人)
要执行预测调用,您需要向此 API 的/invocation 端点发送一个 POST 请求,并在此参数上包含一个已经在 json 中使用 orient split 进行了转换的数据帧(使用转换代码将更容易理解👇)
toscore = df_testing.to_json(orient = "split")
之后,您可以通过 Postman 或 Python 的 POST 请求轻松调用 API
import requests
import json
endpoint = "http://localhost:1234/invocations"
headers = {"Content-type": "application/json; format=pandas-split"} response = requests.post(endpoint, json = json.loads(toscore) , headers=headers)
但是现在最大的问题是如何在网上部署它?
mlflow 做得很好,你有内置函数来快速地在微软 AzureML 或 AWS Sagemaker 上部署模型。因为我更喜欢 AWS,所以我将把部署重点放在 AWS Sagemaker 上。
部署分两个阶段:
mlflow sagemaker build-and-push-container
当然,该命令必须在安装了 Docker 的机器上运行,并且 AWS 用户拥有在 AWS 上部署东西的正确权限,例如,我的管理员访问权限可能不是好事,但 YOLO。
mlflow sagemaker deploy
但即使在 Windows 或 Linux 上,它对我也不起作用。所以我尝试了这篇博文中的另一种方法。在这个要点中有一个代码总结。
部署非常快(大约 10 分钟),然后你可以用这段代码在 AWS 上调用 API deploy(来自 databricks 博客
因此,可以调用该模型来预测该端点的能耗(这种方法由 AWS 用户处理所有的身份验证,所以我想这是非常安全的)。
我真的很喜欢在 mlfow 上进行实验,机器学习的版本控制通常是一个大话题,但在我目前的公司育碧(如果你想加入育碧大家庭,也许会有一份工作给你在这里)它开始成为一个真正的大问题。
在我看来, mlflow 真的很棒做线下实验找到合适的模型,快速做出原型。
我仍然对一些非常具体的问题有些担忧:
- 在 ml 模型中,有算法,但数据也非常重要,所以标签功能可以用于提供所用数据的信息,但在我看来,这可能还不够
- 模型类需要从熊猫的数据框架中做出预测,这很好,但可能也有一点限制
- 缺乏在特性/数据上自动记录模型的方法,这些特性/数据用于帮助调用 API 背后的模型部署
- 管理 Tensorflow 的模型看起来超级复杂(pytorch 看起来更容易),但最后一点可能是因为我对这些框架不太熟悉(在 Tensorflow 与 Pytorch 的战争中没有立场😀 ).
但是说实话,你做了一个非常棒的工具来帮助数据科学家进行实验
原载于 2019 年 11 月 13 日the-odd-dataguy.com。