贝叶斯定理的直观方法
区域类比
"剑桥自治大学霓虹灯下的数学."图片由马特·巴克在 flickr 上提供,经知识共享协议 BY-SA 2.0 授权。
这张照片很好地说明了一切:给定事件 B,事件 A 的概率等于给定事件 A,B 的概率,A 的概率,以及 B 的概率的倒数的乘积。实际上,我认为这张图片更好地总结了这一切。
这个公式来自于数学背景(相对于统计学),起初有点难以理解,如果你把这些条件概率过于字面地解释为分数,它就显得有些荒谬。这是一个很容易犯的错误——一个我很容易犯的错误——把这个公式理解成这样:
错误的贝叶斯。作者图片
这反过来又简化成了一句废话:
进一步错误的贝叶斯。作者图片
事件 A 的概率给定事件 B,不管这些事件是什么,都是确定无疑的——疯狂!显然,这不是对贝叶斯定理的正确解释,但是对于熟悉(可能过于熟悉)有理表达式的人来说,要不看到上面的分数解释可能有点困难。我承认,由于这种诱人但错误的分数转换,贝叶斯定理总是需要我做一些工作来抵制这种诱惑,并深入挖掘这一统计真理的直观而准确的解释。所以,为了让我为自己更好地记忆这个解释铺平道路,也为了给其他人带来一个有希望的直观解释,我想分享一下我对这个公式的更好的解释。为此,图像:
作者图片
假设在这个矩形内部,黄色区域 A(包括与 B 重叠的绿色部分)总共占矩形的 15%;蓝色区域 B(包括绿色重叠区域)总共占矩形的 20%;绿色重叠的地方占矩形的 5%。
问一下,如果你把你的笔悬停在这个长方形的盒子上并随机放下,你落在 A 区的概率是多少(写为 P(A))。它占了总面积的 15%,所以你有 15%的机会以黄色着陆是有道理的。降落在蓝区的概率呢,B (P(B))?它是矩形的 20%,所以有 20%的可能性。以及在 A 和 B 中落地的概率(P(A&B)也写成 P(A∩B),读作“A 相交 B 的概率”)?那是绿色区域,所以有 5%的可能性。到目前为止,还不错。
假设我们限制我们的笔只悬停在蓝色区域,b。让我们放大。
作者图片
我们在蓝区着陆的新概率是多少(P(B|B),读作“给定 B 的 B 的概率”)?现在,这是一个 100%的机会——我们已经将我们的笔移动限制在蓝色区域上!所以让我们来衡量我们的数字。蓝区原本只是总面积的 20%,现在是整个赛场:B=1.0 = 100%。至于绿色交叉区域,我们也需要扩大它。它占矩形的 5%,但它占 b 区的 0.05/0.2 = .25 =25%。
作者图片
有了这些重写的区域,就很容易知道我们的笔落在绿色重叠区域的概率是多少(P(A|B)): 25%。
让我们思考一下所有这些。为了找到单个事件的概率,例如降落在 A 或 B 或它们的相交区域的概率,我们只需查看该区域占整个矩形的比例。在绿色重叠区域中,有 15%的机会降落在 A 上,20%的机会降落在 B 上,5%的机会同时降落在两者上。
作者图片
但是,当我们限制我们的笔在蓝色区域盘旋时,B——我们可以说我们已经给定了我们将在 B 的某个地方着陆——我们通过除以 B 的面积(或者,不严格地说,除以 B 的概率)来重新计算我们的面积,以找到新的面积/在绿色 A-B 重叠区着陆的概率,或者给定我们将在 B (P(A|B))的某个地方着陆的概率,即 0.25,或者 25 在一个恰当的统计定义中,你会看到它是这样写的:
条件概率的定义。作者图片
给定事件 B 的事件 A 的概率等于 A 和 B 相交的概率(或者,在我们的面积类比中,绿色 A-B 重叠区的面积)除以 B 的概率(或者 B 的面积)。
停止追踪,关掉迪斯科球。如果我们想知道 B 给定 A 的概率是多少(P(B|A))呢?在我们上面的区域例子中,很容易放大黄色区域,再次缩放区域,看看绿色重叠区域的新区域是多少:0.3,或者说有 30%的机会降落在区域 B,假设我们要降落在 a 的某个地方。
作者图片
不幸的是,在现实生活中很难复制这一过程。通常,只有一个这样的条件概率是已知的(P(B|A)),而另一个是未知的(P(A|B))。这就是贝叶斯定理的力量。你不需要知道另一个概率,不需要去实验性地找到它。你可以先把它算掉。你可以把它想象成从放大的图片开始,然后回到完整的图片。
作者图片
我们从 P(A|B)开始,我们想到达 P(B|A)。看看我们所知道的。p(A | B)= . 25;P(B) = 0.2。让我们把它们放大。为了缩小它们,我们除以 B 的面积(0.2);把它们按比例缩小,乘以 B 的面积 P(A | B)* P(B)= 0.25 * 0.2 = 0.05 = P(A∩B)。让你回到这里:
作者图片
再次放大,这次是黄色区域 A:
作者图片
通过除以 A 的面积(0.15)来缩放面积。P(A∩B)/P(A)= 0.05/0.15 = 0.3 = P(B | A)。就是这样。你从 P(A|B)一路做到了 P(B|A ),而无需进行任何新的实验或任何更多的计数。我们现在也可以重温原来分数解释。只要稍加替换,一切都会迎刃而解:
表明贝叶斯定理产生了条件概率的定义。图片作者。
那么贝叶斯定理发生了什么?在分子中,你将 P(B|A)的条件概率(这是重叠区域,缩放到 A) 乘以 A (P(A)的大小,以查看重叠区域在“总体情况”中的价值。比如找到它的原始分数。然后,你把它缩小,这次是 B 的大小,用它除以 B 的面积(P(B))来看它值多少 B 区。那就是把你从 P(A|B)带到 P(B|A)的翻转。
当应用于一个例子时,这个东西听起来更酷。一个经典的例子是垃圾邮件。使用单词“money”的垃圾邮件的部分是 0.4(P(Money | Spam)= 0.4);所有电子邮件中垃圾邮件的比例为 0.1 (P(垃圾邮件)= 0.1);所有邮件中使用“钱”这个词的部分是 0.2 (P(Money)=0.2)。贝叶斯定理告诉你,带有“money”一词的邮件是垃圾邮件的部分或概率是 P(Spam | Money)= P(Money | Spam)* P(Spam)/P(Money)= 0.4 * 0.1/0.2 = 0.2。当一封带有“钱”字的邮件进来时,有 20%的可能是垃圾邮件。
请继续阅读这些链接,了解更多关于条件概率、贝叶斯定理及其应用的信息。
直观指南:熵如何与交叉熵相联系
你好。
对于任何机器学习和数据科学的初学者来说,最重要的是你要清楚熵和交叉熵的概念。它们无处不在,并作为构建树、奇特的维数缩减和图像分类的关键基础。
在这篇文章中,我将试着用信息论的视角带你了解熵的概念,当我第一次尝试掌握这个概念时,它变得非常有用。让我们看看进展如何。
照片由 Ave Calvar 在 Unsplash 上拍摄
第一步。什么是-log§?
信息论的主要关注点之一是量化编码和传输事件所需的总位数。直观上,罕见事件,即具有较低概率的事件,将需要更多的比特来表示,而频繁事件将不需要很多比特。
因此,我们可以从编码器和发射器的角度出发,将负对数§ 定义为编码和传输遵循 p 概率分布的事件所需的总比特数,也称为信息、。很容易检查到小 p(罕见事件)导致大对数§(更多比特)。
现在,从事件观察者的角度来看,我们注意到 how -log§本质上是观察事件的’惊喜’。例如,如果掷硬币时 p(头)= 0.99,p(尾)= 0.01,那么如果掷的是一条尾巴,人们会惊讶得多。注意-log(p(tail)) = 6.644,远大于-log(p(head)) = 0.014。
你直观的看出-log§是什么意思了吧?
第二步。熵,意料中的惊喜
根据这一讨论,我们可以用概率分布 p(x)定义事件的预期惊喜,我们称之为熵。更正式地说,这是量化一个事件的可能结果中固有的不确定性水平。对于连续变量 x,熵可以写成:
熵,一个事件的预期惊喜
回到信息论,从编码器和发射器的角度来看,这量化了表示遵循概率分布 p(x)的随机选择事件所需的比特数。想象一个包含圆形和三角形的盒子,回忆化学课上熵的概念/感觉!一个偏斜的分布(许多圆和几个三角形)将意味着低熵,因为你的不确定性水平很低,这意味着,你有信心你选择的将是一个圆。
第三步。交叉熵,用于机器学习
现在换挡。让我们记住,机器学习的主要目标是找到并声明一个最佳模仿(近似)真实数据分布的概率分布。交叉熵提供了一种使用分布 q 量化遵循分布 P 编码数据所需的平均比特数的方法。
q(x)与 p(x)的交叉熵
值得注意的是,这个量可以通过下面的关系从熵中获得,其中的概念是:(原始比特)+(额外比特)=(总比特)。(额外比特)部分就是所谓的 KL-divergence ,统计学上常用来衡量两个分布之间的距离,也称为相对熵。
从熵到交叉熵
在图像分类中,您会经常遇到交叉熵损失,对于 N 个类别,表示如下,其中 y_{i}和\hat{y_{i}}分别是实际标签和预测。想象 N = 2,然后你会意识到交叉熵损失如何简单地变成逻辑回归中使用的逻辑损失。
交叉熵损失
恭喜你。你已经走了很长的路。
总而言之,
- -log§只是一种表达你对观察到概率为 p 的事件有多惊讶的奇特方式。罕见事件(低 p)导致高度惊讶。
- 如果你对所有事件的惊喜进行积分,你会得到你预期的惊喜,我们称之为熵。如果你有高熵,这意味着一个事件的可能结果中固有的不确定性水平很高。
- 交叉熵考虑了接近真实分布 P 的分布 Q,并使用分布 Q 来测量表示分布 P 之后的数据所需的比特量
- 交叉熵损失是一种很好的方法,可以量化我们的机器学习模型对数据的真实分布§的逼近程度(Q)。注意,逻辑损失只是一个二元交叉熵损失。
你现在对熵是什么以及它如何与机器学习的交叉熵联系起来有了很好的理解。希望它能帮助你比以前更容易起飞。
-
不要犹豫留下你的想法!您的反馈和评论有助于丰富我们的社区。很高兴听到。感谢阅读:-)
- DK
引导程序的直观指南
入门
本文概述了如何在不做太多假设的情况下回答因果问题
对我来说,自举是 21 世纪最了不起的发明之一。这是一种非常强大的易于实现的重采样技术。这种技术被广泛应用于许多领域。
从测试因果断言到提高机器学习模型的预测准确性,bootstrap 已经极大地增强了任何人都可以对其数据提出的各种问题。为了充分理解它是如何工作的,我想通过一个有趣而简单的例子向大家展示一下。
想象一下,网飞正在宣传一部名为《好莱坞崛起》的虚构动作片。他们想最大化人们观看这部电影的时间。为此,他们希望优化用户登录网飞网站时看到的这部电影的艺术作品(缩略图)。
一部电影的艺术作品是用户与网飞网站互动的焦点。因此,没有吸引力的缩略图可能会阻止观众观看电影。因此,网飞的高管们热衷于使用吸引大部分用户群的缩略图。让我们假设下面的艺术品是正在考虑的两个选项之一。
照片由 Angela Ng 在 Unsplash 上拍摄。查看缩略图 A 的用户看好莱坞崛起的时间更长吗?
这些高管想知道他们的用户会对 缩略图 A 做出怎样的反应,然后再向所有人推广。为此,他们进行了一项实验。
首先,他们从用户群中随机选择 1000 名观众。然后向这些查看者显示缩略图 a。然后记录这些用户的每个查看时间。观看时间本质上是用户观看好莱坞崛起的时间。这些信息随后被用于计算网飞管理层感兴趣的各种汇总统计数据。
例如,他们可能对这个视图时间分布(MVT) 的 含义感兴趣。例如,假设他们观察到缩略图 A 的 MVT比缩略图 b 下的 MVT 高**
在 Unsplash 上由 Cameron Venti 拍摄的照片。网飞正考虑在《好莱坞崛起》首映期间展示其成员
一个简单的实验
网飞许多高管心中的一个问题是,这个数字有多可靠?他们应该用它来推动缩略图 A 超过 B 吗?他们能从某种程度上理解他们评估中潜在的不确定性吗?
让我们试着用一些模拟数据来回答这些问题。我从平均值为 50 分钟、方差为 15 分钟的正态分布中得出观察结果。
观看时间的所有 1000 名观众谁观看了设置后,显示。
使用这些参数值,我们可以观察到各种各样的视图时间行为。看起来好像有些用户几乎没有看这部电影(观看时间约 0 分钟),而他们中的少数人看完了这部电影(观看时间约 120 分钟)。所有这些场景都代表了合理的观看行为。我们还发现经验平均观看时间为 49.7 分钟。这是意料之中的,因为我是从 50 分钟的均值分布中提取的。
如何知道这个数字是异常低还是异常高?如何判断我的统计值是否只是随机的结果?也许我观察到了我所做的价值,因为我的样本中选择了特定的人,以及他们在进行这个样本的那天的特定心情?
要回答所有这些问题,我们需要测量统计数据的可变性。 也就是说,我们想知道如果我们选择不同的随机样本 ,我们的统计值会有多大的不同。那么我们该怎么做呢?
嗯,有两种大致的方法:
- 使用统计理论的方法
- 引导程序
统计理论
由于我们样本中的每个观察值都是独立的(随机抽取)且同分布的(都选自正态分布),统计理论给出了以下结果:
从统计理论中推导出样本平均值的标准误差(样本标准偏差)
我们现在可以使用这些等式来测量样本均值统计的可变性。嗯,那很简单!为什么我们不这样做呢?嗯,一个原因是这些好的封闭形式的公式只被开发用于一个被充分研究的分布的子集(想想泊松,正态)。因此,为了利用上面的简单公式,需要确保他们的数据符合每个分布的假设。
这不是一个吸引人的解决方案。像现实生活中的大多数事情一样,假设需要被检验。虽然它们有时可能是合理的,但它们最终会迫使分析师花费大量时间来验证这些假设,而不是研究手头的实际数据。
在我看来,这就是 无模型解决方案 的最终动机。我们能否在不对数据生成过程施加所有这些条件的情况下,以某种方式了解我们的估计器的行为?
有没有办法让我们用我们观测样本的经验分布作为我们的北极星;我们的指南针?
有,有!让我在下一节告诉你所有的事情
自举
我们知道我们的每个模拟观察都是独立的,并且是同分布的。因此,我们为什么不从我们的样本 中抽取样本呢?具体来说,我们为什么不用替换重新取样呢?
让我们考虑一下。我们 1000 次浏览的样本本质上是我们对网飞用户行为的唯一描述。如果这个抽样步骤执行正确 (即以分层随机的方式代表网飞用户群的分布),它应该是用户真实观看行为的相当准确的表示。
这是为什么呢?有趣的是,随机抽取的样本的 分布形状通常与从 抽取的人口相似。我知道这听起来有点奇怪。当我第一次听到这个消息时,我也对此表示怀疑。为了让我相信这一点,我进行了测试。然而,在我向你展示我的结果之前,我想请你注意另一个重要的问题。
这是否意味着我从人群中随机抽取的每个样本看起来都一样?不要!也不应该。你会注意到一些极端的例子,在这些例子中,同一个数字要么被抽取了很多次,要么根本没有被抽取。出现这种情况是因为我们用替换的 样品。 这样做可以确保:
- 每个抽屉都是相互独立的。
- 我们以反映数据生成过程的方式抽取样本。
在模拟反事实(假设)现实的背景下,这些指针再次变得非常有用。例如,假设你在最初的实验中观察到的观看时间天生就受到人们当天情绪的影响。有些人可能只是想拿些爆米花和他们的伴侣一起看一部精彩的动作惊悚片,而另一些人可能只是度过了艰难的一天,因此想看一些有趣和放松的东西。
因此,在这种情况下,您会发现视图时间分布有很大的偏差。可能会有一些小的视图持续时间和一些异常大的视图持续时间。
如果我们在大部分用户想看一部好的动作片的时候进行实验,或者相反,会怎么样呢?诸如此类的问题使得网飞很难通过单一实验的镜头准确推断观众想要什么。
那么,他们是否应该反复进行同样的实验呢?如果代价很高呢?如果这破坏了他们的用户体验怎么办?有替代方案吗?这是自举拯救世界的众多例子之一。
该引导程序描述如下:
- 随机选择一组网飞观众,给他们看。
- 记录他们的观看时间。
- 计算这个随机样本的平均观看时间(MVT)。
- *从步骤 1 中收集的样本中抽取另一个样本(随机替换)并记录其 MVT。把这个**叫做 T5【自举】MVT 叫做 ***
- 重复步骤 4 B 次(通常 B 被设置为 250 或 500 这样的大数字)。
- 计算 自举 MVT 的 B 值的样本标准差(标准差)。
我还附上了我用来用 Python 创建自己的引导示例的代码片段:
在 python 中模拟引导程序
要全面了解我用来生成下面这些图的代码,请查看我的GitHub repo。正如我所承诺的,这是我画的一些自举样本的照片:
**
一些显示引导样本的图像,这些引导样本是通过从观察样本中抽取 1000 个观察值而创建的
**
不出所料,尽管来自同一个分布,但我们在它们的每个形状上都看到了相当多的变化。你可能也想知道标准误差的自举估计是否与统计理论预测的一致?嗯,统计理论告诉我们这个数字是 0.4963 。我们的自举估计是 0.48694 。我认为数字说明了一切。
如上所示,bootstrapping 使我们能够从收集的数据中重新采样。因此,我们实质上可以模拟许多不同的现实。这些样本本质上允许我们假装在不同的时间点进行实验。
因此,通过模拟大量不同的似是而非的现实,我们可以在我们的估计器(在我们的例子中是平均观看时间)可以采用的不同值上形成一个分布。因此,通过这种分布,我们可以更好地了解估计量的不确定性。
限制
像所有的统计方法一样,bootstrap 也有它的缺点。例如,当样本量非常小时,它对手头数据的经验分布的依赖可能是错误的。我强烈建议读者查看 关于引导程序 的介绍,以获得关于这些限制的全面讨论。对于喜欢快速浏览的读者,请查看这个精彩的 栈溢出 答案。
结论
这就是它的全部!这个优雅的程序让我们可以做很多奇妙的事情。我们可以用它来衡量我们估计的不确定性。我们可以围绕我们的估计建立置信区间,并进行假设检验(例如,缩略图 A 下的查看时间是否高于缩略图 B)。我们还可以对复杂的统计数据做出推断性的陈述(例如,缩略图 A 下的平均观看时间的标准误差是多少?)不可能得到这么好的封闭形式的公式。
这些途径中的每一个都能让网飞更好地了解他们的实验结果。 它还能让他们在对数据做最少假设的情况下做出明智而有意义的决定 。
最后,对于那些关心这个过程的统计特性的人,不要担心。统计学家投入了大量的时间和精力来证明这一过程产生的估计值具有大量理想的统计特性(如无偏性)。
参考
[1] 布拉德利·埃夫隆和罗伯特·J·蒂布拉尼 ,《自举导论》(1994), CRC 出版社
[2] 用外行人的话解释自举是如何工作的 (2012),https://stats . stack exchange . com/questions/26088/Explaining-to-layer-why-bootstrapping-works
[3] 自举的利弊 (2017),https://stats . stack exchange . com/questions/280725/自举的利弊
F1 分数的直观指南
揭秘一个非常流行的分类标准
安托万·道特里在 Unsplash 上拍摄的照片
作为一名数据科学家,我广泛使用了 F1 分数的概念,因为这是一种在澄清任务中同时考虑精确度和召回率的好方法。这是一个非常受欢迎的指标,也被称为索伦森-戴斯系数。但对我来说,这从来不是一个直观的平均值。
为了刷新我们的记忆,F1 分数的公式是 2m1*m2/(m1+m2),其中 m1 和 m2 代表精度和召回分数。
在我看来,F1 的分数有两个关键属性:
- F1 分数在定义时位于 m1 和 m2 之间。
- F1 分数从来不会大于 m1 和 m2 的算术平均值,但往往会更小。(即 F1 分数向 m1 和 m2 中较小的一个加权)。其实只有在 m1 = m2 时才等于算术平均值。
在我看来,这两个属性非常关键,因为如果没有第一个属性,它就不能被认为是一个平均值。如果没有第二个,就很难理解为什么要用 F1 分数来分类,而不是用典型的算术平均值来分类。有了这个属性,我们就可以强制要求一个分类算法在精确度和召回率上都是体面的。当使用 F1 分数时,该算法不能通过另一个中的优秀来弥补一个中的严重不足,因为分数倾向于两者中较低的一个。典型的算术平均数不是这种情况。
从 F1 分数的上述定义中,这两个重要的特性都没有突出出来。
如果其他人处于相同的位置,我想我会提供一个清晰,直观的指南来理解 F1 的分数。
我们从一个(看似)不相关的概念开始。
你可能听过一个常见的谜语,它是这样的:
你正在跑 10 公里。如果你以 10 公里/小时的速度跑完前 5 公里,然后以 15 公里/小时的速度跑完最后 5 公里,你在整个比赛中的平均速度是多少?
经过多年数学教育的磨练,典型的本能是脱口而出“12.5!”,这当然是错误的。这是算术平均值,如果比赛是根据时间而不是距离分成两部分,这将是正确的。
正确答案是 10/(5/10 + 5/15) = 12 公里/小时
很有意思。
答案小于 12.5 的原因是,我们实际上花了更多的时间以较慢的速度前进,这将平均速度向较慢的速度加权。(要把这一点说清楚,想想如果你以 0 公里每小时的速度跑完下半场会发生什么。您将永远跑完这场比赛,您的平均速度必须设置为 0。)这反映在正确的答案中。
让我们以两个任意的速度求解一个任意长度的比赛。
考虑一场长度为 x 的比赛,前半段距离(x/2)我们以 m1 的速度前进,后半段以 m2 的速度前进。在整个比赛中,我们的平均速度是多少?我们继续进行下图中的计算。
作者形象
在第 1 行,分子是所覆盖的总距离,分母是所用时间。我们进行到第 2 行,通过交叉乘法,将 2 移至分母。接下来,我们算出 x,并以取消 x 和重新排列结束。
也许你现在看到了这个常见谜语和 F1 成绩之间的联系。平均速度公式简化为精确的 F1 分数公式,其中 m1 和 m2 表示精确和召回。
用我们可能称之为“两个一半的比赛”的故事来指导我们的直觉的优势在于,现在上面提到的 F1 成绩的两个关键属性自然出现了。在不借助抽象数学证明的情况下,这些性质从故事中直观地表现出来。事实上,他们不可能是其他人。
具体来说:
- F1 成绩不能大于准确率和召回率中的较大者,也不能小于两者中的较小者。因此,它确实是一种平均值。这显然是对的,因为你在整个比赛中的平均速度不能快于你在比赛中最快的瞬时速度,也不能慢于你最慢的瞬时速度。
- 如果两者确实不相等,F1 分数更接近精确度和召回率中的较小者,而不是较大者。因此,F1 分数不能大于算术平均值(且通常较小)。这是显而易见的,因为你花更多的时间在较慢的速度上,所以平均速度会朝着较慢的速度下降。当然,在两种速度相等的情况下,这一点没有意义。
诚然,这些属性可以直接从 F1 成绩的定义中得到正式证明,为了完整起见,我将在下面提供正式证明,但它们比故事中出现的更直观。
好了,该证明了。
深呼吸。
为了开始第一个性质的证明,我们注意到如果 m1 和 m2 中恰好有一个是 0,那么 F1=0,性质 1 是非常正确的。如果 m1 和 m2 均为 0,则 F1 分数未定义。
现在我们只需要关注 m1 和 m2 都不是 0 的情况。
我们将用矛盾来证明性质 1:
不失一般性,让 m1 ≦ m2 。因此,我们把 m2 作为两者中的较大者,如果确实存在较大者的话。
然后,我们假设,与我们试图证明的相反,F1 = 2m1*m2/(m1+m2)>m2。
既然我们知道 m2 不为零,那么我们可以将两边除以 m2 ,得到:2m1/(m1+m2)>1*。*
将两边乘以( m1 + m2 )并组合相似项得到: m1 > m2 ,这与我们假设的 m1 ≦ m2 相矛盾。
由此,我们得出 F1 ≦ m2 的结论。
通过几乎相同的论证,我们可以得出 F1 ≧ m1 的结论。我们假设 F1 < m1,两边除以 m1,两边乘以( m1 + m2 )并组合类似的项。这就产生了 m2 < m1 ,再次与我们的假设 m1 ≦ m2 相矛盾。
因此,我们已经证明 F1 必须位于 m1 和 m2 之间,并且第一个性质被证明。
进一步,在 m1 = m2 的情况下,很明显 F1= m1 = m2 ,由于 F1 = 2m1m2/(m1+m2)= 2m1**
为了证明性质 2,我们再次使用矛盾的方法:
我们假设 F1 = 2m1*m2/(m1+m2)>(m1+m2)/2,其中( m1 + m2 )/2 为算术平均值。
这就简化为 4 个m1m2>(m1+m2)。如果我们乘出并组合类似的项,我们得到 0>m1+m2-2m1m2=(m1-m2)。
这是不可能的,因为一个数的平方不可能是负数。此外,等式仅在 m1 = m2 时成立。因此,我们已经表明,F1 等于算术平均值当且仅当 m1 = m2 ,(这符合事实,在这种情况下 F1 =m1=m2,如上所述),否则 F1 小于算术平均值,这是性质二。
虽然上述证明并不特别困难,但我相信你会同意我的观点,这个故事提供了非常需要的直觉。
所以下一次你遇到 F1 的分数时,把它想象成你在一场比赛中的平均速度,你以等于精确的速度跑到一半,以等于回忆的速度跑到另一半。
精确和回忆有好几个名字。精度也称为用户的准确度。召回也被称为敏感性和生产者的准确性。精确性和回忆性也与遗漏和犯错误的概念有关。这些概念的名称各不相同,这表明这些概念在多少学科中是至关重要的。
维基百科贡献者。(2021 年 9 月 28 日)。索伦森-骰子系数。在维基百科,免费百科*。2021 年 10 月 10 日 16:58 从 https://en.wikipedia.org/w/index.php?检索 title = S % C3 % b 8 rensen % E2 % 80% 93 ice _ coefficient&oldid = 1047086456*
https://deepai . org/machine-learning-glossary-andterms/f-score
无需数学的假设检验的直观介绍(几乎)
照片由 Testalize.me 在 Unsplash 上拍摄
在这篇文章中,我将做一个假设检验的基本演示。我会尽量避免使用数学,把重点放在让你对所涉及的概念有一个总体的概念上,并在假设检验上培养一些直觉。
好吧,那我们开始吧。
一个例子
我将向你们展示一个假设,这个假设是-
我们将忽略不同年龄组女性之间的潜在差异,保持简单。现在,虽然我们以正常的方式称之为假设,但在统计学中,假设有一个正式的含义,即可以被检验的东西。
所以让我们试着测试一下。假设我们选取 20 名女性作为样本,她们的平均身高为 168.6 厘米。
那么这个观察对于这个假设意味着什么呢?我想让你停下来思考几秒钟- 这对我们的假设产生了多大的怀疑?
我们一开始说平均值是 169 厘米,但现在我们有了这个样本,它比那个略小,但它真的对假设产生了很多疑问吗?
大概不会吧?我们随机选择了一个小样本,但由于随机变化,选择的女性可能略矮。所以我们的假设仍然是正确的,这并不是完全不可能的。
取不同的样本 现在让我们想象另一个场景,我们再次随机抽取 20 名女性 ,但这次她们的平均身高是 161 厘米 。这一次平均值比上一次稍远一些。
所以让我再问你一次,这给我们的假设带来了多大的怀疑。
你认为这次观察到的样本 的平均身高为 161 厘米会比上一个例子 更加令人怀疑吗,即使我们抽样的人数相同?
平均身高比 169 低很多,所以你要开始思考这个样本只是随机低于真实平均值的可能性有多大。
虽然我们还没有处理任何公式或数学,但你已经在这一点上完成了你的第一个假设检验。
现在让我们稍微形式化一下。更具体地说,我们将原始假设称为 零假设 ,并将其表示为***【h₀】、*** ,在这种情况下,零假设 是真实平均值为 169 cms 。然后我们得到了另一个叫做 的东西替代假说 通常被表示为 H₁. 在替代假设下,真实均值不是 169 cms。
无效假设和替代假设
所以问题是,我们的样本均值是否离 169 厘米足够远,以至于我们能够拒绝最初的假设?在第二个例子中,你认为——嗯,也许它离 169 足够远,也许现在对零假设有相当多的怀疑
形式化假设检验
让我们考虑这条代表样本均值可能值的数字线。我们通常用 x̅代表样本平均值,用𝝻.代表总体平均值如果你取一个样本,取它的平均值,你会期望它是 169,但是你也知道由于随机变化 ,它可能是 168 或 170。
假设检验所要做的就是设定这些关键的界限,超过这些界限,我们将开始拒绝零假设。所以当我们的样本变得太极端时,我们开始更加怀疑我们的零假设。在我们的示例中,样本平均值为 161 厘米,很可能离 169 太远,处于剔除区。
第二个例子
现在让我们试试另一个例子,另一个假设。我们的第二个假设是
像以前一样,我们要取一个样本来检验这个假设。这一次,虽然我们只取了五个人作为样本,但我们发现这五个人的平均体重只有 68 公斤。
同样,我们也要问自己同样的问题- 这对我们的假设 产生了多大的怀疑。所以停下来几秒钟,想一想
现在,即使权重之间的差异很大,你可能会认为这没关系,因为我们 只考虑 5 个样本 ,也许,只是也许我们选择了稍微轻一点的人,如果我们再选择 5 个样本,总样本的平均权重可能会上升。
现在让我提出一个稍微修改的场景。这一次我们抽样调查了 500 人,而不是 5 人。但是样本平均值仍然是 68 公斤。这给我们的假设带来了多大的质疑?
你会开始认为- 是的,这是铸造了很多疑问现在 。平均重量没有一点变化,但变化的是样本中的观察次数。所以我们现在在样本中有 500 个人。这意味着 我们对样本均值 更有信心,我想直觉上你可以看到这个工作。以亚马逊评论为例——一个产品在 5 个评分中获得 4.8 星,而另一个产品在 1200 个评分中获得 4.8 星。你会对第二种产品更有信心。
如果你有一个更大的样本,发现平均体重仍然是 68,你会开始想,我们现在几乎已经得到了整个城镇——真正的平均体重可能不再是 74 了。
我们这里的零假设是真实的总体均值是 74,我们的
替代假设是它不是 74。
无效假设和替代假设
因此,在我们的五人样本中,我们将在这里得出的决定我们是否拒绝零假设的临界值可能远离 74,但当我们的样本中有 500 人时,我们将拒绝零假设的临界值实际上非常接近 74。所以如果我们得到一个样本均值,比如说 71 或者 77,这就有足够的证据来否定零假设。
较大的样品扩大了剔除区
到目前为止,我们还没有做任何实际的计算,但是我们有办法计算这些精确的区域,来决定我们是否要拒绝这个无效假设。
通过这些我们很快就会看到的计算,我们真正想要回答的是这个问题— 如果零假设为真,我们的样本 有多极端?这确实是假设检验试图从数字上回答的核心问题。
虽然在文章的开始我提到我们将保持这种数学自由,我只是给你一个公式,并帮助巩固我们在这里发展的直觉。
样本的极值
这个 Z 是极值的度量 。因此,当 Z 接近于零时,这意味着我们的样本与零假设为真时我们的预期相符。如果你看看这个函数的分子,你可以看到,如果样本均值等于假设均值μ,那么我们会得到 0。和x̅和 mu 之间的差距越大,z 值越大 意味着我们的样本更极端,这意味着我们更有可能拒绝零假设,我们在第一个例子中看到了这种情况。
另外,你可能会注意到分母上有一个 n ,它代表样本大小。我们现在也明白了这是如何工作的,因为随着 n 的增加,Z 的值也会增加,这再次意味着我们更有可能拒绝空值。因此,随着样本量的增加,我们更有可能拒绝零,除非总体和样本均值之间的差异很小。
基于以上所见,我们知道当-
1 时,我们更有可能拒绝【h₀】。样本差异较大,如第一个示例和
2。当观察次数更多时,如第二个例子。
假设检验本质上包括三个步骤
假设检验过程
第一类和第二类错误
这就引出了本文的最后一个概念,即第一类和第二类错误。
第一类和第二类错误
当我们进行假设检验时,我们会根据手头的证据做出决定,而不是 100%有保证的证据。我们只是说,有足够的证据表明会有这样或那样的行为。统计学上永远如此!正因为如此,无论做出什么决定,我们都有可能犯错误。总有机会得到一个极端的样本,使你拒绝零假设或替代假设。
在前面的例子中,我们有拒绝区域,在那里我们要拒绝零假设。当我们拒绝事实上为真的零假设时,第一类错误就发生了。我们永远无法排除打字错误的可能性。
拒绝区域是任意的,由测试人员选择
类型 1 错误的概率称为显著性水平或α(α)。事实上,你可以选择你的重要性水平。你可以选择拒绝零假设的决定有多严格。我们通常会使用 5%的级别,但这只是惯例。我们在这里画出的这些区域,我们要拒绝零假设,是完全任意的。我们只是根据我们称之为显著性水平(α)的严格程度来决定它们。
当您不拒绝事实上为假的零假设时,就会出现类型 2 错误,因此假设样本均值非常接近 169 cms,因此我们选择不拒绝该零假设。当然,真实的人口平均数仍有可能不同于 169。这可能是任何事情,在这种情况下,我们将犯第二类错误,这种犯第二类错误的可能性是我们无法完全减轻的。当我们进行假设检验时,总会有犯第二类错误的概率,在这种情况下,犯第二类错误的概率被称为β(β),一个负β被称为假设检验的功效(1- β )。
假设检验的介绍到此结束。
对费希尔信息的直观观察
思想和理论
它的含义,以及为什么它是这样计算的
Fisher information 提供了一种方法来衡量随机变量包含的关于随机变量的假设概率分布的某个参数 θ (如真实均值)的信息量。
我们将从费希尔信息的原始定义和公式开始。
费希尔信息的定义和公式
给定一个随机变量 y ,假设它遵循一个概率分布f(y);θ),其中 θ 为分布的参数(或参数向量),Fisher 信息计算为偏导数的方差w . r . t .θ的**ℓ(θ
Fisher 信息为表示为偏导数的方差 θ* 对数似然函数ℓ(θ| y)(图片由作者提供)***
上面的公式可能看起来有点吓人。在本文中,我们将首先深入了解费希尔信息的概念,然后我们将了解为什么它是以这种方式计算的。**
先说个例子。
泊松过程的例子
让我们从下面的数据样本开始我们的旅程。这是一个泊松过程的模拟,模拟了医院急诊室每小时到达的病人数量。
模拟病人到达急诊室的泊松过程(图片由作者提供)
在这个数据样本中,随机变量(姑且称之为 y )是每小时到达的病人数。既然 y 是一个离散的随机变量,它必然服从某种 P 概率 M ass F 函数( PMF )。像这样的全编号事件类型数据通常可以通过泊松分布成功建模,如下所示:
泊松分布的离散随机变量 y 的 P 概率 M ass F 函数(图片由作者提供)
此时,我们需要后退一步,注意以下两点:
- 我们不知道(也永远不会知道)什么是 y 的真实概率分布。我们所拥有的只是几百个事件的数据样本。基于数据的性质(在我们的示例中,基于非负计数的事件数据),我们假设 y 是泊松分布的。
- 其次,即使我们(正确地)假设 y 是泊松分布,我们也不会知道 y 值的总体的真实平均事件率 λ_0 的值。我们能做的最好的事情是使用样本平均速率 λ 来估计 λ_0 。
现在,假设你观察到一定数量的病人在特定的时间走进急诊室。假设,y= 20。如果能够知道 y 中包含多少关于 y 值总体的真实但未知的平均事件率 λ_0 的信息,那就太好了。而这正是费希尔信息让我们以数学特别擅长的量化方式来衡量的!**
在我们理解如何度量随机变量 y 中包含的费希尔信息之前,让我们再一次看看泊松概率的公式:
泊松分布离散随机变量 y 的 P 概率MasF函数(图片由作者提供)**
注意 f(y) 实际上是两个变量的函数:
- 观察到的事件计数 y,
- 平均速率λ。
因此,我们将 PMF 的等式写得稍微有些不同,如下所示:
**PMF 表示为 y 和 λ(图片由作者提供)的函数
假设我们是某个无所不知的存在,他们知道真实的群体平均事件率 λ_0 是每单位时间 16 。利用 λ=λ_0=16,我们得到下面的图,用于f(y;λ) w.r.t. y:
平均速率的泊松 PMFλ= 16(图片由作者提供)**
这幅yPMF 的图给了我们这个问题的答案:假设真实的平均发生率是 16,那么单位时间内观察到 0,1,2,3…事件的概率是多少?
毫不奇怪,概率f(y;λ=16) 峰值在 λ=16。**
泊松变量通常是整数(离散)值,但我们将它显示为一条平滑的曲线。严格来说,简单地将 PMF(离散概率函数)转化为平滑的概率曲线是非常不正确的,但是将其显示为平滑曲线将有助于我们使用单参数分布(如泊松分布)来说明 Fisher 信息背后的一些概念。这是上述分布的连续版本:
**f(y;λ)w . r . t . y .λ= 16事件/单位时间(图片由作者提供)
可能性的概念
现在,假设我们对 y=10 进行单次观察。我们将 y 固定为 10,并允许平均速率 λ 从 0 变化到∞。
这里我们提出的问题是:给定不同的平均速率 s λ值,在某个单位时间间隔内观察到 10 事件的概率是多少?
这类问题是可能性函数概念的基础。
f(y;λ) w.r.t. λ 如下图,外形与上图相似。不同之处在于这两幅图的坐标轴所显示的内容。
在上图中,X 轴显示随机变量 y 的观察值,Y 轴显示概率(或连续YY情况下的概率密度)。**
***在下图所示的第二个图中,图的 X 轴显示了参数 *λ。y 轴描绘了所谓的 λ 的似然函数,用程式化的 L、表示,即: ℒ(λ|y) ,或者一般来说ℒ(θ|y)对于某些参数 θ 对于给定的随机变量 y 的观测值,它被读出为 θ 的可能性。
y=10 的观测计数的 λ的似然函数(图片由作者提供)
我们观察到关于此图的以下三件事(用蓝色矩形突出显示):
似然函数上缓慢变化的似然区域(图片由作者提供)
- 对于(未知的)真实平均速率 λ 的值远离yT5【的观测值(本例中为 10),似然函数变化不大。这由曲线底部左侧和右侧(尤其是右侧)的蓝色矩形标记。****
- 类似地,当值 λ 非常接近观察值 y=10 时,可能性不会改变太多。这由可能性曲线顶部的平顶区域指示。
- 对于 λ 的其余值, λ 的每一个单位变化都会导致在任何给定的小时内观察到 10 事件的概率发生很大的变化。
通过检查似然变化率的绝对值的曲线图ℒ(λ|yw . r . t .λ,证实了上述三个直觉。**
似然变化率 w.r.t. θ
可能性ℒ(λ|y偏导数 w.r.t. λ的绝对值(图片作者提供)**
我们通过将 y 固定在特定小时内 10 个事件的观测值上来构建上述图表,我们绘制了以下值与平均速率的关系:
似然 ℒ(λ|y 的偏导数 w.r.t. λ的绝对值)(图片由作者提供)。
对数似然的概念
不是微分原始似然函数 ℒ(λ | y_i) ,而是微分似然函数的自然对数通常是方便的,原因如下:
- 对目标函数凹性的需求:很多时候,我们希望找到能最大化观测整个训练数据集的联合概率的参数向量 θ 。换句话说,我们希望最大化训练数据集中所有观察到的 y_i 的可能性 ℒ(λ | y_i) 的乘积。这种优化技术被称为最大似然估计。如果被最大化的函数是一个向下凹的函数,则最大化起作用。许多概率分布函数只有在取对数时才是下凹的。
- ****保存优化目标:x的对数函数是 x 的严格增函数。通俗地说, log(x) 随 x 起伏。因此,无论我们对 x 有什么优化目标,采用 log(x) 将保持这些目标不变。
- *****易微分:*几种概率分布f(y;θ) 包含指数运算和乘法项。泊松和正态概率分布函数是经典的例子。区分这样的功能会变得很乏味,有时甚至完全不可能。取自然对数具有“消除”指数运算的效果(即“ e 项)。对数运算符还将所有乘法转换成加法,使得求导工作变得容易得多。
对数似然函数用小格程式化的 l 表示,即ℓ( θ | y ,,对于给定的随机变量y的观测值 y ,读作θ的对数似然****
采用泊松分布函数的自然对数可将其简化为以下函数:
泊松分布函数的自然对数(图片来自作者)
对数似然函数的偏导数
让我们保持 y 固定在某个观测值 y 并重写ln(f(λ;y)) 为对数似然函数ℓ(λ**| y =**y)。接下来,我们对ℓ(λ| y =**y)求偏导数,得到如下函数:
泊松分布对数似然函数的偏导数 w.r.t. λ(图片由作者提供)
让我们画出 λ 的非负值的偏导数:
ℓ(的偏导数 w . r . t .*λλ***| y****= 10)对于 λ的非负值(图片由作者提供)**
上面的图揭示了以下特征:
- 当真实平均速率 λ 等于每小时观察到的计数 y=10 时,对数似然函数的变化率下降到零。
- 当真实平均速率 λ 与 y=10 的观测值相差很大时,对数似然的变化相对于真实平均速率 λ 迅速且渐进地稳定到恒定值-1。
- 对于真实平均率 λ 的所有其他值,对数似然函数对于 λ中的每个单位变化变化非常迅速。
这里有一些有趣的事情:
对数似然的偏导数的方差
对数似然的偏导数就像 y 一样是一个随机变量。对数似然的偏导数也有均值和方差。
该函数的方差越小,观察值 y 与 y 的概率分布的真实平均值匹配的可能性就越大。换句话说,随机变量 y 中包含的关于 y 的真实含义的信息越多。另一方面,ℓ(λ| y****= y的偏导数的方差越大,包含在 y 中关于其真实均值的信息就越少。**
因此, y 所包含的关于【y的假定分布的某个参数 θ 的真值的信息,与对数似然函数的偏导数 w.r.t. θ 的方差成反比关系。这种相反的关系由 y 的分布的费希尔信息捕获如下:
费希尔信息(图片由作者提供)
上述等式的 R.H.S .可以通过使用下面的计算随机变量 X 的方差的公式来简化:
随机变量 X 的方差公式(图片由作者提供)
记住对数似然的偏导数本身是一个随机变量,具有平均值,即期望值(w.r.t. y )。因此,我们可以利用上述方差公式,如下所示:
费希尔信息(图片由作者提供)
期望值在费雪信息计算中的作用
上式中需要注意的一点是期望值,R.H.S 上的 E() 算子是 w.r.t .随机变量 y. 它们是不是w . R . t .y概率分布的参数 θ 。这是有意义的,因为对数似然函数的偏导数总是针对随机变量y**= y的特定观测值来计算的。例如,在泊松的例子中,我们计算的是在某个小时的观察中的y**= 10观察到的事件。因此,对于随机变量 y 的每个观察值,对数似然函数的偏导数可能呈现不同的值。因此,偏导数的期望值具有(粗略地说)“平滑”整个观察值范围内的方差的效果。**
简化费希尔信息方程的程序
对等式(1)的 R.H.S .的第一个期望可以用无意识统计学家(简称 LOTUS)的定律来简化,它是这样的:
- 如果 X 是一个概率密度函数为f(X= X)的连续随机变量,并且
- **g(X)是 X 的函数,那么,
- **g(X)的期望值,即E(g(X)可以用下面的公式计算:
无意识统计学家的法则(LOTUS)(图片由作者提供)
我们可以如下使用 LOTUS 来求解等式(1)的 R.H.S .的两个期望中的第一个:
简化费希尔信息方程(图片由作者提供)
同样,我们可以使用 LOTUS 来求解等式(1)的第二个期望:
简化费希尔信息方程(图片由作者提供)
在上面的等式中,通过注意对数似然函数ℓ(θ| y****= y)*实际上是概率分布函数 ***y、**f(θ;y) 它是两个变量的函数, y 和 θ。所以它的偏导数 w.r.t. θ 可以表示为:
(图片由作者提供)
我们将把这个结果代入方程(1b)的 R.H.S .积分中。此外,由于在 R.H.S .上的积分是 w.r.t. y ,我们可以在这个积分之外求 w.r.t. θ 的偏导数,如下所示:
简化费雪信息方程中的方程(1b)
在上面的简化中,我们利用了这样的事实,因为 f(。)是 y 的假定概率分布,f(y=y)从-∞到+∞的积分将为 1,对常数值 1 的微分为零。因此,等式(1b)简化为零。
现在,让我们回忆一下等式(1)表示的费希尔信息的等式如下:
费希尔信息方程(图片由作者提供)
等式(1)由等式(1a)组成:
(图片由作者提供)
和方程 1b,我们评估为 0。
因此,我们有以下结果:
给定一个随机变量 y 假定服从一个概率分布f(y; θ ),该分布的费希尔信息可以使用以下公式计算:
费希尔信息的公式(图片由作者提供)
引用和版权
,【费希尔 R. A .】,(1922)论理论统计学的数学基础,伦敦皇家学会哲学汇刊。A 辑,包含数学或物理性质的论文。222309–368。http://doi.org/10.1098/rsta.1922.0009
形象
本文中的所有图片版权所有 Sachin Date 在 CC-BY-NC-SA 下,除非图片下面提到了不同的来源和版权。
如果您喜欢这篇文章,请关注我的Sachin Date以获得关于回归、时间序列分析和预测主题的提示、操作方法和编程建议。
对信息论基础的直观观察
入门
数据压缩、熵、加密、Kolmogorov 复杂性以及它们为何重要的非技术之旅
随机像素的放大视图。图片由作者提供。
介绍
本文将着眼于信息理论,目标是为一些概念及其应用开发有用的直觉。它将远离技术细节,但底部有链接的参考资料供进一步阅读。首先,我想从一个简单的问题开始:
任何文件都可以压缩吗?
这个问题的答案是深刻的。不要只是陈述答案,让我们看看我们是否能推理出解决的方法。
- 假设任何文件都可以被压缩,导致文件变小。
- 因此,压缩文件的输出也可以总是被压缩。
- 如果这是真的,那么任何文件都可以被无限多次压缩。
- 因此,任何数量的信息都可以压缩成一位。
- 这显然是荒谬的,所以我们必须拒绝前提。
关键的一点是,冗余度较大(因此信息较少)的文件可以比冗余度较小(因此信息较多)的文件压缩得更多。一旦你压缩了一个文件,你就消除了冗余,使其信息更加密集。试图再次压缩它将产生收益递减。
通过创建一个包含随机生成的文本(没有模式或冗余)的文件,并尝试将其压缩成 ZIP 文件,您可以很容易地看到这一点。检查前后的文件大小,你会发现它们没有什么不同。同时,从维基百科上取一段,复制粘贴几十次到一个文件里,然后压缩。你会看到它缩小了很多。您还可以尝试使用zlib
Python 库的compress
和decompress
函数,以编程方式进行压缩。
探索数据压缩涉及到信息论中一些最重要的观点:
- 有一个基本的信息单位(比特)。
- 并非所有的比特串都包含相同数量的信息——有些比特串可以比其他比特串压缩得更多。
- 文件中的信息量与其随机性相关,与其可预测性负相关。
作者随机像素。由 Pauline Loroy 在 Unsplash 上拍摄的狗狗照片
关于随机性和信息的想法通常是违反直觉的。哪一个包含更多的信息,一个看起来有噪声的随机像素的图像,就像左边的图像,还是一张狗的照片(假设像素数量相同)?**很多人可能会说,随机像素的图像包含的信息比狗狗照片少。对于我们的人眼来说,随机像素看起来是重复和多余的。但这是不正确的。**当我们放大到像素级别时,我们看到随机像素表现出多样性、不可预测性和缺乏模式,而狗的照片则有模式和冗余。狗的照片可以压缩到原来大小的一小部分,而随机像素则不能。不信你自己试试!可解释性和对人类的意义并不等同于信息内容。
放大了上面两张图片(随机像素对狗)。作者图片。
加密和信息
加密意味着获取一条消息,让没有密钥的人无法阅读。早期的替换密码(如凯撒密码)只是简单地用字母互相替换,保留了语言的统计模式。如果消息在加密前是可压缩的,那么在加密后仍然是可压缩的。我用zlib
进行了测试,在美国权利法案上得到了 70%的压缩率,不管是否应用了凯撒密码。看到我用的代码这里。通过使用字符频率的统计知识,这些替代密码很容易被破解。
现代安全加密使加密的消息看起来与随机位无法区分,消除了原始消息统计属性的任何泄漏。加密是基于位的,因此任何类型的信息都可以加密—文本、照片、音频、视频、可执行文件等。为了直观地了解加密是如何工作的,让我们考虑一下一次性密码本(OTP),它是加密的一个基本构造块。
要使用 OTP,双方需要共享一串秘密随机位(“pad”)。为了发送秘密消息,一方将消息转换成二进制,用填充符将其排列起来,并执行按位异或(XOR)运算。XOR 由带加号的圆圈表示,如果两位相同,则返回 0,如果两位不同,则返回 1。**结果是一串看起来随机的比特,没有密码板是完全无法破译的。**因为看起来是随机的,加密的信息几乎是不可压缩的。没有关于潜在消息的统计信息被泄露,它甚至不受暴力攻击的影响,因为当你尝试每一个可能的长度为 N 的 pad 时,你将简单地揭示长度为 N 的每一个可能的消息,没有办法区分正确的和不正确的。
使用一次性密码本的加密示意图。图片作者。
为了解密消息,接收方用他/她的 pad 排列接收到的消息,并再次执行逐位 XOR。这将反转加密并揭示原始消息。这是因为 XOR 函数的一些特性:(a XOR b) XOR b = a XOR (b XOR b) = a XOR 0 = a
。实际上,交换真正随机的一次性密码本是不可行的。但是上面解释的思想也可以用于伪随机密码本,这意味着双方只需要交换用于生成伪随机密码本的相对较短的秘密密钥。
让我们试着把加密和信息密度的概念放在一起。考虑下面的思维实验:你是一名间谍,任务是寻找和解码敌人的信息。有一天,你截获了一个图像文件。你打开它,发现每个像素的 RGB 值都是(0,0,0)。图像完全是黑色的。你对这个截获的文件有什么看法?
你可以确信,无论你的对手使用什么样的加密方法,在黑色像素阵列中没有隐藏的秘密图像或秘密信息。为什么?因为它是非随机的,非常冗余,而且它不包含太多的信息。当然,信息内容不是零(可能已经有了预先的协议,如果场景 A 发生,对手将向他们的伙伴发送黑色图像,如果场景 B 发生,发送白色图像,等等。).但是加密不能删除消息中的信息,解密也不能恢复丢失的信息,所以如果加密后的消息是低信息量的,那么之前的消息一定也是。
两幅图像的像素数量相同。全黑图像的压缩率是随机图像的 1000 倍。注意:PNG 是一种无损压缩格式。图片作者。
另一方面,如果你收到的是一个随机像素的数组,就像上面的图像一样,它与加密后的有意义的图像没有什么区别。通过应用某种变换,图像中看似随机的 0 和 1 可以变得有意义。也许像素和只是代表随机的比特,这对我们人类来说没有多大意义。如果没有额外的知识,我们无法区分,但无论哪种方式都有信息存在。**意义和信息不是一回事。**意义与我们对信息的主观理解有关,而信息则是一种客观指标。
事实上,低于预期的信息量可以暗示意义的存在。如果你是一名天体物理学家,正在接收来自深空的信号,在混乱的背景噪声之间,你突然探测到一串信息异常低的比特(即异常可压缩的序列),你可能会开始怀疑你正在接收一个外星人的传输。对于我们人类来说,信息中的非随机性和冗余性是一个强烈的意义信号——无论是语言的统计模式、玫瑰图像中的红色像素海洋,还是一段音乐的和声。无论假想的外星人与我们有多么不同,他们产生的信息无疑也包含冗余。
宏观状态和微观状态
我们刚刚讨论了将随机性与缺乏信息混为一谈,将有序性与信息混为一谈是错误的。我们可以用宏状态和微状态来理解命令和信息的关系。宏观状态是对系统的宏观描述,例如“画面全黑”或“画面有随机值的像素”。微观状态是系统在较小细节层次上的精确排列,例如图像中每个像素的实际 RGB 值。
熵的概念,通常翻译为“无序”,在热力学和信息论中都有出现。当一个给定的宏观状态有很多微观状态时,就会出现高熵。低熵是指给定的宏观状态只有很少的微观状态。更少的熵意味着更多的有序和更多的可预测性。更多的熵意味着更少的有序性、更多的随机性和更多的不确定性。
让我们考虑另一个日常例子:滚动一对骰子。任何垄断玩家都知道,并非所有的结果都是平等的。平均而言,每 36 卷中只有 1 卷会产生 12 个总数。但是 36 中的 6 将产生 7 的和。因此,宏状态“我掷了一个 12”只有一个对应的微状态,而“我掷了一个 7”有 6 个微状态。
掷出 7 有六种方法,但掷出 2 或 12 只有一种方法。图片作者。
在前面的全黑图像中,只有一个微观状态与宏观状态“图像全黑”匹配:每个像素必须具有 RGB = (0,0,0)。这意味着熵非常低,因此信息量低,因此可压缩性高。每个像素都符合前一个像素的模式,因此它不会提供任何令人惊讶或有价值的信息。
在随机像素图像中,有难以想象的大量微观状态对应于宏观状态“图像具有随机值的像素”。大约有 2 个⁰⁰⁰⁰⁰⁰可能的独特的 1200x800 RGB 图像,其中许多会导致一个看起来随机的图像。**这意味着有非常高的熵,因此高信息量,因此低压缩性。**每个像素的颜色完全独立于之前的颜色,因此每个像素都具有最大的惊喜和信息量。
熵也适用于许多物理系统。想象一下在房间的角落里爆开一个充满难闻气体的气球。有许多微观状态对应着“气体均匀地散布在整个房间里”,而远远更少的状态对应着“气体全部集中在房间的一个角落里”。或者想象一个放在室温下的冰块。水分子以液体形式四处弹跳的宏观状态比水分子被锁在高度有序的冰块中的宏观状态要多得多。根据热力学第二定律,一个系统的总熵不可避免地随时间增加,可能性较大的事件支配可能性较小的事件。结果,气体总是扩散,发生化学反应,冰块融化。完全不同的领域——信息论、化学和物理——都利用了熵的概念。
Kolmogorov 复杂性
一位名叫安德雷·柯尔莫哥洛夫的俄罗斯数学家在他的《复杂性理论》中正式提出了关于信息压缩的想法。根据 Kolmogorov 的说法,一个文件的复杂度是能够重现该文件的最短计算机程序的长度。因此,尽管圆周率的前十亿个二进制数字看起来是随机的,并且需要十亿位来存储它们的原始形式(并且可能不能被 ZIP 算法压缩太多),但是它们可以由相对较短的计算机程序生成(远少于十亿位),只要你有足够的时间和内存。你可以直接存储产生它们的程序,而不是直接存储十亿位。
在我大学时最喜欢的一个作业中,我们被给了一堆数据文件,并且必须编写脚本在运行时重新创建这些数据文件。分数是根据你的剧本有多小来分配的。全班都在看谁能写出最少的位来表示文件;我们试图尽可能接近真实的 Kolmogorov 复杂性。
假设您有一个如下所示的文件,存储一年中每天的天气数据:
01/01/2021: sunny, high of 8 C, low of 4 C
01/02/2021: partly cloudy, high of 3 C, low of -1 C
01/03/2021: rainy, high of 6 C, low of 2 C
...
12/31/2021: snow, high of -1 C, low of -5 C
文件中有很多冗余:日期遵循可预测的顺序,相同的天气词汇重复使用,每次都给出温度的单位,等等。通过为特定文件定制脚本,您通常可以胜过一般的压缩算法,有时甚至是显著的。
Kolmogorov 复杂性也被扩展到物理定律是宇宙状态的一种压缩算法。知道了力、质量和加速度之间的关系,就意味着可以用更少的变量来描述同一个系统。一个在弹道运动下遵循抛物线轨迹的物体可以用两个点来描述,而不是它实际通过的无限个点。科学作为压缩宇宙的一种方式的想法是深刻的,马库斯·赫特在莱克斯·弗里德曼的播客[5]中对此进行了探索。
语言学、音乐等等
作为一名语言学家,我对这些概念如何应用于人类语言很感兴趣。语言中存在统计模式和内置冗余,这使得所有人类语言都是可压缩的。几乎开创了信息论领域的克劳德·香农估计,书面英语有大约 50%的冗余率。
这是你第一次写英语作文。
语言必须平衡效率和冗余。语言不应该无谓地浪费宝贵的比特和音节。然而,信息密度太大,信息变得对噪音和讹误更加敏感。如果消息中的每一位都在做更多的工作,那么偶然翻转一位将会产生更灾难性的结果。语言中的冗余允许听者甚至从被破坏的信息中恢复意义(例如在嘈杂的房间中,使用糟糕的 FaceTime 连接,或者在阅读凌乱的手写内容时),就像在数字信息中添加纠错位允许从被破坏的信号中恢复一样。有趣的是,上面的“密集英语”的例子在像希伯来语这样的语言中不起作用,因为希伯来语已经是拼写密集的了(元音不是书面的)。语言的某些特征,比如同意标记(我吃 vs .她吃 s ),起初看起来是多余的,因为它们没有告诉你任何你无法从句子中的其他单词中找出的东西。但是考虑到通信容易受到噪音和干扰,内置冗余实际上很有意义。
研究甚至表明,压缩率可以代表一首音乐听起来有多好听。压缩性太大,而且太无聊(就像全黑的图像或者一段音乐一遍又一遍的演奏着同样简单的旋律)。密度太大,听起来不和谐,缺乏令人愉悦的模式。有一个可压缩性的黄金地带——音乐包含了模式和惊喜的恰当平衡。
关于信息论还有很多可以说的,所以看看下面的资料,感谢阅读!
参考
[1] 詹姆斯·格雷克的信息。
[2]https://en.wikipedia.org/wiki/Entropy
[3]尼古拉斯·哈德森。2008.音乐美与信息压缩。https://www . researchgate . net/publication/49770962 _ Musical _ beauty _ and _ information _ compression _ Complex _ to _ the _ ear _ but _ simple _ to _ the _ mind
https://en.wikipedia.org/wiki/Kolmogorov_complexity
[5]马库斯·哈特在莱克斯·弗里德曼的播客上。https://www.youtube.com/watch?v=E1AxVXt2Gv4
6 罗杰·利维。2008.不确定输入下理性人句子理解的噪声通道模型。http://www.mit.edu/~rplevy/papers/levy-2008-emnlp.pdf
联邦学习的研究
一种不共享原始数据的分散分布式机器学习技术
什么是联合学习?
联合学习也称为协作学习或分散学习,是一种机器学习技术,通过保持训练数据分散来训练模型。
多酷啊。
那么我们为什么需要联邦学习呢?
在我们开始之前,让我们快速浏览一下如何在传统的机器学习(ML)设置中训练一个模型。在传统的 ML 设置中,训练模型之前的第一步包括下载或存储您希望在本地存储库中使用的数据,并对数据应用一些机器学习算法来预测结果。这里要注意的关键点是,您将数据集中收集或存储到一个地方,从而集中训练模型。但是由于数据隐私相关的考虑,这一过程在未来可能不会继续进行。数据,无论来自哪个领域,通常都是私有或敏感的。由于隐私相关的问题,任何组织都不可能共享这些数据。由于行业竞争、隐私安全和复杂的行政程序,即使是同一家公司不同部门之间的数据整合也面临重重阻力。
现在让我们考虑卫生保健领域的一个例子。医疗数据是高度敏感的。出于监管方面的考虑,如美国的健康保险便携性和会计法案(HIPAA)或通用数据保护和法规(GDPR ),这些数据不能共享或提供给公众。
也就是说,改革传统的机器学习技术对于解决这些日益增长的监管问题是必要的。
那么,当您无法访问任何数据时,您将如何开始培训过程呢?如果您不能收集数据并存储到您的本地存储库中,您如何训练模型呢?
每个问题都有三种解决方法:接受它,改变它,或者离开它。如果你不能接受,那就改变它。如果你不能改变它,那就离开它
谷歌在 2016 年首次推出了联邦学习。你可以在这篇文章中读到更多关于联合学习的内容。他们使用边缘设备(移动设备)中的联合学习来预测谷歌 Gboard 中的下一个关键词预测。
让我们简单地理解一下联合学习。
联合学习的主要概念是将模型发送到训练设备,而不是将数据收集或存储到一个地方来训练模型。
已经使用集中式机器学习设置训练的模型被发送到联合学习过程中的所有参与设备。每个设备都有自己的本地私有数据。每台设备都使用自己的设备数据进行训练,产生特定的本地更新。这些更新被发送到受信任的中央服务器,在那里服务器对所有设备更新进行加权平均。这个加权平均值成为下一轮训练的基础模型。这被重复 k 次,直到模型收敛。这样,通过分散训练数据来训练模型。
图片作者。该图显示了联合学习中的四个参与设备,每个工人都通过自己的数据接受培训,并将更新发送到服务器。服务器从这 4 台设备中获取加权平均值,并分配给所有工人,这将成为下一轮培训的基础模型。
但是,在联邦学习中有许多实际的挑战或限制。以下是其中的一些:
1.每个设备的系统要求(如内存)都不同
2.由于每个设备都必须向服务器发送模型更新,因此存在大量通信开销
3.每个设备的更新都可以逆转,以恢复原始数据
4.本地设备数据可以是异构的和非 IID 的。也就是说,设备数据可能不平衡,并且每个设备的样本数量可能不同
在我的下一篇文章中,我们将更多地讨论联合学习的类型、使用 Pytorch 的实现以及联合学习中可以采用的各种模型拓扑。这只是对联合学习的介绍。
敬请期待伙计们。在我的下一篇文章中再见。
关于我
我是 Manjari Ganapathy,拉斯维加斯内华达大学计算机科学专业的理学硕士。目前我正在 Mingon Kang 教授的指导下完成我的联邦学习硕士论文。
参考
[1].Brendan McMahan 等人,从分散数据进行深度网络的通信高效学习 (2017)
[2].彼得·凯鲁兹等人,联邦学习的进展和公开问题 (2019)
一个提高人工智能情感识别意识的在线游戏
来源:作者截图自网站 Emojify.info
人工智能情感识别的应用概述和伦理问题
根据非语言行为线索识别某人的感受,甚至预测潜在的反应,不再是为敏感和机敏的人保留的问题。
随着情绪智能尖端技术的进步,这种能力随着机器出于各种目的识别人类情绪的能力而获得了新的维度。
复杂的面部检测算法现在已经强大到足以分析和测量现实世界中捕捉到的情绪。它们是如此强大,以至于我们正在达到一个点,一些伦理方面已经被提出。
情绪识别是如何工作的?
情绪识别基于面部表情识别,这是一种基于计算机的技术,采用算法来检测面部,对面部表情进行编码,并实时识别情绪状态。
它通过使用嵌入在笔记本电脑、手机和数字标牌系统中的计算机驱动的摄像头以及安装在计算机屏幕上的摄像头来分析图像或视频中的人脸来实现这一点。
一般来说,计算机驱动的摄像机用于面部分析分三步进行:
- 人脸识别:识别场景、图像或视频片段中的人脸。
- 面部标志的识别:从检测到的人脸中提取面部特征信息。例如,检测面部组件的形状,或者描述面部区域中的皮肤纹理。
- 情绪分类和面部表情:分析面部特征外观的运动和变化,并将该信息分类为表情解释类别,例如面部肌肉活动,例如微笑或皱眉;情绪类别,如快乐或愤怒;以及诸如(不)喜欢或矛盾心理的态度类别。
来源:https://github.com/gitliber/Facial_Emotion_Detector—图片由作者提供。
实际例子
前段时间,为了了解更多关于这项技术的信息,我实现了一个面部情感检测器,它能够使用带有 Keras CNN 模型和 OpenCV 的 fer2013/IMDB 数据集进行实时面部检测和情感/性别分类。
使用 IMDB 性别分类的系统对性别的准确率达到 96%,使用 fer2013 数据集进行情感分类测试的准确率达到 66%。
来源:https://github.com/gitliber/Facial_Emotion_Detector—图片由作者提供。
该系统基于一篇论文,该论文提出了由 B-IT-BOTS 机器人团队实现的用于设计实时 CNN(卷积神经网络)的通用框架,该 CNN 控制能够执行人脸检测、性别分类和情感分类的实时视觉系统。
详情请参考我的 GitHub 。
用游戏提高意识。
关于 AI 的情感识别伦理方面的讨论,有很多方法可以展开。
其中一项是允许人们在网络摄像头或智能手机上做鬼脸,通过使用情感识别的游戏来观看人工智能的运行。
最近,剑桥大学和 UCL 大学的一组研究人员创建了一个网站,旨在帮助人们了解计算机如何扫描面部表情来检测情绪,并开始讨论技术及其社会影响。
这个项目是由一群社会科学家、公民科学家和设计师创建的,他们希望开始一场关于情绪识别系统的对话,从技术背后的科学到其社会影响,以及这之间的一切。
当你访问该网站时,你可以在设备的摄像头前玩一个做鬼脸的游戏,让人工智能情感识别系统识别六种情绪:快乐,悲伤,恐惧,惊讶,厌恶和愤怒。
该项目允许人们与这些系统互动,并更好地了解它们有多强大,以及它们有多大缺陷。
如果你愿意,你也可以回答一系列可选问题来帮助研究人员,例如你以前是否使用过这项技术,你是否觉得它有用或令人担忧。
问题的可选答案将被用在一篇关于公民科学方法的学术论文中,以更好地理解情绪识别的社会含义。
情绪识别的伦理方面
一旦情感识别假定我们的面部表情完美地反映了我们的内心情感,它就不可靠。
每个曾经假笑过的人都知道,那通常不是真的。
这种倡议是一种引人入胜的方式,可以引发关于技术及其社会影响的讨论。
这个项目可能看起来是一个有趣的游戏。尽管如此,这也是一种令人兴奋的科学方法,让人们考虑这项技术的风险,考虑到它可能存在的令人担忧的歧视和监控潜力。
情感分析的应用
凭借强大的商业吸引力,企业可以使用这种技术来评估客户的总体情绪,从而确定营销策略。仅仅拥有一个社交媒体账户就能让你使用这个工具,了解人们对它的看法以及你的客户的行为。
这项技术也可以用于呼叫中心。使用人工智能,可以实时识别感觉,从而提供直接的护理。
情感分析范围广泛,可用于多种目的,包括:
- 进行市场研究,捕捉公众表达的情感;
- 沉浸式体验创造:根据用户传递的情绪改变虚拟现实环境的能力;
- 用户评价;
- 虚拟助手:可以根据用户的情绪定制语言。
在一些国家,如中国,人工智能情感识别技术已经用于许多领域,包括警察审讯和学校行为监控。
其他潜在应用包括:
- 边境管制。
- 求职面试中对候选人的评估。
- 面向企业的客户洞察收集。
结论
复杂的面部检测算法现在已经强大到足以分析和测量现实世界中捕捉到的情绪。它们是如此强大,以至于我们正在达到一个点,一些伦理方面已经被提出。
因此,我们需要一种更加开放和民主的方法来决定如何使用这项技术,尤其是决定必须如何使用这项技术。
与信息安全相结合的用户体验有待加强。这不仅仅是实现机制。
越来越有必要让用户能够管理他们想要共享的数据和不想共享的数据。
参考
- 一个展示人工智能情感风险的在线游戏。https://www . technology times . PK/2021/04/04/emojify-a-online-game-to-show-risks-of-ai-emotion-recognition/
- 人脸分类与检测—【https://github.com/gitliber/Facial_Emotion_Detector
- 测试人工智能情感识别技术。——【https://emojify.info/
- 科学家创造了一个在线游戏来展示人工智能情感的风险。https://jerseyeveningpost . com/news/uk-news/2021/04/04/scientists-create-online-game-to-show-risks-of-ai-emotion-recognition/
- 面部情感识别简介—https://algorithm ia . com/blog/introduction-to-Emotion-Recognition
- 使用深度学习的面部情感识别:综述和见解—https://www . science direct . com/science/article/pii/s 1877050920318019
- 人工智能的进步威胁到隐私。https://www.eurekalert.org/pub_releases/2019-01/uoc-aia010319.php
- 用于情感和性别检测的实时卷积神经网络—https://github . com/git liber/face _ Emotion _ Detector/blob/master/report . pdf
致数据科学界的公开信
公平和偏见
人工智能伦理挑战:偏见和偏见,经济不平等和全球变暖
在你开始阅读这篇文章之前,我希望你放下你的警惕。我们都知道人工智能的力量。在过去的 15 年里,我一直在这个领域学习和工作。所以,我显然不想在这封信中贬低艾;然而,我想简单地提倡更负责任地构建人工智能解决方案。
如果你关心经济不平等,你应该谨慎使用 GPT-3 等拥有 1750 亿个参数的巨大 ML 模型。当一个模型有那么多参数时,你需要强大的计算能力才能从中受益。这些模型不能用小数据集进行调优。因此,需要收集大量数据,以确保充分利用这些模型。现在的问题是,有多少人工智能专家能够以合理的成本获得所需的计算能力?或者说,有多少小企业有足够的资本以合理的成本进行大规模的数据收集?答案是几乎没有。
这是一个永无止境的游戏,模型变得越来越大。这样做的后果是,只有大公司才有运行这些模型的计算能力,而小型创业公司将没有竞争机会。这不是我为人工智能设想的未来。我们不应该让巨型公司控制人工智能的命运。
这不是我想象的人工智能的未来。一个只有巨头公司才能进入人工智能美好世界的未来。
我记得有一段时间,创造力是人工智能发展的主要增长引擎。越有创意****的算法,模型越强大。我仍然相信创意可以在某种程度上击败大型模特的竞争。这肯定很难,但我保证这将是一个更令人兴奋的旅程。我在分析 BERT 和 Word2Vec 模型的时候证明给自己看;然而,我不确定 10 年后会发生什么。这还不是故事的结尾。
巨大的 ML 模型有大量的碳足迹。根据一些研究,自动驾驶汽车需要大约 2500 瓦才能在我们的街道上行驶。如果这项技术被部署在世界上的每辆汽车上,它将对全球变暖产生相当大的影响。如果你关心气候危机,你不应该不负责任地使用巨大的 ML 模型。站在历史正确的一边。
最后但同样重要的是,我们应该反对数据中存在的偏见。ML 模型可能固有地适应这些偏差。我们应该想办法限制它们的影响。我们知道当前的人脸识别算法对某些种族群体的效果有多差。我们知道当前的语音识别算法对于有明显口音的人来说效果有多差。由于许多不合理和不可接受的原因,我们的日常交往充满了偏见和成见**。让我们防止 ML 模型从数据中继承这些偏差。**
让我们推动道德人工智能的发展,在这里和那里。我们都相信美好的未来;而且,人工智能应该帮助我们更快地到达那里,而不是阻碍它。
总之,在使用巨大的 ML 模型之前,请三思。你应该负责任地使用这些模型来减少经济不平等,阻止全球变暖,帮助人们过上更幸福的生活。荣誉😊
感谢阅读!
如果你喜欢这个帖子,想支持我…
**https://pedram-ataee.medium.com/membership **
预测长期无家可归者的开源可解释机器学习方法
加拿大伦敦市中心的景色。图片由妮可·奥斯本拍摄。
变更数据、行业备注
获得对未来 6 个月内面临长期无家可归风险的客户的可解释预测
Blake VanBerlo 是一名数据科学家,支持伦敦市的市政人工智能应用实验室。该实验室由信息技术服务部管理。布莱克关于我们开源人工智能项目的帖子。有关其他主要城市利益相关方的联系方式,请参见下面的“联系方式”部分。
摘要
加拿大伦敦市政府最近将机器学习应用于慢性无家可归问题的预测(见论文【1】及随附的源代码)。一个模型预测公民在未来 6 个月内是否处于长期无家可归的高风险中,并为每个预测获得解释。本文讨论了项目的路径,从研究到部署。
介绍
有人建议对慢性无家可归者进行预测性筛查,以此来标记那些可能从预防慢性无家可归的干预措施中受益的个人[2]。此外,研究表明,住房补贴、转移努力和基于社区的服务等预防性策略已被证明能有效降低未来长期无家可归的发生率[2]。人们可以想象,这些有限的支助资源中的一部分将优先用于那些面临长期无家可归最大风险的人。这就引出了一个问题:我们能可靠地识别出最有可能长期无家可归的人吗?
加拿大伦敦市政府致力于开发一个预测模型,在给定人口统计和服务使用信息的情况下,该模型可以准确估计个人在未来 6 个月内成为长期无家可归者的风险。伦敦市政人工智能应用实验室应用机器学习方法来研究这种模型。参与该项目的利益相关者包括伦敦无家可归者预防部门、城市信息技术服务部门以及来自伦敦各种无家可归者服务机构的各种利益相关者。
在本文中,我们将讨论(1)问题是如何发现的,(2)使用的数据,(3)寻找符合城市模型透明和负责任人工智能原则的有效模型的过程,(4)模型如何过渡到部署以供个案工作者使用,(5)未来工作的途径,以及(6)市政当局如何自己复制这项工作。
伦敦市中心的维多利亚公园。图片由妮可·奥斯本拍摄。
挑战
与利益攸关方进行了讨论,以确定该系统的具体目标。这些会谈中产生的问题陈述指导了后续的设计和部署需求。粗略地说,利益相关者想要预测一个客户(定义为获得无家可归者服务的个人)在未来是否有长期无家可归的风险。如果存在可靠的此类估计,个案工作者可以为该客户分配更多的无家可归预防资源(例如,住房补贴、负担得起的住房、个案管理)。
形式上的挑战是:给定一个人的人口统计和无家可归者服务利用记录,预测他们是否会在 6 个月后处于长期无家可归的状态。
如果在过去的一年中,一个客户至少有 180 天在无家可归者收容所度过了至少 15 分钟,那么他就被认为是长期无家可归者。
这个长期无家可归的定义改编自加拿大政府的无家可归战略指令[3]。然后基于该定义制定了二元预测任务。积极类的客户在预测日期后 6 个月符合慢性无家可归的定义,而消极类的客户则不符合。
分类任务有多种量化分类器性能的指标。我们检查的指标包括准确度、精确度、召回率、F1 分数和受试者操作曲线下面积(AUC)。利益相关者坚持认为召回是最重要的衡量标准。在我们的问题中, recall 指的是模型正确识别的实际上成为长期无家可归者的客户比例。*另一方面,*Precision 是模型确定为长期无家可归者的客户中实际上成为长期无家可归者的比例。理想情况下,分类器将最大限度地提高精确度和召回率;然而,这两者之间有一个权衡。给定选项,利益相关者更喜欢模型实现高召回,因为高召回最小化了假阴性预测的机会。错误地不对最终成为长期无家可归者的客户实施预防策略比错误地将预防资源分配给可能不需要它们的人要付出更高的代价(社会和经济代价)。值得注意的是,这种关系不能走极端,这意味着最小化假阴性是目标,然而过度服务假阳性的成本不能太高。这导致无家可归者预防部门使用修改的 F1 分数(考虑召回率和精确度)来确定生产的最佳模型性能。
数据和可行性
HIFIS 数据库
该项目的主要促成因素之一是现有数据库的可用性,该数据库包含有关全市无家可归者服务客户的人口统计和服务使用信息。伦敦是加拿大众多使用无家可归者个人和家庭信息系统(HIFIS)应用程序来管理向获得无家可归者服务的客户提供服务的城市之一。事实上,信息技术服务司的 HIFIS 数据库管理员最初想知道储存在 HIFIS 数据库中的信息是否可以用来预测长期无家可归的情况。此外,利用这些数据的可行性首先依赖于强大的数据治理基础。五年前,伦敦的 20 多个无家可归者服务组织通过强大的数据治理、隐私、同意和信息安全实践,将他们的数据整合到一个数据库架构下。这个丰富且维护良好的数据源是这个项目成功背后的核心促成因素。
在与伦敦的无家可归者服务机构互动时,如果客户同意收集,将为新客户收集人口统计和其他背景信息。向客户提供各种服务,如住宿、食物银行服务、个案管理、住房补贴、住房支助和个人物品储存。每当客户端访问这些服务时,都会在数据库中创建记录来捕获交互。
隐私和信息安全
在这一点上,谈论隐私、信息安全和负责任的人工智能很重要。该模型的基础数据包括来自伦敦最脆弱人群之一的敏感的个人身份信息。因此,我们竭尽全力保护数据和系统的隐私和信息安全。一些措施的例子如下:
- **明确同意:**数据收集程序和基础数据库是明确同意驱动的数据库,这意味着在数据收集之前,任何个人都给予明确同意。
- **数据治理:**所有使用 HIFIS 的组织都签署了数据共享协议,以便能够以非身份格式将这些信息用于这些目的。
- **去除身份:**即使在项目的最早原型和设计阶段提取的所有数据都会被去除身份,以保护系统中的个人信息。
- **隐私设计:**模型给出的风险预测与客户 ID 相关联,然后再映射回一个名字。这种重新识别过程只发生在 HIFIS 应用程序/数据库中,只允许那些已经访问过该识别数据的人查看命名的预测。这种一致的访问权限管理对于保护个人隐私和信息安全至关重要。
- **安全性:**利用企业网络和应用安全的最佳实践来保护数据库以及生产中的机器学习管道。
- **系统隔离:**机器学习管道只能访问去识别数据,这意味着任何正在进行的维护、模型的重新训练和模型性能的监控都不能提供对识别数据的任何访问。
负责任的 AI
上面提到的隐私和信息安全措施对于像这样的机器学习系统的运行至关重要。然而,在部署和维护负责任的人工智能系统时,还有其他考虑因素。通过与我们的隐私官和法律服务团队合作,我们决定将加拿大国库委员会秘书处关于自动决策的指令 [4】应用于该系统,尽管该系统是市政府实施的。该系统通过算法影响评估(AIA)工具运行,以确定系统的影响水平,并确定纳入系统的风险缓解措施。分析的结果是,该系统收到了 AIA 的 2 级调查结果,因此我们实施了以下风险缓解措施:
- **同行评审:**我们让第三方数据科学供应商评审模型、部署架构和安全架构,以确保其符合或超过最佳实践。此外,我们向 Elsevier Engineering Applications of Artificial Intelligence 提交了一篇学术论文供同行评审(发表于 2021 年 4 月),预印本可供评审( arXiv 预印本链接)。
- **通知:**关于该系统存在的通知和关于运行中的模型的详细文档可以在我们的公共代码库( GitHub 链接)上开源获得。该模型目前处于实施规划阶段,浅显易懂的语言解释将成为培训和持续实施的一部分。
- **人在回路中决策:**尽管 ADS 指令中的 2 级系统不需要人在回路中,但考虑到本项目的敏感性,人们决定这只能是决策辅助/协助,人将始终处于回路中。
- **解释:**我们利用局部可解释的模型不可知解释算法(LIME)来为机器学习系统生成的每个预测生成人类可解释的解释(下文对此有更多介绍)。这使得用户能够理解系统为什么做出这样的决定,建立对系统的信任,并监控系统的非预期偏差。
- **测试:**在生产之前,通过使用来自 LIME 算法的解释,我们能够标记出系统中是否有意外偏差,并使我们能够移除或修复任何不公平地影响结果或导致系统预测有问题的功能。
- **监控:**我们的支持模型有一个熟练的数据科学家来监控生产系统的性能指标。预测是每天生成的(与按需生成相反)。除此之外,在发布之前,我们进行了分析,发现只有当模型的训练数据超过大约 1.5 年时,性能指标才开始受到影响(即模型衰退)。因此,我们在支持模型中构建了机器学习模型,在将新训练的模型投入生产之前,该模型将接受年度再培训,并由业务部门签署绩效指标。
- **培训:**通过预印文章,以及上面链接的 GitHub repo 中的模型文档,我们能够提供关于模型功能的全面文档。实践标准和业务级别的未来实现也将被记录,以便根据模型做出明智的决策。
- **审计:**我们在系统中建立了一个记录,记录了生产系统曾经做出的所有历史预测,这些预测映射到系统的哪个版本做出了这些预测,这样就可以对所有决策进行审计。
- **同意:**我们在系统中实现了一个功能,以确保如果客户撤回对其数据进行处理的同意,他们的信息将不再被机器学习系统处理。如果在数据库级别撤销了明确的同意,这将自动发生,并且如果需要的话,可以在逐个客户端的基础上人工完成,也可以仅针对系统的机器学习方面来完成。这不是 AIA 的要求,而是我们在分析相关立法时建议的。例如,在欧洲联盟的 GDPRs 中,个人有权通过自动决策系统限制处理。
- **利益相关者的参与和监督:**在整个项目中,不仅与伦敦金融城的无家可归者预防部门,还与更广泛的利益相关者机构伦敦无家可归者预防网络(LHPN)进行了多次对话,设置了许多检查点和审批关口。LHPN 是一个包括所有伦敦收容所负责人和有生活经验的个人的机构,负责监督项目并继续指导实施。上述大部分措施既是自上而下负责任的 AI 立法审查所要求的,也是自下而上的利益主体参与 LHPN 所要求的,这让我们相信我们正在采取正确的方法。
时间序列公式
到目前为止,我们已经决定预测模型的功能可以包括人口统计和总服务使用情况(例如,使用服务的总天数或次数)。因此,在项目的第一阶段,我们考虑了为客户创建预测的模型,给出了他们的人口统计属性和当前服务使用总量。此后,我们将这些特征统称为静态特征。静态特征可以进一步分解为数字特征(如*)。*年龄】、单值分类变量(如公民身份)、多值分类特征(如健康问题)。
由于服务使用记录与一个日期相关联,我们假设,以一种捕获服务使用的时间分布密度的方式来重构模型输入可能是有益的。其原因是这样一个事实,即一个在过去几年中可能大量使用服务,但目前不是长期无家可归且住房已经稳定的客户,对于该模型来说,其静态特征与过去 6 个月内在收容所停留的人相同;这更预示着高风险个体。因此,我们决定在不同的日期为每个客户创建多个记录。这些示例将包括前面提到的静态特征和最近几个月每种服务类型的总服务使用量。因此,我们为特定的 30 天时间步长内的总服务使用量创建了特征,包括到示例日期为止的最后 6 个时间步长(即最后 6 个月)(针对每种服务类型)。即,给出本月、上个月、2 个月前等与每个服务的交互次数的一组特征。我们将这些时序服务使用特征称为动态特征。
单个时间序列示例中的特征分解。图片作者。
作为研究的一部分,我们比较了在仅包含静态特征(即每个客户 1 条记录)的数据集上训练的模型和在静态和动态特征(即每个客户不同日期的多条记录)的数据集上训练的模型。
模型搜索
可解释标准
自动算法工具在决策支持中的使用越来越多,这引起了人们对模型预测的不透明性和偏差传播可能性的关注。如上所述,在利益相关者参与时,部署模型所做的任何预测都要得到利益相关者满意的解释,这被认为是一项关键任务要求。
候选模型
我们在研究中考虑了各种潜在的建模技术。候选建模技术如下:
- 逻辑回归
- 随机森林
- XGBoost
- 多层感知器
- 混合递归神经网络+多层感知器
所有上述模型类型都使用纯静态数据集和包含静态和动态特征的数据集进行训练,只有混合模型除外,我们将其缩写为“HIFIS-RNN-MLP”。论文中列出了每个模型使用的特定超参数,以及 HIFIS-RNN-MLP 的精确示意图[1]。
为了比较这些模型,根据数据集的类型进行了交叉验证。对于纯静态数据集,应用传统的 k 重交叉验证,其中 k=10 。对于时间序列数据集,应用了嵌套交叉验证方法(使用 10 倍)。性能指标记录为所有折叠的平均值。下图描述了这种时间序列交叉验证策略。
嵌套交叉验证策略中 fold k 的训练、验证和测试集。验证集和测试集包含可用于 fold k. Image by author 的最新记录。
在我们的实验中测试的模型架构不是计算密集型的,只需要几分钟的训练。
表演
下表总结了每个候选模型的性能。
候选模型的所有交叉验证的平均测试集性能的比较。使用分类阈值 0.5 计算精确度、召回率和 F1 值。图片作者。
上表中有很多内容。乍一看,似乎没有一种型号是明显的赢家。然而,显而易见的是,在时间序列数据集(包含静态和动态特征)上训练的模型往往比仅在静态特征上训练的模型表现更好。这将搜索范围缩小到在时间序列数据集上训练的模型。
回顾无家可归预防的主要目标是最大限度地回忆。虽然多层感知器(MLP)拥有最高的召回率(96%),但它的精度是在时间序列数据集上训练的模型中最低的。无家可归者预防组织不希望以牺牲精确性为代价来选择一个召回率稍高的模型。在召回率次高的两个模型(HIFIS-RNN-MLP 和逻辑回归)中,HIFIS-RNN-MLP 因其更高的精确度最终被选中。其他城市可能会有不同的选择。
请注意,逻辑回归是列表中唯一内在可解释的模型,其余的都是“黑盒”模型。如果不是 LIME 提供了令人满意的解释,由于前面概述的透明度标准,可能会选择逻辑回归。
可解释性
为了满足透明性标准,应用了一种称为局部可解释模型不可知解释的可解释性算法【5】。LIME 是*模型不可知的,*意味着它可以被应用于产生任何类型的黑盒模型的解释。
LIME 确定了对模型预测贡献最大的示例特征。对于每个特征值,LIME 输出一个权重列表。正权重表示该特征有助于正面预测(即长期无家可归),负权重表示该特征有助于负面预测(即不是长期无家可归)。权重的大小意味着指示贡献有多强。下图显示了数据集中匿名示例的时间预测权重。
一个简单的解释。绿色条和红色条分别表示某个特征有助于正面预测或负面预测。在这个例子中,客户在过去 30 天的时间里至少在避难所呆了 1 天的事实为长期无家可归的积极预测提供了强有力的支持。
上面的例子摘自论文,在论文中有更详细的描述[1]。当个案工作者为客户查看模型预测时,他们也会收到类似上图的解释。利益相关者认为 LIME 的解释对于理解为什么模型对特定客户做出预测是有价值的。
LIME 的另一个好处是,它提供了一种生成模型功能的全局(和近似)概要的方法。使用 LIME paper [5]中概述的子模型选择方法,我们为整个模型生成了一个全局解释,如下所示。
总结整个模型功能的简要说明。显示 30 个最有贡献的特征值。图片作者。
在全局解释中,我们首先注意到,最能预测 6 个月内长期无家可归者的特征是,在最近 30 天的时间步长内至少有 1 天住在收容所。第二个影响最大的特性是在第二个最近的 30 天时间步长中对客户端进行的 SPDAT 评估的数量。SPDAT(即服务优先决策辅助工具)是一种常用的无家可归者筛查工具,在全球多个司法辖区使用[6]。其他一些有助于预测长期无家可归者的有趣特征包括高龄、5 年前去过食物银行,以及从未接受过住房补贴。相反,一些有趣的特征与长期无家可归的预测相悖,包括年轻和在最近的时间步骤中没有接受 SPDAT。利益相关者认为这一数字非常有助于考虑哪些因素导致了伦敦无家可归人口的长期无家可归。特别有趣的是,大多数最有影响力的特性是时间序列服务使用特性。
顺便说一句,计算时间比获得预测时间长得多。原因是,LIME 在生成解释时使用该模型对虚构的相近示例进行了多次预测。更多信息请参考 LIME 论文。
加拿大伦敦市中心的考文特花园市场。图片由妮可·奥斯本拍摄。
部署和支持
一旦 HIFIS-RNN-MLP 被确定为首选模型,其性能指标得到无家可归者预防组织的批准,人们就开始努力部署该模型,供伦敦收容所的个案工作者实时使用。该模型在所有可用数据上被再次训练,并被保存用于部署。
云架构
微软 Azure 被选为云计算服务,以促进模型部署。部署功能被分成两个主要的工作流:模型再训练和模型预测(即“推理”)。 Azure ML 提供了开发机器学习“管道”来自动化这一工作流程的能力。每个管道都由一系列顺序执行的明确定义的步骤组成。管道产生的原始数据、预处理数据和工件存储在 Azure Blob 存储器中。每天都会自动运行一个 SQL 查询来从 HIFIS 数据库中检索所有客户端数据,该数据库被展平并作为 CSV 文件保存在 Blob 存储中。
训练管道训练新模型并产生全局解释(通过石灰子模型选择)。它将每年举办一次。它由以下步骤组成:
- 预处理原始数据集中的所有数据,创建由静态和动态要素组成的时间序列数据集。
- 在测试集上训练模型并保存性能指标。
- 运行石灰子模块选择以获得全局解释。
- 将此次运行中生成的所有工件保存到一个文件夹中。
推理管道为当前日期的数据集中所有同意的客户端生成预测。它每天运行。其步骤是:
- 预处理原始数据集中最近的记录,在当前日期为每个客户生成一个时间序列示例。
- 获得每个例子的预测和相应的时间解释。
PowerBI 仪表板会消耗最新的预测,使它们可以作为报告提供给个案工作者。为了确保每天为所有客户端做出预测,一个 Azure Logic 应用在每天的同一时间向 REST 端点发出一个经过身份验证的 HTTP POST 请求,该请求启动推理管道的执行。
描述模型部署云架构的示意图。图片作者。
支持和维护
利用一家精通数据科学和 Azure 云服务的供应商开发了一个支持模型,为管道提供支持和维护。他们的职责包括:
- 确保推理管道每天无误运行
- 调查和解决管道问题
- 在绩效指标和全球解释获得批准后,适当运行培训管道并替换当前模型
后续步骤
已经确定了未来工作的多个可能方向。首先,有必要最终量化我们模型的影响。到目前为止,有一个收容所已经是该系统的早期采用者。当决定在预防性资源分配中优先考虑哪些客户时,个案工作者正在考虑模型的预测和解释。可以通过检查访问该庇护所的客户的结果数据来验证该模型的效用。如果这样一项研究表明,良好的客户结果更有可能在引入模型后,它将作为证明模型使用的部分证据。
如果这种方法可以应用于其他城市的数据,就有可能对其进行外部验证。任何使用 HIFIS 数据库的市政当局都是这种研究的理想候选人,因为他们可以利用我们的开源代码更容易地训练他们自己的模型。来自另一个城市的数据集可以像在伦敦一样进行预处理,然后进行交叉验证。可比的性能指标将增加对这种方法的信心。请注意,伦敦的训练模型不能直接应用于为来自其他城市的客户做出预测,因为数据集中存在特定于地区的特征(例如客户住过的避难所、服务提供的类型、行为标志),并且出于信息安全原因,我们的开源存储库不包括训练模型参数。除此之外,伦敦的人口统计数据肯定不同于其他城市,因此该模型可能会偏向伦敦人口。
我的城市如何使用这个?
如果你有兴趣在自己的城市尝试这种预测长期无家可归者的方法,这里有一些关于如何开始的建议。
为了效仿伦敦金融城采取的方法,您所在的城市需要拥有一定的员工和技术资源,包括:
- IT 经理:管理和支持参与项目的所有员工;最好熟悉数据科学基础知识
- *数据科学家:*领导研发工作;应具备数据科学专业知识和经验;如果设想进行云部署,最好有云服务经验
- *数据库经理:*促进数据库支持,并告知数据科学团队数据库中包含的潜在功能;并协助处理数据争论
- *无家可归者服务经理:*在技术团队和最终将使用模型预测的工作人员之间牵线搭桥;对城市中无家可归者的情况和需要参与的利益相关者有深刻的理解
如果您所在的城市是 HIFIS 应用程序的用户,您可能会受益于伦敦金融城为此项目发布的代码,该代码可通过公共 GitHub 资源库获得。除了用于训练、预测和可解释性的代码之外,存储库还包括 HIFIS SQL 查询和将原始查询结果转换为预处理数据集的代码。如果您的城市使用不同的无家可归者信息管理系统,您仍然可以遵循我们论文中概述的方法,但是您必须开发自己的预处理功能。
请务必让您的数据科学团队阅读我们的论文 [1],因为它对我们的方法进行了比本文更深入的研究。
接触
马特·罗斯
伦敦市人工智能
信息技术服务
经理
Jonathan Rivard
无家可归预防经理
住房、社会服务& Dearness 之家
伦敦金融城
jrivard@london.ca
Blake van berloblake@vanberloconsulting.com
数据科学家
伦敦金融城市政人工智能应用实验室
加拿大伦敦的标志。图片由妮可·奥斯本拍摄。
参考
[1] B. VanBerlo,M. A. S. Ross,J. Rivard 和 R. Booker,预测长期无家可归现象的可解释机器学习方法 (2020 年),arXiv
[2] M. Shinn 和 R. Cohen,无家可归预防:文献综述 (2019),无家可归问题循证解决方案中心。
【3】“到达家:加拿大无家可归战略指令 (2020),加拿大政府。
[4] 自动化决策指令 (2019),加拿大政府。
[5] M. T .里贝罗,s .辛格和 C. Guestrin,“我为什么要相信你?”解释任何分类器的预测 (2016),arXiv
[6](2021),伴侣结束无家可归
开放式人工智能模型学习总结书籍
这些机器学习模型有什么危害?
M 任何大型科技公司都在竞相开发通用人工智能(AI)——让他们的模型接近并解决我们给他们的任何问题,无论多么耗时或具有挑战性。这被称为对准问题。
为了测试和扩展一个潜在的解决方案,OpenAI 团队最近训练了一个人工智能模型来递归地总结书籍。通过 GPT-3 使用自然语言处理可以让你得到任何长度的书的要点。
根据 OpenAI 团队的说法,该模型“在 5%的时间里阅读了该书的人获得了 6/7 的评分(类似于普通人写的摘要),在 15%的时间里获得了 5/7 的评分。”
使用递归任务分解,每个长文本被分解成越来越小的片段。然后对这些小片段或章节进行总结,然后这些章节总结本身也可以进行总结。然后,人们可以对这些评论提供反馈,以进一步改进模型。
人工智能驱动的摘要是许多未来应用的一个小测试案例,在这些应用中,有监督的机器学习可以扩展到许多困难的任务。
但显然存在一些限制,因为这些模型只能在 5%的时间内达到人类水平的精度。分解方法也可能会遗漏一本书各部分之间的重要联系。而源代码和训练集将不会公开(讽刺的是,鉴于开放的 AI 名称)。
有什么坏处呢
据 VentureBeat 报道,谷歌、微软和脸书都在开发类似的工具向用户提供文本摘要。虽然一些个人使用它来与人工智能合作和共同撰写小说,但它也可能导致更多的新闻聚合。谷歌、脸书和一些其他公司现在是互联网其余部分的守门人和仲裁者。
新闻与知识的贬值
为了获得广告收入,新闻公司需要根据算法调整他们的文章,确保人们会点击。为了节省成本,公司已经在使用自动化系统来收集和组织内容,或者建议头条新闻。这是记者富兰克林·福尔在他的著作《没有头脑的世界:大科技的生存威胁》中的部分论点
“杂志和报纸过去常常认为自己是某种连贯的东西——一个问题、一个版本、一个机构。不是作为每天在脸书、推特和谷歌上被贩卖的几十个独立作品的出版商。”
即使是有声望的媒体也需要生成可点击的故事来生存,并在社交媒体上获得吸引力。新闻正在向数字模式转变,年轻人更有可能通过谷歌或社交媒体获得在线新闻。在最近的一项调查中,42%的 18-29 岁的美国人回答说他们最常从社交媒体上获得新闻。
这些人工智能算法有可能成为总结一天中大量新闻的首选方式,这种风险是合理的。毕竟,这些模型可以被训练成包括一个可点击的标题和搜索引擎优化关键词。虽然这也可能为记者腾出时间从事更激动人心的项目,但这些项目需要更直接的监督和调查。
毕竟,许多潜在的自然语言处理模型是有偏见的,大规模实施这些总结算法可能会有意想不到的伤害。还有一些人担心,新闻采集过程的自动化可能会进一步损害媒体和新闻业的价值。
独家授权强大的工具
还有一个问题是微软拥有 GPT-3 的独家许可,垄断了本可以是开源工具的东西。当一家大公司实现这种垄断时,其他行业也开始依赖它。
以亚马逊为例,它推出了统一价格为 9.99 美元的电子书。然而,阿歇特图书集团进入了一场合同纠纷,因为他们不想随意降低他们所有电子书的成本。作为回应,亚马逊阻止顾客预购任何阿歇特书,损失了大量利润。
亚马逊可以利用这种不可思议的力量,因为他们已经有效地压制了所有的竞争,让许多出版商依赖他们来销售他们的产品。微软将能够通过其独家许可和它认为合适的算法使用来发挥类似的力量。
GPT-3 的问题
许多研究人员对像 GTP 3 这样的自然语言处理算法提出了合理的批评,指出它们倾向于种族主义和性别歧视。任何通用的人工智能模型,即使是那些用于总结书籍和信息的模型,在投入使用之前都需要仔细审核。
“我担心人工智能社区的群体思维、偏狭和傲慢,”前谷歌研究员蒂姆尼特·格布鲁博士写道。
学习从一套精选的书中总结文章是一个小的、有针对性的目标。但是一次又一次,将类似的语言处理模型运用到互联网上被证明是有问题的。不仅 GPT-3 倾向于种族主义和性别歧视,研究人员还发现这些模特随着年龄的增长变得越来越毒。
书籍、文件和其他任何输入 GPT 3 号的东西都不会被中性编码。许多负责评估算法准确性的人也会加入他们自己的错误和偏见。虽然许多科技公司都有部门来处理这个问题,但它们并不完美。
Timnit Gebru 博士为谷歌工作,研究人工智能的伦理及其偏见。她的工作重点是大型语言模型,包括 GPT-3 和谷歌自己的算法。然而,一群高管希望她在论文通过内部审查程序并提交给会议后收回论文。
在谷歌高管认为该研究不可接受,称其过于黯淡后,她被毫不客气地解雇了。我们如何相信公司会违背自己的财务利益,对他们的技术进行限制和昂贵的修复?我们可以看到,脸书和推特上仍然充斥着反疫苗言论和错误信息。
仅仅因为我们可以用人工智能做一些事情,并不意味着我们不应该事先考虑潜在的后果。在模型被实现并用于我们的日常生活之前,所有这些都要容易得多。向一家公司独家提供这项技术开创了一个有害的先例。
正如我们一次又一次看到的那样,大型科技公司在道德监督方面并不擅长,尤其是如果这损害了它们的财务利益。虽然这项技术本身令人难以置信,但我担心这些算法可能会继续走目前有问题的道路。
嗨!我曾经是一名研究生和记者,发表了多份科学论文https://scholar.google.ca/citations?user=CAQC6BEAAAAJ&hl=en研究神经科学和微生物组。如果你想在 Medium 上阅读更多的故事,你可以在这里用 会员身份订阅 。你可以找到我关于媒介、大规模科学、未来主义和耐心的作品。如果你对我的写作感兴趣,你可以在这里阅读更多的http://linktr.ee/simonspichak或者在我的 子专栏 上注册,获得我的故事的双周刊综述。
Python 中组合回归估计量的一种新颖方法
COBRA:一种非线性组合回归策略
来自 Pixabay 的 Clker-Free-Vector-Images 的图像。
现在数据科学家有很多精确的机器学习算法。但是,选择最佳模型是一项复杂的任务,集成学习已经在实践中证明了它的有效性。在以前的帖子里:“如何选择最好的模特?"和如何处理重叠规则?“我已经提出了专家的聚合理论。一种应该更多地用于集成学习而不是简单平均的理论。在这里,我想把重点放在 COBRA 方法上,在[1]中提出。这种方法对于估计量的组合有一种非常不同的和新颖的方法。为了简单起见,我不加区分地使用术语估计者、预测模型和专家。事实上,在回归设置中,回归函数的估计量可以用作预测模型,或者它可以用作对每个新观察值进行预测的专家。
首先,我回顾了专家聚集理论的主要框架。我们有一组专家,他们在每一次 t 给我们一个目标 yₜ.值的预测这个想法是聚集 k 位专家的预测来产生一个聚集预测ŷₜ.
COBRA (组合回归备选)。
用手解释。
通常,在专家聚集理论中,我们使用专家预测的凸组合来做出 ŷ.但是眼镜蛇却有着截然不同的做法。它基于与k-最近邻算法相似的思想。每次 t 我们都有一个新的观测值 xₜ ,我们计算 K 专家预测*{p₁(xₜ】*p₂(xₜ】,…pₖ(xₜ)}。然后,想法是平均实现 y ,未使用来生成专家,这些专家在 {p₁(xₜ) , p₂(xₜ) ,…, pₖ(xₜ)} 的相同邻域(在欧几里德意义上)具有预测。在这些邻域中搜索实现的步骤被称为共识步骤。下面的例子将用来说明这个概念。
两个预测因子的 COBRA 聚合。图片来自作者。
在这个例子中,我们有一个横坐标表示的特征 x ∈ R 。 y 的实现标记为黑色圆圈。我们有两个专家:第一个专家给出红色预测,第二个给出绿色预测。对于新的观测值 x = 11 ,我们有预测值 p ₜ 和 p ₜ 。对于每个预测,形成一个邻域,用彩色虚线表示。然后,对邻域中所有预测的所有实现(标记为蓝色圆圈)进行平均,以计算 ŷₜ (蓝色菱形)。
数学解释。
形式上,COBRA 估计量如下。设 Dₙ 为随机变量对*(x,y)的 n 个独立同分布观测值的一个样本。*样本分为两个独立的样本, Dₗ 和 D ₘ.然后, Dₗ 用于生成一组专家 {p ₁, p ₂、…*pₖ}*和 D ₘ用于计算 ŷₜ 、t41】的组合预测值,用于一次新的观测 xₜ 。我们有以下公式
其中随机重量 Wᵢ 采取的形式
ϵₘ 是平滑参数。ϵₘ越大,这个过程就越宽容。反之,如果 ϵₘ 太小,许多专家就被抛弃。因此,其校准是至关重要的一步。为了克服这一步,作者在[1]的第三部分提出了一种数据相关校准。
这些文字表达式表明,COBRA 与其他常用汇总方法的主要区别之一是,COBRA 相对于专家 {p ₁、 p ₂、…、 pₖ}.来说是一种非线性方法否则,从理论的角度来看,COBRA 也满足一个 oracle 界,该界表明,集合预测器的累积损失以专家组的最小累积损失为上界,直到一个向零衰减的残差项。
Pycobra 图书馆
Pycobra 是在[2]中引入的 Python 开源库。这个库不仅仅是 COBRA 聚合的一个实现。即便如此,用一种叫做 Python 的语言开发一种叫做 COBRA 的算法这一简单事实已经足够了。该库还包括[3]中详述的 EWA 算法(指数加权聚合),以及受[4]启发的用于分类设置的 COBRA 版本 ClassifierCobra 。这个包还包括一些可视化工具来衡量专家的表现。此外,一类诊断允许比较组成专家的不同组合和数据分割,以及其他基本参数。它允许更好的参数分析。最后,这个库可以在 GitHub 这里找到。
结论
COBRA 是一种新颖的非线性集成学习方法,具有理论保证。第一篇论文的主要作者仍在致力于开发一个更好的版本,正如最近介绍内核版本的论文所示[5]。此外,该算法在开源 Python 库中可用,因此没有理由不在您的下一个数据科学项目或 Kaggle 挑战赛中尝试一下。
关于我们
Advestis 是一家欧洲合同研究组织(CRO ),对统计学和可解释的机器学习技术有着深刻的理解和实践。Advestis 的专长包括复杂系统的建模和时间现象的预测分析。
领英:https://www.linkedin.com/company/advestis/
参考
[1] G.Biau,A.Fischer,B.Guedj & J.D.Malley COBRA:一种组合回归策略。多元分析杂志146(2016):18–28。
[2] B.Guedj 和 B.Srinivasa Desikan Pycobra:用于集成学习和可视化的 python 工具箱。机器学习研究杂志18.190(2018):1–5。
[3] A. S.Dalalyan 和 A.B.Tsybakov 通过指数加权和夏普甲骨文不等式进行聚合。计算学习理论国际会议(2007):97–111。
[4] M.Mojirsheibani 通过离散化组合分类器。美国统计协会杂志 94。446 (1999 年):600–609。
[5] B.Guedj 和 B . s . desikan .Python 中基于内核的集成学习。信息 11,2 号(2020): 63。
你应该选择 H2O 无人驾驶人工智能作为你的建模方案吗?
对 DAI 主要功能的全面概述,以及我对此 AutoML 工具的评论和建议
阿瑟尼·托古列夫在 Unsplash 上的照片
自动机器学习(AutoML)已经成为当今数据科学领域越来越热门的话题。许多人会对“自动构建模型”的概念着迷,在这种情况下,人们可以简单地将数据输入某个 AutoML 工具包,然后在几分钟内准备好 ML 模型进行部署。—但事实是这样吗?带着这个问题,我开始研究市场上可用的 AutoML 解决方案。
AutoML 领域有相当多的参与者,包括 Google 和 IBM 等大牌公司,以及各种正在提供其独特的 Auto ML 解决方案的初创公司。
在所有参与者中, H2O.ai 和 DataRobot 是其中最受欢迎的,因为它们的解决方案非常成熟,并且能够灵活地与客户现有的数据生态系统集成。
在这篇文章中,我对来自 H2O.ai 的 AutoML 解决方案进行了初步研究,名为无人驾驶 ai(戴),我很乐意分享我在这一过程中的一些学习。
戴的主要特征
H2O 戴提供了几个给用户带来好处的关键特性。
1。用户友好的图形用户界面
H2O 戴有一个非常用户友好的图形用户界面与基本和专家设置,使其既适用于一般的商业用户和有经验的数据科学家。
2。各种特征转换器和 ML 算法支持
H2O 戴支持各种特征转换器和 ML 算法。最重要的是,特征选择和模型超参数调整过程都是在流水线中自动完成的。
3。MLI(机器学习可解释性)功能
随着对可解释人工智能需求的增加,H2O 提供的 MLI 函数在某些用例中可能会有所帮助。H2O 戴提供了几个选项来增加复杂模型的透明度和问责制,包括留一个协变量(LOCO)局部特征重要性,部分依赖图,决策树代理模型等。关于 MLI 的更多细节,你可以参考本文档。
4。自定义配方支持
没有一个工具可以涵盖所有潜在的用例,因此定制的灵活性很重要。启用自定义配方功能后,用户可以自由地将自定义算法或计分器代码脚本上传到 H2O 戴,用于模型训练。
5。自动文档
对于严格监管环境下的模型应用而言,这是一个理想的特性,通常必须详细记录特性选择、参数调整步骤。有了 Auto-doc 功能,一些信息可以被自动捕获,从而为以后的文档工作节省了大量时间。
戴的特色和优点(图片由作者提供)
戴造型工作流程
H2O 戴的一般工作流程类似于常规的模型建立过程。下图显示了整体工作流程:
戴造型工作流程(图片由作者提供)
1。将数据导入 H2O :
首先,用户需要将数据导入到戴。数据导入实际上有很多选择,包括像亚马逊 S3 这样的云数据源,MySQL 和 MariaDB 这样的关系数据库连接,以及像 HDFS 这样的分布式文件系统。
另一方面,在将数据导入 H2O 之前,一定程度的特征工程工作可能仍然是必要的。虽然在进入建模步骤之前,戴会应用一些高级数据清理操作,但是做一些健全性检查仍然是有价值的。例如,您可能希望基于业务理解删除某些特性,或者您希望在将数据输入到 DAI 之前自己进行上采样或下采样,等等。
2。数据可视化:
将数据上传到 H2O 戴后,有几个选项可以帮助用户了解数据,包括自动可视化、数据汇总(每个要素的最小值、最大值、缺失值等指标)。这个特性也可以作为健全性检查
步骤来确认是否有丢失值百分比很高的要素,或者某些要素是否彼此高度相关。
3。自动模型优化:
在这一阶段,戴将基于实验设置(稍后有更多细节)对特征、特征变换器和 ML 模型的不同组合运行遗传算法,并最终记录下最佳执行模型。
4。模型文档和部署:
在戴完成建模过程后,将生成模型文档来记录关键的建模步骤。在模型部署方面,H2O 可以用 Java 和 Python 自动生成评分管道,部署在 REST API 框架下。也有将模型直接部署到云平台的选项,比如 Amazon Lambda。
H2O 实验配置
在戴建立良好模型的关键步骤之一是在实验配置页面下进行适当的选择。如下图所示,用户需要输入一些参数,包括训练/测试数据选择、目标变量选择等。在配置页面中有三个主要的调节旋钮,它们将在很大程度上决定最终模型是什么样的,它们是准确性、时间和可解释性。对于每个旋钮,用户可以从 1 到 10 中选择其值。
戴配置页面(图片来自和)
1.精确度:
调整精度旋钮值时,戴表演《进化》和《合奏》的方式也会随之调整。对于低精度值,用户通常期望单个模型作为最终输出,而对于较高精度,每个独立模型将独立发展,然后成为最终集合模型的一部分。与此同时,戴也将使用更高数量的折叠验证,以获得更好的模型概括。
2.时间:
顾名思义,它用于配置用户给戴运行优化的时间。为时间旋钮配置更高的值,将进行更多的训练和验证迭代。
3。可解释性
可解释性将在很大程度上决定最终模型的复杂性。在配置了较高的可解释性值的情况下,最终模型倾向于具有较低的级别或不进行集成,并且倾向于使用更基本的特征变换器和 ML 模型。
关于如何改变每个旋钮值的更多细节,你可以参考官方文件这里。需要注意的一点是,三个旋钮值并不是严格相互独立的。例如,准确性和可解释性旋钮值将决定最终模型中的整体效果。因此,这里没有关于如何选择最佳旋钮值的金科玉律——最有可能的是这里预期的一些尝试和错误。幸运的是,H2O 通过给出一个预览部分让这一步对用户来说更加直观(如前面的图表所示,“这些设置是什么意思?”在左手边)它将为用户提供一个更高层次的概述,当改变每个旋钮值时,最终模型中会出现什么。
4.专家设置
如果你想在使用什么特征转换器,或者为最终模型选择什么评分器方面有更多的灵活性,戴在“专家设置”页面下提供了选项。在这个页面中,用户可以更加定制地选择包含哪些特性的 transformers,使用哪些 ML 模型,甚至加载一些预先训练好的神经网络模型来完成 NLP 相关的任务。简而言之,如果用户以前在模型构建方面有一些经验,专家设置可能会更有用。
戴模型部署
获得模型后,下一步就是部署并在生产中投入使用。H2O 戴确实可以选择导出 Python 和 MOJO(优化的模型对象)形式的评分管道。
python 评分管道是 ML 模型的一个更直接的扩展,您可以选择在本地部署它以进行测试,也可以为其他语言和平台使用 TCP/HTTP 评分服务。
MOJO 评分管道利用了 MOJO,这是 POJO 的 H2O 优化版本。当处理更大的数据集和更复杂的模型时,MOJO 对象通常消耗更小的磁盘空间,具有更好的速度性能。可以在 Java 程序中自然使用,但用户也可以使用 R/Python 调用 MOJO 对象进行预测。
有了评分管道,就有了在云中部署模型的选项(AWS Lambda 是 H2O 推荐的选项),但更受欢迎的选项可能是使用 MOJO 部署 REST API。然而,可能仍然需要一些人工日来将模型集成到生产中——因此在某种意义上,模型部署部分还没有被戴完全自动化。
H2O 戴模型部署选项(图片由作者提供)
需要注意的事项
我曾经尝试用戴建立模型,并将其性能与手工建立的模型进行比较。一般来说,如果配置得当,H2O 戴在大多数使用案例中即使不能获得更好的性能,也能获得与之相当的性能。事实上,H2O 戴包括各种 ML 模型、特征转换器,并且可以运行通过特征、模型和超参数的如此多的不同组合,并且集合最佳执行模型以进一步提高模型分数。因此,从统计上看,在大多数情况下,戴确实显示出获得更好预测分数的优势。
话虽如此,但在考虑使用这个 AutoML 工具包进行生产时,仍有一些地方需要注意。仅举几个例子:
1。注意那些不自动化的事情:
虽然戴已经很好地自动化了许多耗时的建模过程,但仍有一些事情需要用户手动处理。
一个例子可能是特征工程部分,尽管在 H2O 有相当多的特征转换器,它们可能不会恰好覆盖你所需要的。因此,我相信类似于建立常规模型,
数据清理和特征工程仍然是重要的步骤,甚至与 H2O 戴。
2。当业务理解和可解释性很重要时:
当戴在内部进行计算时,优化纯粹是通过统计地改进得分函数来驱动的。可能会有这样的情况,一个特性转换器得到应用,并导致模型分数的整体提高,但是从业务角度来看,这可能没有多大意义。
例如,戴可能会选择对代表过去三个月客户交易计数的变量应用对数转换—从业务角度来看,该功能有意义吗?这个问题没有严格的正确或错误的答案,但是必须与相关的涉众保持一致,特别是对于那些通常对“自动过程”更加保守的模型评审者。
3。生产仍需额外努力:
模型部署和监控是 ML 建模生命周期中的另一个关键部分。正如我们前面提到的,虽然 H2O 戴可以自动生成评分管道,但仍有一些集成
在将它投入生产之前需要做的工作,比如使用评分管道设置 REST API,与本地数据库建立数据连接,设置跟踪系统以定期监控模型性能,等等。目前,所有这些步骤仍需要在戴以外的地方进行规划和测试。
话虽如此,戴却是一路快速进化。如果给一些时间,上述一些问题能够得到解决或显著改善,我不会感到惊讶。
有用的参考资料
戴官网是一个很好的入门工具。如果你想在购买许可证前亲自体验戴,一旦你注册,还提供 21 天的免费试用。
另一个对我帮助很大的文档是戴文档的 PDF 版本。它包含或多或少与在线用户手册相似的内容,但我觉得它在如何更系统地理解和学习 H2O 方面给出了一个更结构化的观点。
我希望这篇文章可以帮助那些对戴作为潜在的 AutoML 解决方案感兴趣的人。感谢阅读!
增强方法概述:CatBoost、XGBoost、AdaBoost、LightBoost、基于直方图的梯度增强
用 python 实现在一个视图中编译所有 boosting 方法
***Table of Contents*****1\. Introduction
2\. AdaBoost
3\. Gradient Boost
3.1\. XGBoost
3.2\. Histogram-Based Gradient Boost
3.3\. LightBoost
3.4\. CatBoost
4\. Summary**
扎克·赖纳在 Unsplash 上的照片
1.介绍
在集成学习中,目标是用多种学习算法最成功地训练模型。在集成学习之一 Bagging 方法中,多个模型被并行应用于同一数据集的不同子样本。Boosting 是另一种方法,在实践中经常使用,它按顺序而不是并行建立,旨在训练算法和训练模型。弱算法训练模型,然后根据训练结果重新组织模型,使模型更容易学习。然后,这个修改后的模型被发送到下一个算法,第二个算法比第一个算法更容易学习。本文包含不同的增强方法,从不同的角度解释了这种顺序方法。
2。AdaBoost
自适应增强(Adaboost)是一种广泛使用的基于决策树桩的增强方法(决策树桩:分配阈值,根据阈值进行预测。)。但是这种方法在 Adaboost 中并不是盲目重复的。构建了多种算法,这些算法依次更新它们的权重,并在做出最准确的估计时扮演单独的角色。在每个算法中计算错误率。权重被更新,因此被引用到第二算法。第二种算法对模型进行分类,像第一种模型一样更新权重,并将其转移到第三种算法。这些过程一直持续到 n 个估计量或达到误差=0。在此过程中,该算法使分类更容易和更成功,因为权重由前一算法更新并发送到另一算法。让我们用一个例子来解释这个复杂的顺序算法过程:
假设有两个标签,红色和蓝色。第一种算法(弱分类器 1)分离标签,结果是 2 个蓝色样本和 1 个红色样本被错误分类。增加这些错误分类的权重,之后降低正确分类的权重,发送到下一个模型学习。与以前的算法相比,新模型学习起来更容易,在新模型中,以前的模型错误分类的样本具有增加的偏差,而正确分类的样本具有减少的偏差。在接下来的步骤中重复相同的过程。总之,强分类是在弱分类的配合下发生的。因为它用于分类,所以也可以通过导入 AdaBoostRegressor 用于回归。
超参数
所有超参数均可在 sklearn 网站上获得。总结一下:
- ***base _ estimators:***一种顺序改进的算法(默认为决策树分类器)
- ***n _ estimators:***确定上述过程将采取的最大步骤数。(默认值=50)
- 学习 _ 速率: 决定了权重的变化量。如果选择过小,n_estimators 值必须很高。如果选择得太大,它可能永远达不到最佳值。(默认值=1)
导入了将用于所有方法的数据集,现在让我们实现 Adaboost:
3.梯度增强
Adaboost 通过用决策树桩(1 个节点分成 2 片叶子)更新权重来改进自己。梯度增强,另一种顺序方法,通过创建 8 到 32 片叶子来优化损失,这意味着树在梯度增强中更大*(损失:记住线性模型中的残差。(y_test-y_prediction)给出残差,每个数据点的平方和给出损失。为什么应用正方形?因为我们寻找的值是预测与实际结果的偏差。负值被平方,因为它们将使损失值变小,即使它偏离)*。简而言之,通过使残差值更接近 0,残差值被转移到下一个算法,从而最小化损失值。
与 Adaboost 一样,梯度增强可通过导入 GradientBoostRegressor 用于回归。
OUT[0.22686585533221332,0.20713350861706786,0.1900682640534445,
0.1761959477525979,0.16430532532798403,0.1540494010479854,
0.14517117541343785,0.1375952312491854,0.130929810958826,
0.12499605002264891,0.1193395594019215,0.11477096339545599,
0.11067921343289967,0.10692446632551068,...................
...........................................................
0.05488031632425609,0.05484366975329703,0.05480676108875857,
0.054808073418709524,0.054740333154284,0.05460221966859833,
0.05456647041868937,0.054489873127848434,0.054376259548495065,
0.0542407250628274]
查看 Error_list,可以看到每一步损失值都在变小。[从 0.22 开始,到 0.05 结束]
3.1.XGBoost
XGBoost(代表极端梯度增强)最初是由陈天琦在 2014 年开发的,在梯度增强之前速度快得多,因此它是首选的增强方法。由于它包含超参数,可以进行许多调整,如正则化超参数,以防止过度拟合。
超参数
- ***learning _ rate&eta:***乘以权重值使用。其目的是通过安排特征权重使过程更保守。默认值=0.3,通常使用 0.01–0.3。
- max_depth: 树的最大深度。如果该值增加,模型可能会过度拟合。默认值=6 且仅当
growing_policy=lossguide
、max_value=0
时。请查看增长政策。 - ***n _ estimators:***集合树的数量
- alpha: L1 正则化在权重上。鼓励小重量。默认值=1。
- gamma: 正则化复杂度的超参数之一,在一片叶子中发生分裂所必需的最小损失。默认值=0,较大的灰度系数使模型更加保守。
- ***λ:***L2 正则化在权数上。鼓励小重量。默认值=1。
- 子样本: 将训练多少个数据样本?默认值=1 表示 100%百分比,如果设置为 0.5,则随机选择 50%的数据。
- ***col sample _ bytree:***构造每棵树时列的子采样比。默认值=1。对于每个构建的树,进行一次子采样。
- ***col sample _ by level:***每个级别的列的子样本比率。默认值=1。对于树中达到的每个新的深度级别,进行一次子采样。从为当前树选择的列集中对列进行子采样。
- ***col sample _ node:***每个节点列的子样比率。每次评估新的分割时,进行一次子采样。从为当前级别选择的列集中对列进行子采样。
- ***min _ child _ weight:***用于控制过拟合。过高的值会导致拟合不足。默认值=1。
- grow_policy: 控制新节点添加到树中的方式。在 LGBM 发布后,它被添加到 XGBoost 中。由于 LGBM 的高速度(由于 wise-leaf),它被添加到 XGBoost 与 wise-leaf 的工作中。为了激活它,
grow_policy=lossguide
,默认=depthwise - 目标: 指定学习任务。‘regsquarederror’:平方损失回归;‘reg logist’:logistic regression 等。
- eval _ metric:test _ data(validation _ data)的评估度量。‘RMSE’:均方根误差;‘Mae’:平均绝对误差,‘mape’:平均绝对百分比误差。
更可在此 链接 。
3.2.基于直方图的梯度增强
用宁滨(离散化)对数据进行分组,这是一种数据预处理方法,这里****已经解释过了。例如,当给定‘年龄’列时,将这些数据分为 30–40、40–50、50–60 三组,然后将其转换为数值数据,这是一种非常有效的方法。当这种宁滨方法适用于决策树时,通过减少特征的数量,它加快了算法的速度。这种方法也可以通过用直方图对树进行分组而在每个树的构造中用作集成。scikit 学习库提供的方法:
3.3.光增强
LGBM(代表轻度梯度增强机器)最初由微软在 2017 年发布,是用户首选的另一种梯度增强方法,并且是基于决策树的。与其他方法的关键区别在于,它基于树叶对树进行拆分,即可以检测和停止点拍所需的单元(记住:其他的是基于深度或基于级别的)。由于 LGBM 是基于叶子的,如图 2 所示,LGBM 是一种非常有效的方法,可以减少误差,从而提高精度和速度。您可以使用特殊算法拆分分类数据,但是必须输入一个整数值,如 index,而不是列的字符串名称。
图二。基于层与基于叶,按作者排序的图像
3.4.CatBoost
CatBoost 是 Yandex 在 2017 年开发的。由于它通过一次热编码将所有分类特征转换为数字,因此其名称来自于CategoricalBoosting。应该输入索引值,而不是 but 列的字符串名称。它还处理缺失的数值。它也比 XGBoost 快得多。与其他增强方法不同,Catboost 与对称树不同,后者在每一层的节点中使用相同的分裂。
XGBoost 和 LGBM 计算每个数据点的残差,并将模型训练为具有残差目标值。它重复这个迭代次数,从而训练和降低残余误差,达到目标。由于这种方法应用于每个数据点,它可能在泛化方面较弱,并导致过拟合。
Catboost 还计算每个数据点的残差,并对用其他数据训练的模型执行此操作。以这种方式,为每个数据点获得不同的残差数据。将这些数据作为目标进行评估,并根据迭代次数训练通用模型。由于许多模型将通过定义来实现,这种计算复杂性看起来真的很昂贵,并且花费太多时间。但是在有序升压的情况下,它在更短的时间内完成。有序提升,而不是从第(n+1)个数据点计算的残差开始。就是指数据点的残差。为了计算第(n+2)个数据点,应用第(n+1)个数据点,等等。
超参数
- l2_leaf_reg: L2 代价函数的正则化项。
- 学习 _ 速率: 渐变步长。在过度拟合的情况下降低学习率。
- 深度: 树的深度,大多用在 6-10 之间。
- *****one _ hot _ max _ size:*用小于或等于给定参数值的几个不同值对所有分类特征进行 one-hot 编码
- grow_policy: 决定建筑类型的树。可以使用 SymmetricTree、Depthwise 或 Lossguide。
4.摘要
在这篇文章中,boosting 方法是通过决策树来实现的,但是通过改变相关的超参数,可以很容易地实现其他机器学习模型。此外,所有 boosting 方法都应用了基本版本(未调整任何超参数)来比较 boosting 方法的性能,上面应用的代码列表如下:
增强方法的比较,图片由作者提供
在以后的文章中,我们将通过优化超参数来更深入地探讨每种提升方法。
参考
- https://stack overflow . com/questions/50087526/catboost 算法中对称树背后的直觉是什么
- https://catboost . ai/docs/concepts/python-reference _ parameters-list . html
- https://csiss.org/SPACE/workshops/2004/SAC/files/fisher.pdf
- 【https://xgboost.readthedocs.io/en/latest/parameter.html 号
回到指引点击这里。
**https://ibrahimkovan.medium.com/machine-learning-guideline-959da5c6f73d **
使用 SequenceMatcher 和 spaCy 构建商家名称清理引擎概述
问题陈述
商家名称清理可能是一个相当具有挑战性的问题。由于不同的银行提供不同质量的交易数据,没有一个非常成熟的方法来清理数据。通常,商家名称清理可以被分类为命名实体识别 (NER)任务,并且以与实体提取问题类似的方式来解决。
对于一家金融科技公司来说,商户名称清理步骤非常重要,因为开发人员需要利用这些从原始混乱的交易数据中清理出来的商户名称来生成正确的交易分类,以便在管理个人金融方面提供更好的客户体验。
我发现这个话题非常有趣,我已经搜索了几个星期的资源,用我自己的基本解决方案写了这个概述。因此,我希望我对这个话题的一些想法能够对读者有所帮助,以更好地解决这个商家名称清理问题。
如果你正在寻找更多关于这个主题的阅读资料,欢迎你查看本文末尾的参考书目**。**
工程计划
对于一个基本的商家名称清洗引擎,我计划将其分为三层:
- 第一层:删除特殊字符和数字,并转换大小写。
- 第二层:根据相似性得分返回名称匹配。
- 第三层:训练一个空间模型来检测模式和清理输入。
这个项目的工具包包括 python 中的正则表达式运算、FuzzyWuzzy/sequence matcher*(库)以及 spaCy 模型算法中的一些知识。*
随着阅读的进行,我也会分享一些我觉得有帮助的相关阅读。
第一层:预处理步骤
删除特殊字符和数字:
删除所有特殊字符和数字将是该项目的第一步。这很有用,因为当我们试图查找商家名称匹配和计算相似性分数时,特殊字符和数字通常会增加复杂性。完全删除所有特殊字符和数字可能有点激进。但是,考虑到有数千个原始商家名称的数据集,您可能会发现大多数特殊字符和数字都可以删除,而不会影响商家名称中的任何关键字。
借助 Python Re 库,可以高效地完成特殊字符和数字的删除。一些必备知识是 Python 中的正则表达式 。
*https://medium.com/better-programming/introduction-to-regex-8c18abdd4f70
案例转换
通过成功完成上述步骤,您现在拥有了一个仅包含字母的商家名称数据集。但是,您可能仍然会发现一些商家名称的大小写不同,例如“amazon”、“Amazon”或“AMAZON”。要转换案例,可以在以下文章中找到一些有用的字符串函数:
第二层:计算相似性得分表
对于这一层,我们的主要目标是计算一个相似性得分表,并返回具有前 3 个最大相似性得分的匹配名称。这是一个有用的方法来清理商家名称,假设你已经有一个匹配的名称目录,并且原始输入不是杂乱的。
相似性度量
FuzzyWuzzy 是一个 Python 库,它使用 Levenshtein 距离 来计算一个简单易用的包中序列之间的差异。
https://github.com/seatgeek/fuzzywuzzy
使用 FuzzyWuzzy 的一些实例如下:
- 简单比率
>>> fuzz.ratio("this is a test", "this is a test!")
97
- 部分比率
>>> fuzz.partial_ratio("this is a test", "this is a test!")
100
- 令牌排序比率
>>> fuzz.ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
91
>>> fuzz.token_sort_ratio("fuzzy wuzzy was a bear", "wuzzy fuzzy was a bear")
100
- 令牌集比率
>>> fuzz.token_sort_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
84
>>> fuzz.token_set_ratio("fuzzy was a bear", "fuzzy fuzzy was a bear")
100
或者,sequence matcher也是一个常用于计算输入之间相似性的伟大工具。
基本思想是找到不包含“垃圾”元素的最长连续匹配子序列。然后,相同的思想被递归地应用于匹配子序列的左边和右边的序列片段。这不会产生最少的编辑序列,但会产生对人们来说“看起来正确”的匹配。
>>> s = SequenceMatcher(lambda x: x == " ",
"private Thread currentThread;",
"private volatile Thread currentThread;")
>>> .ratio() returns a float in [0, 1], measuring the "similarity" of the sequences. As a rule of thumb, a .ratio() value over 0.6 means the sequences are close matches>>> print(round(s.ratio(), 3))
0.866
定制相似性函数&计算相似性表
对我来说,我选择 SequenceMatcher 作为评价相似性的度量。如果您选择 FuzzyWuzzy 库,过程将是相似的。
# define a function to calculate similarity between input sequences
def similarity_map(word1, word2):
seq = difflib.SequenceMatcher(None,word1,word2) d = seq.ratio()
return d
上面的定制函数将两个序列作为输入,并返回相似性得分的比值。
为了进一步计算相似性得分表,我制作了一个数据集,它将原始的商家名称作为行索引,将经过清理的商家名称目录作为列名。通过运行下面的代码单元格,它将为每对行索引和列名生成一个相似性得分表。
# prepare a sample dataset
df = pd.DataFrame(data,
index =['amazon co com', 'www netflix com', 'paypal payment', 'apple com bill', 'google play', 'facebook ads'],
columns = ['amazon', 'netflix', 'paypal', 'apple', 'google', 'facebook'])
# print the data
dffrom tqdm import tqdmfor i in tqdm(range(6)):
for j in range(6):
df.loc[df.index[i], df.columns[j]] = similarity_map(str(df.index[i]), str(df.columns[j]))
df.head()
一旦您运行完上面的单元格,您应该有一个相似性得分表,如下所示:
相似性得分表
返回最佳匹配
基于上表,我们可以通过返回每行具有前 3 个最高相似性得分的商家名称来进一步分析洞察力。
编写一个函数top ,该函数将上述数据集作为输入,并返回一个包含前 3 名姓名及其相似性得分的数据集。
similarity = df.reset_index()
similarity.head()def top(x):
x.set_index('index', inplace=True)
df = pd.DataFrame({'Max1Name':[],'Max2Name':[],'Max3Name':[],'Max1Value':[],'Max2Value':[],'Max3Value':[]})
df.index.name='index'
df.loc[x.index.values[0],['Max1Name', 'Max2Name', 'Max3Name']] = x.sum().nlargest(3).index.tolist()
df.loc[x.index.values[0],['Max1Value', 'Max2Value', 'Max3Value']] = x.sum().nlargest(3).values
return dftest = similarity.groupby('index').apply(top).reset_index(level=1, drop=True).reset_index()
test.head()
https://stackoverflow.com/questions/29919306/find-the-column-name-which-has-the-maximum-value-for-each-row https://stackoverflow.com/questions/37494844/find-the-column-names-which-have-top-3-largest-values-for-each-row
通过成功实现上述代码单元,您应该得到如下所示的返回数据集:
每行前 3 个最相似的匹配项
尽管这只是对一个样本数据集的测试,但是如果我们有非杂乱的输入以及一个经过清理的商家名称目录,我们仍然会发现这种方法很有用。
然而,这种方法对于更复杂的商家输入可能表现不好。例如,booking.com 多伦多上一个名为 *paypal 卡支付的商家可能会返回一个关于 paypal 或 Booking 的低相似性分数(小于 0.5)。
在这种情况下,需要更先进的方法来检测我们想要的“真实”商家名称的位置。
第 3 层:用 spaCy 清理商户名称
通过完成前两层,我们能够通过简单地返回相似性得分表来解决一些商家名称清理问题,例如拼写错误、大小写不同、缺少字符/空格,甚至一些非杂乱的商家输入。
然而,我们实际上仍处于使用基于规则的清理引擎的阶段,这意味着迄今为止我们仍未从数据中学习。此外,即使通过使用典型的机器学习模型,训练阶段仍然需要大量的时间来执行特征工程以创建更多的信息特征。
…潜在的交易级信息特征,如金额和类别,同时还生成单词级自然语言特征,如标签内的单词位置(如第一、第二)、单词长度、元音比例、辅音和字母数字字符等。
因此,我研究了如何使用深度学习模型来创建清洁引擎。使用深度学习模型的优势在于,我们能够“跳过”特征工程步骤,让模型本身从输入中检测任何有见地的模式。
空间介绍
一个免费的短期空间课程可以找到如下:
根据 空间指南 :
spaCy 是 Python 和 Cython 中高级自然语言处理的库。它建立在最新研究的基础上,从第一天起就被设计用于真正的产品。spaCy 自带预训练的统计模型和词向量,目前支持 60+语言的标记化。
它具有最先进的速度、卷积神经网络模型,用于标记、解析和命名实体识别以及轻松的深度学习集成。这是在麻省理工学院许可下发布的商业开源软件。
https://github.com/explosion/spaCy
由于商家名称清洗问题可以归入命名实体识别 (NER)的主题下,我相信通过输入一组有代表性的输入数据,spaCy 模型会有很好的表现。
训练空间的统计模型
https://spacy.io/usage/training#section-basics
为了训练一个空间模型,我们不仅仅希望它记住我们的例子——我们希望它提出一个理论,这个理论可以推广到其他例子。
因此,训练数据应该总是代表我们想要处理的数据。对于我们的项目,我们可能希望从不同类型的商家名称中选择训练数据。最终,我们的培训数据将采用如下实体列表的形式:
TRAIN_DATA =
[
('Amazon co ca', {'entities': [(0, 6, 'BRD')]}),
('AMZNMKTPLACE AMAZON CO', {'entities': [(13, 19, 'BRD')]}),
('APPLE COM BILL', {'entities': [(0, 5, 'BRD')]}),
('BOOKING COM New York City', {'entities': [(0, 7, 'BRD')]}),
('STARBUCKS Vancouver', {'entities': [(0, 9, 'BRD')]}),
('Uber BV', {'entities': [(0, 4, 'BRD')]}),
('Hotel on Booking com Toronto', {'entities': [(9, 16, 'BRD')]}),
('UBER com', {'entities': [(0, 4, 'BRD')]}),
('Netflix com', {'entities': [(0, 7, 'BRD')]})]
]
我选择的训练数据只是一个样本。该模型可以接受更复杂的输入。但是,注释一长串商家名称可能会有点无聊。我想推荐另一个数据标注工具 UBIAI 来完成这个任务,因为它支持 spaCy 格式甚至亚马逊理解格式的输出。
https://medium.com/@walidamamou/how-to-automate-job-searches-using-named-entity-recognition-part-1-16c150acafa0 https://medium.com/swlh/building-a-job-entity-recognizer-using-amazon-comprehend-5dd2c33faa82
可能需要一些如何选择代表数据输入的经验。随着你练习得越来越多,观察空间模型学习的方式,你会越来越清楚“代表”可能意味着“不同的位置”。这就是为什么我们需要在输入数据中提供一个实体 start & end 索引的原因,因为它可以帮助模型从不同的上下文中学习模式。
如果模型经常被训练为第一个单词的位置是商家名称(Amazon ca),那么它倾向于认为商家名称只位于输入的开头。这可能会导致偏见,并导致对输入(如“音乐 Spotify ”)的错误预测,因为“Spotify”恰好是第二个单词。
然而,在输入中包含各种商家名称也很重要。请注意,我们不希望我们的模型仅仅记住它们。
一旦完成了对训练数据的调优,剩下的过程几乎就会自动完成。
import spacy
import randomdef train_spacy(data,iterations):
TRAIN_DATA = data
nlp = spacy.blank('en') # create blank Language class
# create the built-in pipeline components and add them to the pipeline
# nlp.create_pipe works for built-ins that are registered with spaCy
if 'ner' not in nlp.pipe_names:
ner = nlp.create_pipe('ner')
nlp.add_pipe(ner, last=True)# add labels
for _, annotations in TRAIN_DATA:
for ent in annotations.get('entities'):
ner.add_label(ent[2])# get names of other pipes to disable them during training
other_pipes = [pipe for pipe in nlp.pipe_names if pipe != 'ner']
with nlp.disable_pipes(*other_pipes): # only train NER
optimizer = nlp.begin_training()
for itn in range(iterations):
print("Statring iteration " + str(itn))
random.shuffle(TRAIN_DATA)
losses = {}
for text, annotations in TRAIN_DATA:
nlp.update(
[text], # batch of texts
[annotations], # batch of annotations
drop=0.2, # dropout - make it harder to memorise data
sgd=optimizer, # callable to update weights
losses=losses)
print(losses)
return nlpprdnlp = train_spacy(TRAIN_DATA, 20)# Save our trained Model
modelfile = input("Enter your Model Name: ")
prdnlp.to_disk(modelfile)#Test your text
test_text = input("Enter your testing text: ")
doc = prdnlp(test_text)
for ent in doc.ents:
print(ent.text, ent.start_char, ent.end_char, ent.label_)
上面的代码来自下面的 Medium 文章,因为我发现它非常有帮助,并启发我测试 spaCy 的一个商家名称清洗问题。
https://manivannan-ai.medium.com/how-to-train-ner-with-custom-training-data-using-spacy-188e0e508c6 https://www.machinelearningplus.com/nlp/training-custom-ner-model-in-spacy/
评估空间模型
通过成功完成训练步骤,我们可以通过检查其损失值来监控模型进度。
Statring iteration 0
{'ner': 18.696674078702927}
Statring iteration 1
{'ner': 10.93641816265881}
Statring iteration 2
{'ner': 7.63046314753592}
Statring iteration 3
{'ner': 1.8599222962139454}
Statring iteration 4
{'ner': 0.29048295595632395}
Statring iteration 5
{'ner': 0.0009769084971516626}
然后向模型显示未标记的文本,并进行预测。因为我们知道正确的答案,所以我们可以以计算训练样本和预期输出之间的差异的损失函数的误差梯度的形式给出关于其预测的模型反馈。差异越大,梯度和模型更新就越显著。
要测试您的模型,您可以运行下面的代码单元格:
#Test your text
test_text = input("Enter your testing text: ")
doc = prdnlp(test_text)
for ent in doc.ents:
print(ent.text, ent.start_char, ent.end_char, ent.label_)
例如,我们可以使用“paypal payment”作为输入,并测试模型是否能检测出“paypal”是正确的品牌名称。
考虑到 PayPal 没有出现在训练输入中,该模型做得非常好。
这也结束了我的项目,建立一个商业名称与空间模型清洁引擎。
结论
首先,感谢您花时间阅读这篇长文,我真诚地希望它对您有所帮助~
- 我首先介绍了为什么商户名称清理很重要。
- 然后,我把清洁引擎分成三层。
- 最后,对于每一层,我解释了输入和输出,以及为什么每一层都是必要的。
作为对这个挑战性问题的概述,我并不完全期望给出一个完美的解决方案。但是我相信分享我的想法和我在研究过程中发现的任何有用的读物会有所帮助。
因此,我希望你喜欢阅读这篇文章。同时,我在本文末尾添加了一个参考列表部分,以防您有兴趣了解关于这个主题的更多信息。
谢谢~
页(page 的缩写)s。
第一次更新:2021 年 2 月 5 日
对 spaCy 模型的训练结果进行了一点更新,大约有 1000 行输入数据。(1000 条注释)
我已经将模型设置为每轮训练 50 次迭代,并对其进行 10 轮训练,以查看训练损失如何变化。似乎如果我们以正确的方式预处理数据,我们应该能够通过 50 次迭代每次达到低且一致的训练损失,如下图所示:
10 轮训练,每轮 50 次迭代
第二次更新:2021 年 2 月 8 日
🤔但是,还有什么方法可以让我们的 spaCy 模型更具交互性呢?如果我们能把 spaCy model 和 Streamlit 集成到一个 web 界面中,会不会更加用户友好?
我受到了如下空间文档的启发:
https://spacy.io/usage/projects
似乎 spaCy 支持包括 Streamlit 在内的许多花哨的工具。因此,我决定尝试将 spaCy 和 Streamlit 整合到一个 web 应用程序中。
如果您想了解更多关于 Streamlit 的知识,下面这篇文章是一个好的开始。
由于之前我们已经将空间训练函数定义为 train_spacy ,剩下的工作将在 10 行代码之内。这也是我认为我应该在同一篇文章下给出一个更新的原因🤗
假设我们已经准备了之前 TRAIN_DATA 格式的输入注释列表。
Streamlit 中的 web 应用程序界面代码如下所示:
import pandas as pd
import numpy as np
import random
import spacy
import re
import warnings
import streamlit as st
warnings.filterwarnings('ignore') # ignore warnings nlp = train_spacy(TRAIN_DATA, 50) # number of iterations set as 50# Save our trained Model
# Once you obtained a trained model, you can switch to load a model for merchant name cleaning
modelfile = input("Enter your Model Name: ")
nlp.to_disk(modelfile)# Load our saved Model
# Load your model to clean a user input instead of training a new model once again when there is a new input
# nlp = spacy.load(modelfile/) # path to the saved file foldertext = 'Amazon/ca' # default text input on web interfacest.title('Merchant Names Cleaning App') # web app title nameuser_input = st.text_input("Text", text) # input text placedoc = nlp(user_input) for ent in doc.ents:
st.write('Text:', ent.text) # display model output
st.write('Label:', ent.label_) # display model output
一个成功的 web 界面应该如下所示:
使用 Streamlit 的示例 web 界面
希望你喜欢阅读!
引用表
[1] 从 Reddit 上清理企业名称
[2] 利用机器学习改进您的交易数据分类
[3] 理清杂乱的银行数据
[4] 使用 Greenplum Hadoop 标准化金融服务领域的 1 . 13 亿多家商户名称
【8】混合模糊名称匹配
[9] CleanMachine:钱包的金融交易标签翻译。艾
【10】深度学习魔法:小企业类型
[11] 使用 Pytorch 检测商户名称
[12] 对银行交易数据进行分类
[13] 训练空间的统计模型
[14] 如何训练 spaCy 自动检测新实体(NER)【完全指南】
[15] 使用 Amazon comprehension构建自定义实体识别器
[16] 用亚马逊 SageMaker Ground Truth 和亚马逊 comprehension 开发 NER 模型
[17] UBIAI 文档
[18] 如何使用命名实体识别实现工作搜索自动化—第 1 部分
[19] 使用 Amazon understand 构建作业实体识别器
[20] Streamlit 和 spaCy:用最少的领域知识创建一个预测情感和单词相似度的应用*
AWS Lambda 的 CloudWatch 指标概述
了解如何监控 AWS Lambda 函数的 CloudWatch 指标
图片来自 Pexels
在本文中,我将讨论如何使用 CloudWatch 指标来执行和监控 AWS Lambda。AWS Lambda 允许您在云上运行应用程序,而无需提供任何服务器。你所需要做的就是使用你喜欢的编程语言编写你的代码,并将你的代码部署到 AWS Lambda。然后,您可以使用 AWS 提供的资源直接运行您的程序。在撰写本文时,AWS Lambda 支持用 Java、NodeJS、C#、PowerShell、Python、Ruby 和 Go 编写的程序。
为什么要监控 Lambda 函数
我认为这是一个很好的起点。这可能是一个问题,如果 Lambda 是无服务器的,并且部署在云中,那么我们为什么要监控它呢?这是因为 Lambda 为每次触发的执行以及执行的持续时间计费。我们将在本文后面看到更多关于 Lambda 定价的内容。但是,总有改进代码的空间或范围,以便它可以用最少的资源和尽可能短的时间有效地执行。这将帮助你作为一个开发人员成长,并且逐渐地也将有助于组织的成长,因为你实际上是在构建一个有成本效益的系统。
在云计算的新时代,事情与传统的基于服务器的架构有些不同。AWS Lambda 是无服务器的,它有一个内置的日志记录和监控系统,可以在 AWS CloudWatch 中推送结果。在运行 AWS Lambda 函数时,了解可以测量哪些指标非常重要。下面是 CloudWatch 在执行 Lambda 函数期间捕获的一些指标。
图 AWS Lambda 的帐户级别指标—云观察指标
为了查看任何 Lambda 函数的性能指标,您可以按照如下步骤操作。打开要监控的 Lambda 函数。单击顶部的 Monitoring,将会显示 CloudWatch Metrics 选项卡。在此选项卡中,您可以看到如下多个指标。
图 2 —在 CloudWatch 指标中监控 Lambda 函数的执行细节
在该选项卡中,有近七个指标受到监控。我已经讨论了下面每个指标的含义。基本上,所有指标都可以分为三个部分——调用指标、性能指标和并发指标。让我们来详细了解一下每一项。
调用指标
调用 —这个指标是 lambda 函数的计费实际上所依赖的最重要的指标之一。每当 lambda 函数被触发时,Lambda 会为每次成功或失败的执行添加一个值 1。如果调用被抑制,那么它将不会在这个指标中被捕获。
错误—lambda 函数中可能存在错误,这可能导致 lambda 函数在执行后无法成功完成。这可能是由于 lambda 函数的代码或 lambda 运行时本身在内部引发了异常。lambda 环境引发错误的最常见原因是不正确的参数配置或由于执行时间较长而引发的超时问题。lambda 函数最多可以运行 15 分钟。
错误 比率 —错误率通过将错误数除以函数调用总数来计算。
Success****Rate—lambda 函数的成功率通过从调用中减去错误,然后除以调用总数来计算。
性能指标
性能指标告诉我们 lambda 函数单次执行的性能。
持续时间 —这个指标告诉我们 lambda 执行函数所需的持续时间。这也取决于分配给 lambda 的内存量。基于内存,AWS 也将计算能力分配给 lambda,该计算能力与内存分配成比例。当您的 lambda 用完所有已分配的内存时,您可以尝试这个设置来找到一个好的基准。
迭代器年龄 —这个度量帮助我们理解在流中收到消息和它实际被发送到函数之间的持续时间。此度量仅适用于事件源映射的 lambda 函数。lambda 函数的事件可以从各种 Amazon 服务发送,如 Simple Queue Service 或 Amazon Kinesis。
并发度量
在云上运行 lambda 函数为同时运行并发函数提供了额外的优势。当 lambda 函数被并行执行时,并发性指标被推送到 CloudWatch 指标中。
并发执行 —这个指标告诉我们对于任何给定的特定 lambda 函数,同时运行的并发执行的最大数量。
CloudWatch 日志洞察
每当执行 lambda 函数时,都会生成日志,这些日志会被存储起来,以后可以在任何时间点从 CloudWatch 查看。日志有助于我们分析 lambda 函数并排除故障,以防在函数执行过程中出现任何问题或错误。
图 3 — CloudWatch 在 lambda 函数中记录见解
CloudWatch Logs Insights 也是一个重要的部分,它为我们提供了关于 lambda 函数的每个执行的信息。这里有两个部分— 最近的调用和最昂贵的调用。这些部分中提供的 CloudWatch 指标如下。
时间戳 —这通常是函数接收到开始执行的请求时的时间戳。它以 UTC 时区存储。
request id—request id 是一个 UUID 字段,为 lambda 函数的每次执行自动生成。这是一个唯一的标识符,可用于标识 lambda 函数的特定执行实例。
日志流 —日志流实际上包含了在生成 Lambda 函数期间生成的详细日志流。您可以单击每个单独的日志流,这将打开特定的日志流,您可以在其中详细查看日志。
DurationInMS —这个指标告诉我们 lambda 函数执行的持续时间,以毫秒为单位。
BilledDurationInMS —此指标是 DurationInMS 指标的四舍五入版本,用于计费目的。通常,这些值总是向上舍入到下一个更大的整数。
MemorySetInMB —这告诉我们在执行时我们已经分配给特定 Lambda 函数的内存。默认情况下,每个 lambda 函数都被设置为从 128 MB 内存开始。但是,根据您的应用程序的负载,建议您相应地更改它。
MemoryUsedInMB —这是最重要的 CloudWatch 指标之一,我个人经常使用它来了解我的应用程序消耗了多少内存。如果所有的内存集都被使用了,那么我们应该增加它,这样在执行之后还会剩下一些内存。这反过来也有助于减少执行时间。
BilledDurationInGBSeconds—这是一个计算指标,通过将分配的内存乘以计费持续时间来衡量。您最终将根据这一指标付费。
结论
在本文中,我们看到了如何捆绑应用程序并部署到 AWS Lambda。AWS Lambda 提供了一个在无服务器平台上运行应用程序的平台。这意味着您不需要维护或照顾 Lambda 使用的底层资源。然而,由于它是无服务器的,你需要监控这些功能的使用,这样你就不会被超额计费。Lambda 是基于执行次数和执行持续时间计费的。您可以使用默认提供的 CloudWatch 指标轻松监控 Lambda 函数的执行。
使用 R 中的 Tidyverse 库进行数据分析概述
马修·施瓦茨在 Unsplash 上的照片
很好的学习资源,也可以用作备忘单
R 中的“tidyverse”包对于 R 中的数据分析是一个非常有用的工具,因为它几乎涵盖了分析数据集所需的一切。它是几个大图书馆的组合,使它成为一个巨大的学习图书馆。在他的文章中,我将尝试对 tidyverse 库做一个很好的概述,它提供了足够的资源来很好地执行数据分析任务,也是进一步学习的一个很好的基础。它也可以用作备忘单。
如果一个人没有多年的经验,在你面前的一页上有一个操作或数据分析想法的列表会很有用。所以,我试着在这个页面上编译了相当多的常用操作来帮助我自己和你。
tidyverse 包中包含的日常数据分析包有:
ggplot2
dplyr
tidyr
readr
满意地说
蒂布尔
stringr
forcats
除了 tibble 之外,本文触及了所有这些包。如果你不知道 tibble 是什么,它也是一种数据框架。我在这里不赘述。我在这里的所有例子中使用了简单的数据框。
我会从一些简单的事情开始,慢慢走向一些更复杂的任务。
开始吧!
首先导入 tidyverse 库。
library(tidyverse)
我将从 stringr 库的一些简单函数开始,这些函数是不言自明的。所以,我就不多解释了。
将字符串转换为小写:
x = "Happy New Year 2022"
str_to_lower(x)
输出:
[1] "happy new year 2022"
将字符串转换为大写:
str_to_upper(x)
输出:
[1] "HAPPY NEW YEAR 2022"
将几个字符串组合成一个字符串:
str_c("I ", "am ", "very ", "happy")
输出:
[1] "I am very happy"
获取字符串列表的子集:
这里我将列出一个字符串列表,然后只取每个字符串的前三个字母:
x = c("Apple", "Tears", "Romkom")
str_sub(x, 1, 3)
输出:
[1] "App" "Tea" "Rom"
在接下来的演示中,我将使用一个名为 flight dataset 的数据集,它是 nycflights13 库的一部分。
library(nycflights13)
库被导入。现在,您已经准备好使用飞行数据集了。飞行数据集很大。这是一个很大的数据集。所以,这里不可能显示截图。以下是数据集的列:
names(flights)
输出:
[1] "year" "month" "day" "dep_time"
[5] "sched_dep_time" "dep_delay" "arr_time" "sched_arr_time"
[9] "arr_delay" "carrier" "flight" "tailnum"
[13] "origin" "dest" "air_time" "distance"
[17] "hour" "minute" "time_hour"
我将从将两列组合在一起的“unite”函数开始。下面的代码块将 flight 和 carrier 列合并在一起,形成一个名为“flight_carr”的新列:
flights %>%
unite_(.,"flight_carr", c("flight", "carrier"))
以下是显示新 flight_carr 列的数据集部分:
当我们有分类数据并且需要将它们用作级别时,因子函数非常有用。对于可视化和机器学习,有必要对分类数据使用因子函数来将它们存储为级别。
在这里,我对载体列进行因子分解,并打印独特的载体:
carr = factor(flights$carrier)
levels(carr)
输出:
[1] "9E" "AA" "AS" "B6" "DL" "EV" "F9" "FL" "HA" "MQ" "OO" "UA" "US"
[14] "VX" "WN" "YV"
让我们看看每个载体的数量:
fct_count(carr)
下一个是 purr 包中的 map_dbl 函数,它采用一个统计函数并返回结果。在这里,我将采用“距离”和“sched_arr_time”列,并找出这两个列的“平均值”:
map_dbl(flights[, c("distance", "sched_arr_time")], ~mean(.x))
输出:
distance sched_arr_time
1039.913 1536.380
GGPLOT2 是一个巨大的可视化库,也附带了 tidyverse 包。这里有一个例子:
ggplot(data = flights) +
aes(x = distance) +
geom_density(adjust = 1, fill = "#0c4c8a") +
theme_minimal()
我有一个关于 ggplot2 的详细教程,你可以在里面找到一系列可视化技术:
我们来看看 lubridate 包的一些功能:
dates = c("January 18, 2020", "May 19, 2020", "July 20, 2020")
mdy(dates)
输出:
[1] "2020-01-18" "2020-05-19" "2020-07-20"
小时-分钟-秒数据:
x = c("11:03:07", "09:35:20", "09:18:32")
hms(x)
输出:
[1] "11H 3M 7S" "9H 35M 20S" "9H 18M 32S"
让我们回到我们的航班数据集。航班数据集中有年、月、日数据。我们可以用它做一个日期栏,找出每个日期的航班数和平均距离。
flights %>%
group_by(date = make_date(year, month, day)) %>%
summarise(number_of_flights = n(), mean_distance = mean(distance, na.rm = TRUE))
如何取一个数据帧的子集?
这个代码块从航班数据集中抽取了 15 行数据。
flights %>%
slice_sample(n = 15)
以下代码块从航班数据集中抽取了 15%的数据样本:
flights %>%
slice_sample(prop = 0.15)
从大型数据集中选择特定的列
这里,我从航班数据集中提取了始发地、目的地、承运人和航班列:
flights %>%
select(origin, dest, carrier, flight)
如果从这个大的航班数据集中,我想要除 time_hour 和 tailnum 列之外的大多数列,该怎么办?
select(flights, -time_hour, -tailnum)
该代码块将选择航班数据集中除 time_hour 和 tailnum 列之外的所有列。
使用列名的一部分来选择列也很有帮助。
以下代码行选择所有以“air_”开头的列:
flights %>%
select(starts_with("air_"))
只有一列以“air_”开头。
这些是以“延迟”结尾的列:
flights %>%
select(ends_with("delay"))
以下各列包含“dep”部分。
flights %>%
select(contains("dep"))
如何根据具体条件过滤行?
保留“dest”以“FL”开始的数据行,并过滤掉其余的数据:
flights %>%
filter(dest %>% str_detect("^FL"))
以下是部分输出数据:
看看上面的“目的地”一栏。所有值都以“FL”开头。
这是另一个过滤函数的例子。保留 month = 2 的行,过滤其余的行。
filter(flights, month == 2)
这行代码将返回月份值为 2 的数据集。
使用筛选并选择同一行代码中的两个
选择距离值大于 650 的起点、目的地、距离和 arr_time 列:
select(filter(flights, distance > 650), origin, dest, distance, arr_time)
使用管道也可以做到同样的事情:
flights %>%
filter(distance > 650) %>%
select(origin, dest, distance, arr_time)
在下面的例子中,我从航班数据集中选择航班和距离,并在航班号为 1545 的地方取平均距离。
flights %>%
select(flight, distance) %>%
filter(flight == 1545) %>%
summarise(avg_dist = mean(distance))
使用现有列创建新列
我正在创建两个新列 arr_time_new 和 arr_time_old,并使用 mutate 操作将 arr_time 列加上和减去 20。在此之前,我使用过滤器删除空值。
flights %>%
filter(!is.na(arr_time)) %>%
mutate(arr_time_new = arr_time + 20,
arr_time_old = arr_time -20)
变异的最后一个例子。在这里,我们将长距离飞行定义为距离大于 1000,并根据该定义计算有多少次飞行是长距离的。
flights %>%
mutate(long_distance = (distance >= 1000)) %>%
count(long_distance)
拉斯韦加斯到达延迟和西雅图准时到达计数:
flights %>%
mutate(dest = case_when(
(dest == 'LAS') & arr_delay > 20 ~ "Las Vegas arriavl - Delayes",
(dest == "SEA") & arr_delay <= 20 ~ "Seattle arrival - On time"
)) %>%
count(dest)
替换人名并计数
起源被表示为 EWR、LGA 和 JFK。我们将用它们的全名替换它们,计算航班数量,并按排序顺序显示它们:
flights %>%
mutate(origin = str_replace_all(origin, c(
"^EWR$" = "Newark International",
"^LGA$" = "LaGuaria Airport",
"^JFK$" = "John F. Kennedy International"
))) %>%
count(origin)
使用 Group By 函数汇总数据
我想知道每个月所有航班的平均距离。在这种情况下,我将对 month 列使用 group_by 函数,并使用 summarise on distance 列找到平均距离:
flights %>%
group_by(month)%>%
summarize(mean_distance = mean(distance, na.rm = TRUE))
Group by 函数可用于多个变量,也可用于汇总函数之外的函数。
这里有一个例子。这里还使用了另一个名为“排列”的函数来获得按平均距离排序的数据集。
flights %>%
filter(!is.na(distance))%>%
group_by(year, month) %>%
summarize(mean_distance = mean(distance),
min_distance = min(distance)) %>%
arrange(mean_distance)
看,数据集是按照平均距离升序排列的。
计数功能
让我们按航班号数一下航班:
flights %>%
count(flight)
统计每个起点的航班数量,并根据航班数量进行排序:
flights %>%
count(origin, sort = TRUE)
让我们看看每个始发地-目的地组合有多少个航班:
flights %>%
count(origin, dest)
制作航线栏,显示起点->终点组合,并统计每条航线的航班数;
flights %>%
count(flight_path = str_c(origin, "->", dest), sort = TRUE)
传播功能
为了演示传播函数,我们先准备点东西。我为每个始发地-目的地组合计算平均 dep_delay:
flg = flights %>%
filter(!is.na(dep_delay)) %>%
group_by(origin, dest) %>%
summarize(mean_dep_delay = mean(dep_delay))flg
下面是 spread 的用法,其中键是原点,值是 mean_dep_delay:
flg %>%
spread(key = origin, value=mean_dep_delay)
看起来起源是传播。该数据集中有三个原点,它们现在成为了该扩展数据集的列。此处显示了每个目的地从每个起点的平均 dep_delay。
但问题是这个输出数据集中有一些空值。我们可以使用以下代码用零填充它们:
flights_spread = flg %>%
spread(origin, mean_dep_delay, fill=0)
请自行运行这段代码并查看结果。
聚集功能
使用聚集函数,我将从“EWR”列到“LGA”列的 mean_dep_delay 值中收集值:
flights_spread %>%
gather(key = "origin", value = "mean_dep_delay", EWR:LGA)
这篇文章就这么多了!
结论
使用 tidyverse 包可以做更多的事情。我试图给出一个涉及不同领域很多事情的概述。希望你能用它来做一些有趣的工作。
欢迎在推特上关注我,查看我的新 YouTube 频道
更多阅读