什么是激进的内容问题,你的推荐系统是否深受其害?
可解释的建议如何帮助你发现新的见解。
克林特·帕特森在 Unsplash 上拍摄的照片
这篇文章是我关于可解释建议系列文章的第 3 部分,基于我的 BSc 论文 。 第一部分 介绍了可讲解推荐的概念,而 第二部分 介绍了我使用 Python 和 React.js 实现的可讲解电影推荐。
推荐系统的使用在过去的十年里越来越多,它们被认为是 YouTube、网飞和亚马逊等应用程序不可或缺的一部分。虽然推荐帮助用户在无限的选项海洋中找到他们喜欢的视频、电影或项目,但他们这样做不会没有问题。最近,一些推荐系统因将用户引向一个“兔子洞”,内容越来越激进而受到批评。这种系统的一个例子是 YouTube 的推荐系统,它根据用户的观看历史为用户推荐视频和频道。在研究右翼频道时,研究人员发现了一些证据,表明 YouTube 的推荐算法通过向用户推荐越来越激进的频道而使用户变得激进[1]。值得注意的是,这并不意味着推荐系统有任何问题——事实上,它似乎完全按照设计的那样工作,向有兴趣观看视频的用户准确地推荐视频。这个问题可以称之为部首内容问题,关于解决它的学术研究很少。
作为我关于可解释的推荐的论文的延伸,我选择寻找是否有任何可解释的方法可以用来阻止推荐系统推荐越来越激进的内容,或者发现问题是否首先存在。推荐系统中的可解释性以前主要关注用户体验,但也许它也能帮助数据科学家更好地理解他们自己的模型?
基于潜在因素模型的推荐系统是很难解释的。到目前为止,事后解释方法,如关联规则[2]已被用于解释个人的建议。然而,由于关联规则集将推荐系统的行为作为一个整体封装起来,因此它可以用于发现关于推荐系统整体的知识。为此,推荐系统被映射为一个使用生成的关联规则的网络。因为关联规则的形式是(X,Z => Y),所以它们可以被认为是有向图,其中 X,Z 和 Y 是图的节点。然后可以使用标准的图形可视化技术来可视化该图形。下图显示了使用从 MovieLens 20m 数据集挖掘的关联规则生成的图形。注意,类型为(X,Y) => Z 的规则显示在两条边上,X => Z 和 Y => Z。
从推荐系统中挖掘的关联规则被可视化为有向图。每个节点代表一部电影,而每个边(箭头)代表一个关联规则中的因果关系,即 A→b . Ville Kuosmanen 的图像
可视化的图可以潜在地用于回答关于基础推荐系统的许多问题,但是最有趣的一个是该系统是否遭受极端内容问题,指的是推荐系统向已经评级了流行的温和项目的用户推荐越来越极端的小众项目。这个问题对于像 YouTube 这样的开放视频平台来说特别有意义,YouTube 被指控向流行、温和的“门户”视频的观众推广更极端的内容[1]。为了对网络进行定量分析,应该定义一个合适的“极端性”度量。电影极端评分的一个例子可以是它的分类年龄分级。YouTube 和 Twitter 等没有客观年龄分级的平台上的内容可能更难进行极端排序,但情感分析等机器学习技术可能会用于此。
每一项都可以被赋予一个极端值,随着越靠近聚类中心,网络中极端值越大的部分可以被自动识别出来。因为极端内容倾向于关注特定的社区或用户组,所以分析应该基于基于聚类的关联规则,而不是全局挖掘的规则(如这里所做的)。这将潜在地允许平台管理员容易且客观地找到最激进的社区,并在需要时对其内容设置适当的限制或年龄分级。
在这种情况下,对网络的视觉检查似乎将诸如*《肖申克的救赎》、《指环王:双塔奇谋》和《教父》*等电影置于网络的中心,这些电影似乎并不比它们的前身更极端。这样,对网络的视觉检查表明,这里描述的推荐系统不会遭受极端内容问题。当然,应该进行更彻底的分析检查来确认这一发现,但这超出了本项目的范围。
这篇文章结束了我关于可解释的推荐系统的系列文章。我喜欢了解更多关于可解释的人工智能的需求和挑战,以及在这个过程中对推荐系统的深刻理解。感谢阅读!
[1]:里贝罗,M. H .,奥托尼,r .,韦斯特,r .,阿尔梅达,V. A .,&梅拉,W. (2019)。审核 YouTube 上的激进化途径。 arXiv 预印本 arXiv:1908.08313 。
[2]:皮克,g .,&王,J. (2018 年 7 月)。推荐系统潜在因素模型的事后可解释性。《第 24 届 ACM SIGKDD 知识发现和数据挖掘国际会议论文集》(第 2060–2069 页)。ACM。
什么是 Softmax 函数?—少年解释道
softmax 函数的简要说明,什么是 softmax 函数,它是如何工作的,以及一些代码。
作者通过 Imgflip 生成的图片
图片由作者通过 Imgflip 生成
softmax 函数是一个激活函数,它将真实值转化为概率。
在一个正常的学年,此时此刻,我可能正坐在离家两个小时的咖啡店里,读着我计算机编程课前的讲座。或者,此时此刻,我可能正在上课,试图跟上我的教授对精确方程的解释。随着世界各地的学校关闭,像我这样的学生只能靠自己来对抗拖延症。一场可悲的斗争,一场我显然不会赢的斗争。在过去的几周里,尽管我的大学有大量的在线工作,但我已经决定这是学习我所能学习的关于深度学习的一切的最佳时间。像许多其他好奇的人一样,我决定在 Udacity 上参加一个名为深度学习与 PyTorch 的课程(自然,本文的灵感来自于这个课程中的概念。)
如果你已经阅读了我上一篇关于感知器 **,**的文章,你已经知道感知器是一种二进制分类算法,它使用一些线性函数进行预测。但是如果我们想要对两种以上的数据进行分类呢?我们如何做到这一点?我们实际上可以使用一个激活函数,称为 softmax 函数。在本帖中,我们将讨论什么是 softmax 函数,比较二进制分类和多类分类,讨论 softmax 函数如何工作,并提供一些示例代码。
什么是 Softmax 函数?
softmax 函数是逻辑函数的推广,可用于对多种数据进行分类。softmax 函数接受不同类别的实际值,并返回概率分布。
标准逻辑函数能够进行二元分类,而 softmax 函数能够进行多类分类。
作者图片
让我们看看二元分类和多类分类是如何工作的
二元分类模型
假设我们有一个模型,我们知道你得到或得不到工作的概率是,
作者图片
因此,你得到工作的概率是 p(工作)= 0.8,因此,你得不到工作的概率是 p(没有工作)= 0.2。
该模型将接受一些输入,如你的期末考试成绩是多少?或者你建了多少个项目?基于线性模型,它将返回一个“分数”(作为一个未绑定的值),分数越高,可能性越大。
作者图片
那么得到工作的概率就简单的是分数的 sigmoid 函数。(如果你想知道更多关于 sigmoid 函数如何工作的信息,请查看视频。).正如我们所知,sigmoid 函数会将分数转换为概率,其中概率介于 0 和 1 之间。
然后将这个概率与我们已知的概率进行比较(所以,p(工作)= 0.8,p(不工作)= 0.2)。
多类分类
假设,我们试图建立一个模型,对 3 个不同的项目进行分类。一支铅笔,一支钢笔和一块橡皮。假设得到铅笔的概率是 p(铅笔)= 0.5,得到钢笔的概率是 p(钢笔)= 0.4,得到橡皮擦的概率是 p(橡皮擦)= 0.1。因此概率看起来像,
作者图片
其中概率之和为 1。
现在,让我们对我们的模型执行与二元分类相同的步骤,给定一些输入,计算线性函数,并给每个项目打分。
作者图片
现在我们有了分数,我们怎样才能找到这三项的概率呢?这就是 softmax 函数发挥作用的地方。
soft max 功能是如何工作的?
给定上面的无界分数,让我们试着把这个转换成概率。
现在你可能会问,“为什么我们不能只使用一个 sigmoid 函数?”
我们需要一个能做两件事的函数,
- 使结果概率介于 0 和 1 之间。
- 使所得概率之和等于 1。
Sigmoid 函数并不总是等于 1。换句话说,sigmoid 函数输出独立的分布 p(x1)和 p(x2 ),因此对于 sigmoid 函数,我们可以说 p(作业)= 0.89,p(非作业)= 0.26,这两者之和不等于 1。因此,当我们有独立的二进制标签时,如红色或蓝色,猫或狗等,sigmoid 函数是有用的。正如我们将很快看到的,softmax 函数的分布与输出变量 p(x1,x2,x3)等相关联。
我们将这些分数转换成概率的一种方法是使用这个函数,
作者图片
一个项目的分数,超过所有分数的总和。这是可行的,因为每个概率都在 0 和 1 之间。它还会使每个概率加起来为 1。
这看起来不错,但是你可能已经猜到有一个问题。如果分数是负数呢?这可能是有问题的,因为概率不再等于 1。
怎么才能让每个数字都是正数呢?我们可以试着用一个指数函数,这样函数看起来就像这样,
作者图片
我们做到了!
这就是所谓的 softmax 函数。它可以接受真实值并将其转化为概率。这非常有用,因为现在我们可以对两种以上的数据进行分类。(关于视频解释,我建议你看看这个!)
代号
现在我们来看看如何用 python 编写 softmax 函数的公式。
import numpy as npdef softmax(L):
expL = np.exp(L) #calculating the numerator
sumExpL = sum(expL) #calculating the denominator
result = []
for i in expL:
result.append(i*1.0/sumExpL) #divind the numerator and denominator
return result
# Note: The function np.divide can also be used here, as follows:
# def softmax(L):
# expL = np.exp(L)
# return np.divide (expL, expL.sum())
这段代码直接取自 Udacity 课程, 深度学习用 Pytorch 。
这个 softmax 函数接受一个值 L,它表示分数。计算函数的分子和分母,然后除以它。
关键要点
什么是 softmax 函数?
softmax 函数是可以执行多类分类的激活函数。它接受真实值并进行概率分布。这个函数看起来像这样,
作者图片
Week✨的 DL 视频
看看这深深的假!这看起来像是流行歌手爱莉安娜·格兰德,但这个视频实际上是来自热门的 youtuber 网站 Emma Chamberlain。
额外资源/引用
本文在很大程度上基于 Udacity 教授的 PyTorch 深度学习课程。你一定要去看看!
这个视频很好地解释了乙状结肠的功能。同样是 Youtuber 上的这个视频很好地解释了 softmax 的功能。
这里是对 softmax 函数及其与逻辑回归的关系的一个很好的概述。
阅读维基百科总是有用的!
吴恩达也很好地解释了 softmax 函数!
关于 sigmoid 函数和 softmax 函数之间差异的详细解释可以在 reddit 表单上阅读。
哪里可以找到我😝
我的 LinkedIn!请随时与我联系,我喜欢谈论人工智能!
新加坡的金融科技行业现状如何?
基于 R 的网页抓取分析
图片来源:安德烈·弗朗索瓦·麦肯齐,来自 Unsplash
自 2015 年以来,流入新加坡的金融科技私人资金呈指数级增长。据埃森哲称,2019 年,新加坡金融科技行业从私人投资者那里获得了创纪录的 8.61 亿美元资金,巩固了其作为亚太地区第五大金融科技市场的声誉。
鉴于私人资金大量流入新加坡的金融科技行业,或许值得研究一下这个新兴行业是否在就业增长 方面取得了收益。哪些类型的金融科技公司已经在新加坡开展业务?他们涉足哪些金融活动?他们是新成立的公司,还是大公司?要回答这些问题,我们首先需要定义什么是金融科技。
作者图片
那么,什么是 FinTechs 呢? 不幸的是,尽管世界各地的许多统计机构似乎都同意使用公司的“主要业务活动”这一概念,但目前还没有关于金融科技是什么的可靠定义。金融科技公司可以被定义为以提供金融服务为主要业务活动的公司,并以技术为支撑。但是,这也不是一个非常精确的定义。
一般来说,许多人认为金融科技是“游戏规则改变者”,寻求彻底改变金融服务的提供方式。这一问题因“TechFins”的出现而变得更加复杂,TechFins 主要是也涉足金融服务领域的科技公司。科技巨头,如阿里巴巴,也有一个银行部门,被认为是 TechFins。那么,你如何从技术股中筛选出技术股呢?
数据集
在等待金融科技的正确工作定义尘埃落定的时候,我发现新加坡金融科技协会 (SFA)维护着一份目录清单,列出了“”金融科技认证的*(见下文)*。那么在新加坡成为" FinTech 认证 "是什么意思呢?你的金融科技公司必须(一)在新加坡注册并运营;(ii)为作为核心业务的金融部门提供技术解决方案,以及(iii)拥有随时可用的工作产品。**
图片作者,来自新加坡金融科技协会
事实证明,通过点击网站上的每个个人列表,我们可以获得相当广泛的信息,如特定的“金融科技认证”公司何时成立,其估计员工人数是多少,其商业模式以及其涉足的金融服务类型。下面的例子说明该公司是一家“ InsurTech ”。
图片作者来自新加坡金融科技协会
通过从新加坡金融科技协会的网站上抓取这些列表,我们可以获得这里金融科技公司的全面概述,如它们的商业模式,金融活动类型和就业增长。那么让我们开始吧!
事实证明,该网站使用 AJAX 来呈现其页面。使用 AJAX,web 应用程序可以异步地从服务器发送和检索数据,而不会干扰现有页面的显示和行为。虽然这是网站开发者的梦想,但对网站抓取者来说却是噩梦。
但是,在检查 Chrome 开发者工具时,我发现了网站调用数据的“秘密”页面。
作者图片,来自新加坡金融科技协会
如果我们点击嵌入在 Chrome 开发者工具中的 URL,我们会看到这样一个页面:
****
图片作者,来自新加坡金融科技协会
现在,如果我们仔细观察嵌入在 Chrome 开发者工具中的 URL,你可能会注意到“p=2”。这控制了页码。你可能会注意到上图中总共有 22 页和 437 个结果(即金融科技认证公司)。我们可以通过创建一个从“p=1”到“p=22”的 URL 列表来开始我们的 web 抓取过程。
现在,从这份包含 22 个网址的列表中,我们希望获得每家金融科技公司的名称及其具体网址。回想一下,我们有 437 家 FinTech 认证的公司,所以我们应该得到一个有 437 行的数据框架。为了获得您在下面的代码中看到的“ html_nodes( ) 中的参数,我使用了一个名为SelectorGadget的便捷工具,可以从 Chrome 上免费下载。
图片由作者提供,来自新加坡金融科技协会
现在我们已经有了 437 家金融科技认证公司的具体网址,我们可以有效地获取员工规模、商业模式等信息。类似地,这里使用了 SelectorGadget 来提取我们需要的各个字段。
图片作者,来自新加坡金融科技协会
现在我们手头上有了所有 437 家金融科技认证公司的数据,我们可以开始做一些分析了。
就业增长
我们的数据集目前是“wide”格式。我们可以将其转换为“长”格式,并可视化就业人数如何随着时间的推移而演变。不过,需要注意的是,所有 437 家金融科技认证公司报告的员工人数都是一个范围,比如“11-50”,而不是实际人数。此外,由于我们没有关于一家公司的员工人数如何随时间变化的纵向数据,我们将假设一家公司的员工人数从其成立到今天保持不变。
出于这一分析的目的,我们想研究 2011 年至 2020 年间就业如何演变。我们可以通过查看公司 UEN 的前 4 位数字来判断公司是哪一年成立的。假设一家公司在 2016 年成立,那么它在 2016 年之前的雇佣规模将被分配 NA 值,如下所示。
*现在我们可以使用 dplyr 的 group_by( ) 和*summary()命令为可视化准备数据。
作者图片
嗯,在我们的数据集中,437 家金融科技认证公司的就业人数似乎一直在稳步增长。事实上,就业增长与流入新加坡的金融科技私人资金正相关,后者自 2015 年以来有所增加。然而,由于新冠肺炎经济衰退,2020 年的增长率似乎有所放缓。
如果我们按照每个企业的员工规模来看就业增长,我们会注意到,一般来说,这是由微型企业和初创企业(即雇用不到 50 名工人的企业)的增长所支撑的。或许是一个令人鼓舞的迹象,在最近几年(2018 年至 2019 年),新加坡已经能够吸引更大的金融科技公司,尽管只有少数几家,它们雇用了 200 多名工人(红条)*。*
公司成立
这里,我们要统计某一年成立的 FinTech 认证公司的数量。同样,我们着眼于 2011 年至 2020 年期间。
作者图片
自 2013 年以来,在新加坡注册的金融科技认证公司的数量一直呈上升趋势。随着 2019 年创纪录的 8.61 亿美元金融科技私人资金涌入新加坡,这一年公司数量的快速增长也就不足为奇了。尽管我们距离 2020 年底还有大约两个月的时间,但新冠肺炎经济衰退对金融科技行业的负面影响是非常明显的。
商业模式与金融服务类型
商业模式这里指的是某个特定的事务所是“B2B”、“B2C”还是“B2B2C”。至于金融服务的类型,可以有很多,从支付、贷款、经纪、汇款等等。我们可以从一些清理后的数据中获得这些关于金融科技认证公司性质的见解。
在我们数据集中的 437 家金融科技认证公司中,约 79%的公司至少服务于 B2B 领域。至于金融科技公司提供的金融服务类型,如"人工智能和机器学习"、"支付、"平台、"区块链、借贷等活动最受欢迎。
这一发现得到了埃森哲(2019)的有力支持,该公司称:****
“投资于 支付的初创企业 和投资于的初创企业拿走了 fintech 募资的大头,分别占总数的34%20%,而 投保 techs 在中抽成******
新加坡的金融科技产业确实在增长,未来看起来确实令人兴奋。除了 2020 年,在私人金融科技融资和宽松监管的帮助下,公司成立和就业增长在过去 5 年中明显呈上升趋势。我预计,新冠肺炎经济衰退对金融科技初创企业的打击将尤其严重,相当多的初创企业甚至可能不得不倒闭。但是每一次危机都是一次机会,幸存者可能会变得更加强大。
非常感谢您的阅读!
这个指标的方差是多少?
了解业务指标概率分布的效用以及如何在 Python 中计算它们
Sergign 从photodune.net拍摄的照片
分析师通常会观察一段时间内的趋势,以了解指标中的噪声水平,但通常衡量中的噪声不会在用于决策的数据中表现出来。重复出现并向上传递的语句类似于“我们同比下降 20%”下降 20%可能真的很糟糕,或者如果指标有噪声,这可能只是发生的事情。当然,经验会告诉人们这是否是一个在下降 20%时确实超出正常范围的指标,但经验并不总是不偏不倚和听到的。大多数商业指标都是比例的形式。在本文中,我将探索我们如何评估标准业务度量的可信度。
情况
一名团队成员说“我们的转换率是 4%。这比我们通常看到的 5%有所下降。那就是转移率下降了 20%!一定是什么东西坏了!我们都需要停止正在做的事情,进行调查。”
你说“在我们从重要项目中抽调大量人员进行调查之前,让我们仔细看看这些数字。东西坏了之后你转了几次?东西坏了之后有多少次尝试?在“工作”系统崩溃之前,它进行了多少次转移?之前尝试了多少次?”您的同事在他们的电子表格中找到了以下数字。
old_transfers = 100
old_attempts = 2000
new_transfers = 8
new_attempts = 200transfer_rate_old = old_transfers/old_attemptstransfer_rate_new = new_transfers/new_attemptspercent_improvement = (transfer_rate_new-transfer_rate_old)/transfer_rate_old*100
因为像这样的许多业务度量是比例,所以它们可以被建模为二项式分布。这太棒了。我喜欢二项式分布,因为感觉上我可以免费得到方差。我只需要知道试验的次数,然后就是:方差神奇地显示为 np(1-p)。但是等等,n 和 p 是什么?n 是试验的次数或度量中的分母,参数 p 可以作为业务度量来估计。在我们的例子中,旧的工作系统是 0.05,坏的系统是 0.04。
我们可以绘制破损系统的转移率和工作系统的转移率的概率质量函数,假设它们遵循二项式分布。在这篇文章中,我不打算深究这些假设。目的是演示一种简单的方法来估计业务指标中的噪声,以便做出更明智的决策;如果您打算使用这种方法,我鼓励您深入研究这些主题,以确保您的数据符合使用这种简单方法所需的所有假设。我发现 Bootstrapping(https://en . Wikipedia . org/wiki/Bootstrapping _(statistics))是一种很好的方式来更好地了解你的数据如何符合模型(可能是我的下一篇文章)。
import numpy as np
import matplotlib.pyplot as plt
import scipy.stats as statsplot_max_x = 150
x_values = range(plot_max_x)
working_system_pmf = stats.binom.pmf(x_values, old_attempts, old_transfers/old_attempts)
plt.plot(x_values,working_system_pmf, 'b.', label = 'working_system_pmf')
broken_system_pmf = stats.binom.pmf(x_values, new_attempts, new_transfers/new_attempts)
plt.plot(x_values,broken_system_pmf, 'r.', label = 'broken_system_pmf')
plt.ylabel('probability')
plt.xlabel('transfers')
plt.legend()
那么,我在这个图中看到了什么?嗯,每个客户要么转账,要么不转账,所以任何 n 次尝试的可能性都是有限的。如果我们只有三个客户,所有可能的转移值将是 0、1、2 或 3。图上的 x 值是转移的次数,y 值是破损系统和工作系统的概率。这个概念可能会令人困惑。我们不知道转账吗?我们确实知道所测量的转移。故障系统为 8,工作系统为 100。但是,这并没有完全描述我们想知道的东西。我们真正感兴趣的是破碎系统的未来传输速率,这就是这个图所表示的。我发现把我们的度量看作是对系统真实价值的一次尝试是有帮助的。我们测量了损坏系统的 8 次传输,但是我们知道每个测量都包含噪声。也许每 200 次尝试就有 10 次传输才是坏系统的真实传输速率?该图显示了在给定我们已有信息的情况下,尚未执行的测量的可能结果。随着我们收集更多的数据,我们对系统的真实速率有了更好的估计。但是我们不能等。系统可能被破坏了。我们需要正确解读现有的数据。
显然,工作系统将有更多的转移,因为我们有这么多的客户使用这个系统。在该图中,工作系统的曲线看起来更粗,这通常与更多的噪声有关。但这是骗人的。工作系统的曲线中所示的最高转移为大约 125,相对于在大约 17 处具有曲线的最高部分而测量的转移数仅为 8 的损坏系统,这比测量的转移数 100 大不了多少。所以,在工作系统中,相对方差更小,因为我们做了更多的测量。
但是我仍然不知道如何处理这些信息。我们似乎没有更接近于比较这些比率。也许我们推进调查,忘记分析?由于贝叶斯方程和共轭先验的魔力,我们实际上比你想象的更接近理解我们对系统崩溃的信心。
后验∝先验⨉似然
为了简单起见,我们将使用均匀分布作为非信息先验信念。不要让这种说法把你搞糊涂了。这只是意味着,在我们开始为两个系统中的任何一个收集数据之前,我们将避免谈论我们认为的传输率是多少。将均匀分布用于我们的先验信念会导致后验分布,即我们感兴趣的传输速率,它只是一个带有alpha = 1+ transfers
和beta = 1 + (attempts — transfers)
的贝塔分布。α和β是进行β分布所需的两个参数。这些就像是正态分布所需的均值和标准差参数。
二项式分布用于描述一系列 n 个独立实验的成功次数。我们将用来描述转移率的贝塔分布,被用来描述连续变量的行为,如定义在 0 和 1 之间的区间上的比例。
Bayes 方程允许我们获得使用每个系统收集的数据的概率分布(图 1 ),并将其转换为指标(传输速率)的概率估计值。同样,这是一个你应该深入了解的领域,以理解我所做的假设。简而言之,我假设在收集两个系统的数据之前我对传输速率一无所知,并且我利用了每个系统所有可能的传输速率的总概率为 1 的事实。
x = np.linspace(0.01, 0.2, 1000)
working_system_transfer_rate_pdf = stats.beta.pdf(x, old_transfers+1, (old_attempts-old_transfers)+1)/np.sum(stats.beta.pdf(x, old_transfers+1, (old_attempts-old_transfers)+1))
broken_system_transfer_rate_pdf = stats.beta.pdf(x, new_transfers+1, (new_attempts-new_transfers)+1)/np.sum(stats.beta.pdf(x, new_transfers+1, (new_attempts-new_transfers)+1))
# notice that I normalize the transfer rate by dividing each value by the total
plt.plot(x, working_system_transfer_rate_pdf, 'b-', lw=2, alpha=0.6, label='Working system expected val = ' + str(np.round(old_transfers/old_attempts, 3)) )
plt.plot(x, broken_system_transfer_rate_pdf, 'r-', lw=2, alpha=0.6, label='"Broken" system expected val = ' + str(np.round(new_transfers/new_attempts, 3)) )
plt.legend()
plt.xlabel('Transfer Rate')
那么我们在看什么?我们知道每个系统都有一个传输速率。我们进行的测量越多,对传输速率的估计就越准确。我们测得故障系统的传输速率为 0.04,但如果我们再测量该系统几天,我们知道我们对实际传输速率的估计会有一些变化,因为任何测量中都有噪声。该图显示了在给定我们当前拥有的数据的情况下,每个系统的传输速率的概率分布的估计值。该图向我们显示,尽管损坏系统的传输速率的期望值是 0.04,但是损坏系统具有 0.05 或更高的传输速率的可能性很大。根据这张图表,我可能会推迟启动大规模调查,但我们必须将这些信息与更低传输速率的成本信息结合起来。
结论
如上图所示的图表可以帮助我们做出更明智的商业决策。通过对概率分布和 Bayes 方程以及几行代码的了解,我们可以绘制概率分布图来比较业务指标。文章的代码可以在这里找到https://github.com/bprazen/business_metric_analysis。
什么是波动风险溢价?
投资组合中的可视化和实现
波动风险溢价的概念
在 Black-Scholes 模型的衍生之后,讨论开放到它在普通期权定价中的位置。市场根据供求规律决定特定履约和到期的利率和期权价格。唯一不容易作为布莱克-斯科尔斯方程输入的参数是波动率。由于除波动率之外的每个参数都是可用的,并且由市场决定,布莱克-斯科尔斯方程的逆方程允许我们找到市场参与者预期的波动率:隐含波动率。从经验上看,隐含波动率的有趣之处在于,它倾向于高估已实现波动率,这主要是由于市场参与者及其已实现对手的预期。
蒙特卡洛定价图解
想想下面这段欧洲人打电话给间谍的话。
使用一个通用的蒙特卡罗定价模拟让我们能够说明这一现象。我们假设基础资产遵循扩散过程(几何布朗运动)。考虑以下 Python 代码来计算欧式看涨期权产生的预期现金流净现值。换句话说,期权的公允价格。
蒙特卡洛模拟给出的最终买入价格为:
Monte Carlo Euro Call price: 5.09259969279995
现在,考虑以下使用市场隐含波动率的蒙特卡洛模拟价格。
Monte Carlo Euro Call price: 6.450104207093876
在一个完美的世界中,使用隐含波动率的期权价值将收敛于期权的 Black-Scholes 或市场价值。真正的问题是,为什么期权的公允价格和市场价格之间存在差异?看波动率,可以问另一个问题:为什么市场隐含的波动率往往高于已实现的波动率?
市场参与者的行为研究
在耶鲁大学的一项研究中,市场参与者倾向于高估重大崩盘的概率,导致对期权的需求增加。这种对风险的高度感知可能会导致人们更愿意购买这些期权来对冲投资组合。换句话说,投资者愿意为防范重大市场崩溃的期权支付溢价,即使从统计数据来看,这些崩溃的概率较小,甚至可以忽略不计。
波动风险溢价组合构建
波动风险溢价存在的概念意味着从利润和多样化中获取和受益的能力。提取 VRP 的最纯粹的方法在于 S&P500 的卖空期权头寸。从长期来看,这种策略产生正回报,同时也保持了多样化的好处,因为它与股票的相关性极低。
摘要
波动率风险溢价是指隐含波动率往往高于实际波动率,因为市场参与者往往高估了市场大幅崩盘的可能性。这种高估可能解释了作为股票投资组合保护的期权需求的增加。因此,这将提高这些期权的价格,并解释隐含波动率高于实际波动率的趋势。波动风险溢价的存在可以被利用为一种有利可图的策略,同时有助于分散风险,因为 S&P500 的空头期权头寸往往保持较低的贝塔系数。
参考
Marroni,l .,& Perdomo,I. (2014 年)。金融衍生品的定价和对冲:从业者指南。怀利。
纳滕贝格,S. (2015 年)。期权波动和定价:高级交易策略和技术。纽约:麦格劳-希尔教育公司。
Sullivan,r .,Israelov,r .,Ang,I .,& Tummala,h .理解波动风险溢价。2020 年 9 月 29 日检索,来自https://www . aqr . com/Insights/Research/White-Papers/Understanding-the-Volatility-Risk-Premium
什么是第三方风险评估,如何进行评估?
照片由 Cookie 在 Unsplash 上的 Pom 拍摄
如今,随着一些全球趋势的出现,保险公司和投资企业倾向于优先考虑第三方风险管理。也就是说,在价格上涨、依赖数字技术以及意识到许多组织违规行为都源自自身受到威胁的可信供应商的环境下,外包的速度加快了。
因此,第三方风险评估和风险管理计划变得势在必行。
什么是第三方风险评估?
要了解第三方风险评估的定义和必要性,首先要注意第三方风险的成因。各种组织根据其能力,将某些业务外包给第三方。这些第三方可能包括供应商、销售商、分包商、合同制造商、经销商、分销商、合作伙伴、受控公司或附属公司。
为什么有些组织会外包某些操作?
减少开支;加速生产、分配和销售;或者增加利润,这些都导致组织在各自的行业中具有竞争优势。最常见的情况是,组织进行外包,以使他们能够专注于自己的核心专业领域,并利用这些提供商的专业知识来整合到他们的整体产品中。
那么,一旦你有了这些第三方来支持你的服务产品,你如何为你的组织提出一个风险管理计划呢?
进入第三方风险评估,这将有助于您的组织评估每个第三方的风险程度(和条件)。通过精心设计的风险评估计划,您的企业将能够降低第三方对您的运营和发展带来的风险。
为什么要进行第三方风险评估?
创建和维护第三方关系与多种风险相关。
什么样的风险?
声誉、战略、管理、信息安全和经济负担。其他风险包括数据泄露、第三方非法使用信息、不合规造成的有害和破坏性影响,以及供应链管理中的违规行为。
特别是,工业经营的全球化导致第三方在世界各地出现。反过来,与运营和分销相关的风险也呈上升趋势。
在现代世界的任何地方,任何自然的、人为的或故意的干扰都会对企业的生产和服务产生负面影响。
如果跨国企业缺乏强有力的风险管理计划来应对此类第三方风险,它可能会遭受经济和声誉损失。这就产生了对有效的风险评估和风险管理的需求,并要求寻找有效的相关评估服务。
如何执行第三方风险评估
现在,您已经对风险管理、什么是第三方风险评估以及为什么应该进行第三方风险评估有了更好的理解,让我们来看看如何执行第三方风险评估的逐步过程。
1.建立供应商风险标准
创建供应商风险标准列表。它应该包括您的组织可能面临的最具破坏性的第三方风险。
例如,管理或外包机密数据的企业应该将各种信息安全风险作为其供应商风险标准的一部分。
反过来,这将告知您组织的风险评估范围。此外,它还会影响您的行动和策略,以及您将用于第三方或供应商风险评估的技术。基于这样的风险标准,您还可以缩小第三方或供应商的选择范围。
这将引导您进入风险管理计划的下一步:对供应商进行分类。基本上,您创建了一个可操作的高风险第三方列表,您将与他们一起执行风险评估。
2.进行第三方入职和筛选
为了预测和防范任何可能的风险,您必须详细了解第三方或供应商关系。第一步是在整个公司强制推行风险管理的标准流程。
专家建议您构建一个第三方风险管理计划,其框架将标准化所有第三方入职和筛选。如果可能,您还可以使用实时风险检查和遏制措施的全面方法。
为您的风险管理计划精心设计的框架提供了一个双赢的局面:
在风险评估之前,您可以及时了解任何可能的第三方风险(和有风险的供应商)。此外,您的风险管理计划框架将帮助您优化时间并进行深入的风险评估。
3.使风险评估更易于管理
由于您的评估质量将直接影响您的风险管理计划,您必须确保您的评估质量,简单的复选框评估是不够的。为此,您必须全面分析任何供应商是否有风险,为什么他们有风险,以及您(或他们)如何应对这些风险。
此后,与有风险的第三方的协议将保证细致和一致的监控。
接下来,您将需要专业的专家来帮助分析您收集的数据。例如,来自政策、技术、网络安全或会计背景的专业人员可以进行整体分析并发布详细报告。今天,强大的组织为这样的风险分析项目部署整个团队。
4.评估绩效结果,而不仅仅是风险
结果是您的第三方关系是否有风险以及有多大风险的症状。例如,信息安全评级将使您能够始终如一地监督供应商的合规性和不可预测的风险。
如果您与多个第三方签订了合同,记录他们的信息安全和合规性得分将会:
- 增强和简化第三方风险评估,
- 记录安全状态的任何错误;和
- 要求解决涉及第三方的风险问题。
5.利用技术的力量
资本和资源的可用性是进行供应商风险评估的基本前提。为了节省开支,您应该考虑购买和部署能够简化第三方风险评估和管理整个流程的软件。
作为一项提供评估服务的技术,它还将为您组织中的风险评估标准化一个跨部门框架。
技术利用对于进行全面彻底的风险评估和管理至关重要。
为什么?
原因有很多,包括:
- 它让你控制一个平台,通过这个平台,你可以定期监督任何数量的第三方和相关的风险。
- 它提高了您预测和分析内部和外部第三方风险的能力,同时影响了您的评估范围。
- 它有助于您通过多次评估收集和宏观分析关于第三方风险的可靠数据,这将增强您的组织对任何供应商的未来决策。
- 它使您能够衡量风险评估指标的有效性,这标志着您的数据的质量和可靠性。
准备好开始第三方风险评估了吗?
不管你的公司规模有多大,你都有可能与许多第三方保持业务关系,这些第三方将帮助你简化运营。
但是,与第三方交换运营数据和机密信息会使这些数据和信息容易被滥用和利用,从而增加风险。尤其是在相关方缺乏最佳信息安全措施或合规性的情况下。
这使得你有必要制定一个风险管理计划。
作为利益相关者,您有责任进行全面的第三方风险评估,以保护您的公司免受风险业务的影响,并在多个层面监督其运营标准和结果。
关于作者:
Steve Kosten 是 Cypress Data Defense 的首席安全顾问,也是“Java/JEE 中的 SANS DEV541 安全编码:开发可防御应用程序”课程的讲师。
什么是时间序列分解,它是如何工作的?
照片由 nutraveller 通过 Pixabay ( Pixabay 许可)
此外,我们还将深入了解使用 Python 的强大时间序列分解算法
时间序列可被视为由 4 个部分组成:
季节性成分
趋势成分
周期性成分
噪声成分。
季节性成分
季节性因素解释了人们在许多数据集中看到的周期性起伏,如下图所示。
在上面的例子中,季节周期大约为 12 个月,在 3 月达到高峰,在 11 月或 12 月触底,然后在 3 月再次达到高峰。
时间序列可以包含多个叠加的季节周期。一个经典的例子是气象站每小时温度的时间序列。由于地球绕地轴旋转,气象站的每小时温度图将显示 24 小时的季节周期。地球也以倾斜的方式围绕太阳旋转,导致了季节性的温度变化。如果你连续 365 天跟踪气象站上午 11 点的温度,你会看到第二种模式出现,其周期为 12 个月。24 小时长的日形态叠加在 12 个月长的年形态上。
在每小时天气数据的情况下,人们知道是什么潜在的物理现象导致了这两种季节模式。但在大多数情况下,不可能知道将季节性引入数据的所有因素是什么。因此,很难发现隐藏在时间序列中的所有季节周期。
也就是说,常见的季节周期是一天、一周、一月、一季(或一季)和一年。
季节性也可以在更长的时间尺度上观察到,例如太阳周期,它遵循大约 11 年的周期。
每日太阳黑子计数。数据来源: SILSO (图片由作者提供)
趋势组件
趋势部分指的是跨季节期间的数据模式。
下图所示的零售电子商务销售时间序列展示了一个可能的二次趋势( y = x ),该趋势跨越了长达 12 个月的季节周期:
周期性成分
周期性成分代表跨季节发生的现象。周期性模式不像季节性模式那样有固定的周期。周期性模式的一个例子是股票市场经历的对世界事件的繁荣和萧条的循环。
道琼斯收盘价比上一年(1880 年至 2020 年)的百分比变化。数据来源:【MeasuringWorth.com】T4via维基百科)(图片由作者)
周期性成分很难被分离出来,它常常被与趋势成分结合在一起而被“搁置”。
噪声成分
当你从时间序列中分离出季节性和趋势时,噪声或随机成分会留下来。噪音是你不知道或无法测量的因素的影响。这是已知的未知的影响,或未知的未知。
加法和乘法效应
趋势、季节性和噪声成分可以以加法或乘法的方式组合。
相加组合
如果季节和噪声分量改变趋势的量与趋势值无关,则趋势、季节和噪声分量被认为以相加的方式表现。这种情况可以表示如下:
y_i = t_i + s_i + n_i
其中 y_i =时间序列在第个时间步的值。
t_i =第与时间步的趋势分量。
s_i =第与时间步的季节分量。
n_i =第个时间步的噪声分量。
乘法组合 如果季节和噪声分量改变趋势的量取决于趋势的值,则这三个分量以乘法方式表现如下:
y_i = t_i * s_i * n_i
使用 Python 将时间序列分解为趋势、季节和噪声分量的分步过程
有许多可用的分解方法,从简单的基于移动平均的方法到强大的方法,如 STL。
在 Python 中, statsmodels 库有一个 seasonal_decompose() 方法,可以让你在一行代码中将时间序列分解成趋势、季节性和噪声。
在我的文章中,我们喜欢进入杂草中。所以在我们使用 seasonal_decompose() 之前,让我们深入了解一个简单而强大的时间序列分解技术。
让我们了解分解在幕后是如何工作的。
我们将手动将时间序列分解为趋势、季节和噪声成分,使用基于移动平均值的简单程序,步骤如下:
步骤 1:确定季节周期的长度
步骤 2:隔离趋势
步骤 3:隔离季节性+噪声
步骤 4:隔离季节性
步骤 5:隔离噪声
我们将以美国用户汽车经销商的零售销售时间序列为例:
让我们将数据加载到熊猫数据框架中,并绘制时间序列:
**import** pandas **as** pd
import numpy as np
import math
from matplotlib import pyplot as pltmydateparser = **lambda** x: pd.**datetime**.**strptime**(x, '%d-%m-%y')df = pd.**read_csv**('retail_sales_used_car_dealers_us_1992_2020.csv', **header**=0, **index_col**=0, **parse_dates**=['DATE'], **date_parser**=mydateparser)fig = plt.figure()fig.suptitle(**'Retail sales of used car dealers in the US in millions of dollars'**)df[**'Retail_Sales'**].plot()plt.show()
现在让我们开始逐步分解这个时间序列。
**第一步:**尝试猜测数据中季节性成分的持续时间。在上面的例子中,我们猜测是 12 个月。
**第二步:**现在运行一个以 12 个月移动平均线为中心的数据。这一移动平均值分布在总共 13 个月的时间里。即在中心月份的左侧和右侧各有 6 个月。以 12 个月为中心的移动平均线是两个移动平均线的平均值,两个移动平均线相差 1 个月,实际上是一个加权移动平均线。
下面举例说明了如何在 Microsoft Excel 中计算这种居中的 MA:
2 x 12 居中移动平均线的图示(图片由作者提供)
这种 MA 将消除季节性和噪音,并显示趋势。
继续我们的 Python 示例,下面是我们如何在 Python 中计算居中移动平均值:
****#Add an empty column to store the 2x12 centered MA values**
df[**'2 x 12 CMA (TREND)'**] = np.nan**#Fill it up with the 2x12 centered MA values
for** i **in** range(6,df[**'Retail_Sales'**].size-6):
df[**'2 x 12 CMA (TREND)'**][i] = np.round(
df[**'Retail_Sales'**][i - 6] * 1.0 / 24 +
(
df[**'Retail_Sales'**][i - 5] +
df[**'Retail_Sales'**][i - 4] +
df[**'Retail_Sales'**][i - 3] +
df[**'Retail_Sales'**][i - 2] +
df[**'Retail_Sales'**][i - 1] +
df[**'Retail_Sales'**][i] +
df[**'Retail_Sales'**][i + 1] +
df[**'Retail_Sales'**]i + 2] +
df[**'Retail_Sales'**][i + 3] +
df[**'Retail_Sales'**][i + 4] +
df[**'Retail_Sales'**][i + 5]
) * 1.0 / 12 +
df[**'Retail_Sales'**][i + 6] * 1.0 / 24**
请注意,索引【I-6】和【I+6】处的值是如何通过 1.0/24 进行加权的,而其余值是如何通过 1.0/12 进行加权的。
让我们绘制包含在列‘2 x 12 CMA(趋势)’:中的结果时间序列
*****#plot the trend component***fig = plt.figure()fig.suptitle(**'TREND component of Retail sales of used car dealers in the US in millions of dollars'**)df[**'2 x 12 CMA (TREND)'**].plot()plt.show()**
如您所见,我们的移动平均转换突出了零售时间序列的趋势部分:
(图片由作者提供)
第三步:现在我们要做一个决定。根据组成是乘法还是加法,我们将需要从原始时间序列中除以或减去趋势分量,以检索季节和噪声分量。如果我们检查原始的汽车销售时间序列,我们可以看到季节性波动与时间序列的当前值成比例增加。因此,我们将假设季节性是倍增的。我们还将大胆假设噪声是乘法噪声。****
因此,假定零售二手车销售时间序列具有以下乘法分解模型:
时间序列值=趋势分量季节分量噪声分量
因此:
季节性成分*噪声成分=时间序列值/趋势成分
我们将在数据框中添加一个新列,并使用上面的公式填充季节和噪声分量的乘积。
**df['SEASONALITY AND NOISE'] = df['Retail_Sales']/df['2 x 12 CMA (TREND)']**
让我们绘制新的列。这一次,我们将看到季节性和噪音通过:
**fig = plt.figure()fig.suptitle(**'SEASONALITY and NOISE components'**)plt.ylim(0, 1.3)df[**'SEASONALITY AND NOISE'**].plot()plt.show()**
(图片由作者提供)
步骤 4: 接下来,我们将通过计算所有一月、二月、三月等月份的季节性成分的平均值,从季节性和噪声的混合中获得“纯”季节性成分。
*****#first add a month column***df[**'MONTH'**] = df.index.strftime(**'%m'**).astype(np.int)***#initialize the month based dictionaries to store the running total of the month wise seasonal sums and counts*** average_seasonal_values = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0}average_seasonal_value_counts = {1:0, 2:0, 3:0, 4:0, 5:0, 6:0, 7:0, 8:0, 9:0, 10:0, 11:0, 12:0}***#calculate the sums and counts* for** i **in** range(0, df[**'SEASONALITY AND NOISE'**].size):
**if** math.isnan(df[**'SEASONALITY AND NOISE'**][i]) **is False**:
average_seasonal_values[df[**'MONTH'**][i]] =
average_seasonal_values[df[**'MONTH'**][i]] +
df[**'SEASONALITY AND NOISE'**][i] average_seasonal_value_counts[df[**'MONTH'**][i]] =
average_seasonal_value_counts[df[**'MONTH'**][i]] + 1***#calculate the average seasonal component for each month* for** i **in** range(1, 13):
average_seasonal_values[i] = average_seasonal_values[i] / average_seasonal_value_counts[i]***#create a new column in the data frame and fill it with the value of the average seasonal component for the corresponding month***df[**'SEASONALITY'**] = np.nan**for** i **in** range(0, df[**'SEASONALITY AND NOISE'**].size):
**if** math.isnan(df[**'SEASONALITY AND NOISE'**][i]) **is False**:
df[**'SEASONALITY'**][i] =
average_seasonal_values[df[**'MONTH'**][i]]**
让我们画出这个纯季节成分:
*****#plot the seasonal component*** fig = plt.figure()fig.suptitle(**'The \'pure\' SEASONAL component'**)plt.ylim(0, 1.3)df[**'SEASONALITY'**].plot()plt.show()**
(图片由作者提供)
****第五步:最后,我们将之前分离出的噪声季节值除以平均季节值,得出每个月的噪声分量。
噪声分量=噪声季节性分量/平均季节性分量
**df[**'NOISE'**] = df[**'SEASONALITY AND NOISE'**]/df[**'SEASONALITY'**]*#plot the seasonal component*fig = plt.figure()fig.suptitle(**'The NOISE component'**)plt.ylim(0, 1.3)df[**'NOISE'**].plot()plt.show()**
(图片由作者提供)
所以你有它!我们只是手工制作了将时间序列分解成趋势、季节和噪声成分的程序。
以下是时间序列及其组成部分的拼贴画:
(图片由作者提供)
使用 statsmodels 的时间序列分解
现在我们知道了分解是如何从内部工作的,我们可以稍微欺骗一下,在 statsmodels 中使用 seasonal_decompose()在一行代码中完成上述所有工作:
****from** statsmodels.tsa.seasonal **import** seasonal_decomposecomponents = **seasonal_decompose**(df['Retail_Sales'], **model**='multiplicative')components.**plot**()**
这是我们得到的图:
零售二手车销售数据集上的季节性分解()的输出(图片由作者提供)
以下是完整的 Python 源代码:
引用和版权
美国人口普查局,零售销售:二手车经销商[MRTSSM44112USN],检索自圣路易斯美联储银行弗雷德;https://fred.stlouisfed.org/series/MRTSSM44112USN,2020 年 6 月 17 日,根据弗雷德版权条款。
美国人口普查局,电子商务零售销售[ECOMNSA],从圣路易斯美联储银行检索;https://fred.stlouisfed.org/series/ECOMN,根据弗雷德版权条款。
SILSO,世界数据中心—太阳黑子数和长期太阳观测,比利时皇家天文台,在线太阳黑子数目录:http://www.sidc.be/SILSO/,1818–2020(CC-BY-NA
塞缪尔·h·威廉姆森,“美国 DJA 每日收盘价,1885 年至今”,MeasuringWorth,2020 年
网址:http://www.measuringworth.com/DJA/
本文中的所有图片版权归 Sachin Date 所有,版权归 CC-BY-NC-SA 所有,除非图片下面提到了不同的来源和版权。
感谢阅读!如果你喜欢这篇文章,请 关注我 获取关于时间序列分析的技巧、操作方法和编程建议。
什么是转置卷积层?
通过动画 gif 和 python 代码解释
转置卷积层也被(错误地)称为解卷积层。解卷积层与标准卷积层的操作相反,即如果通过标准卷积层生成的输出被解卷积,则可以恢复原始输入。转置卷积层类似于去卷积层,因为两者生成的空间维度是相同的。转置卷积不按值反转标准卷积,而是只按维度反转。
转置卷积层的功能与标准卷积层完全相同,只是对输入特征映射进行了修改。在解释相似性之前,我们先来看看标准卷积层是如何工作的。
标准卷积层:
大小为 ixi 的输入上的标准卷积层由以下两个参数定义。
- 填充***【p】:原输入周围填充的零的个数增加到(I+2 * p)x(I+2 * p)***
- 步幅 (s): 在输入图像上滑动时内核移动的量。
下图显示了卷积层如何分两步工作。
在第一步中,用零填充输入图像,而在第二步中,将内核放置在填充的输入上并滑动,生成作为内核和重叠输入区域的点积的输出像素。通过进行由步幅定义的大小的跳跃,内核滑过填充的输入。卷积层通常进行下采样,即输出的空间维度小于输入的空间维度。
下面的动画解释了卷积层在不同跨距和填充值下的工作原理。
对于给定尺寸的输入 (i) 、内核 (k) 、填充***§和步幅(s)***,输出特征图的尺寸由下式给出
转置卷积层:
另一方面,转置卷积层通常用于上采样,即生成空间维度大于输入特征图的输出特征图。正如标准卷积层一样,转置卷积层也是由填充和步幅定义的。padding 和 stride 的这些值是假设对输出执行以生成输入的值。也就是说,如果您获取输出,并执行定义了步幅和填充的标准卷积,它将生成与输入相同的空间维度。
实现转置卷积层可以更好地解释为 4 步过程
- 步骤 1: 计算新的参数 z 和 p’
- 第二步:在输入的每一行和每一列之间,插入 z 个零。这增加了输入到的大小(2 * I-1)×2 * I-1)
- 步骤 3: 用 p’个零填充修改后的输入图像
- 步骤 4: 以步长 1 对步骤 3 生成的图像进行标准卷积
完整的步骤如下图所示。
作者图片
下面的动画解释了卷积层在不同跨距和填充值下的工作原理。
对于给定尺寸的输入 (i) 、内核 (k) 、填充***§和步幅 (s) ,输出的尺寸特征图【o】***由下式给出
总结:
下表总结了两种卷积,标准卷积和转置卷积。
- 转置卷积背后的思想是执行可训练的上采样
- 转置卷积是标准卷积,但是具有修改的输入特征映射。
- 步幅和填充与并不对应于图像周围添加的零的数量以及在输入上滑动图像时内核的移动量,这与标准卷积运算中的情况不同。
Python 代码:
gif 是用 python 生成的。完整的代码可以在https://github.com/aqeelanwar/conv_layers_animation找到
奖金:
可以在下面的链接中找到这个主题和机器学习中许多其他重要主题的紧凑备忘单
ML 面试的视觉备忘单(www.cheatsheets.aqeel-anwar.com)
medium.com](https://medium.com/swlh/cheat-sheets-for-machine-learning-interview-topics-51c2bc2bab4f)
如果这篇文章对你有帮助,欢迎鼓掌、分享和回复。如果你想了解更多关于机器学习和数据科学的知识,请关注我@Aqeel an war或者在LinkedIn上与我联系。
机器学习中的矢量化是什么?
SpaceX 在 Unsplash 上拍摄的
使用矢量化让您的代码快速执行
您将学到的内容:
- 什么是矢量化?
- 矢量化在机器学习中有多重要?
- 示例:非矢量化与矢量化实现
- 矢量化实施的优势
- jupyter 笔记本演示
我第一次了解矢量化的概念是在 Coursera 平台上学习吴恩达教授的最著名的课程机器学习。
根据吴恩达教授的说法:
“执行矢量化的能力已经成为一项关键技能
所以,让我们学习这项技能,并将其纳入我们的工具箱:)
什么是矢量化?
构造化是一种可以让你的代码快速执行的技术。当你从零开始实现算法时,这是一个非常有趣和重要的优化算法的方法。
现在借助 C/C++、Octave/Matlab、Python、…等高度优化的数值线性代数库。我们可以让代码高效运行。
感谢专门做数值计算的人!
在本教程中,我们将使用:
**Numpy:**Python 中的快速数值计算库
矢量化在机器学习中有多重要?
就像在现实世界中,我们感兴趣的是以尽可能减少错误的方式有效地解决任何类型的问题。
在机器学习中,有一个优化算法的概念,它试图减少错误,并计算出机器学习模型的最佳参数。
因此,通过在优化算法中使用矢量化实现,我们可以使计算过程比非矢量化实现快得多。
优化算法的一个基本例子:梯度下降
现在让我们先玩玩 Numpy 来了解一下如何使用高度优化的计算库
Python List 和 Numpy 数组的性能比较
使用 Numpy:平均每循环花费 1.52 毫秒
没有 Numpy:平均每个循环花费了 69.9 毫秒
代码:
# With Python Listsa=list(range(1000000)) #10^6 numbers generated
%timeit [val + 5 for val in a] #Computing Element Wise Operation# With Numpy Arraysimport numpy as np
a=np.array(a) #Converting into numpy array type
%timeit a+5
range() : range 函数用于生成一段时间内的数字序列
%timeit :这是一个 ipython 神奇的函数,可以用来计时一段特定的代码。
非矢量化与矢量化实施
线性回归的假设函数
让我们使用线性回归的假设函数来理解矢量化的概念,其中θ表示权重/系数, x 表示特征
现在有两种方法可以实现上述功能:
- 使用 For 循环
- 使用矢量化
首先,让我们为θ和 x 向量生成随机数
n=10000# Generate n random numbers between 0 - 1
theta = np.random.rand(n)#Generate n random integers between 0 - 100
x = np.random.randint(0, 100, n)
现在观察非矢量化代码和矢量化代码之间的区别
对于循环与矢量化实现
两种实现给我们相同的输出,但问题是计算效率如何?
比较性能
非矢量化代码和矢量化代码的性能比较
使用未向量化的代码:平均每个循环花费 6.46 毫秒
**使用向量化代码:**平均每循环花费了 18.8 秒
代码:
# Unvectorizeddef unvectorized(n, theta, x):
prediction= 0.0
for j in range(n):
prediction= prediction + theta[j]*x[j]
return prediction# Vectorizeddef vectorized(theta, x):
prediction= 0.0
prediction = np.dot(theta.transpose() , x)
return prediction#Comparing Performance%timeit unvectorized(n, theta, x)
%timeit vectorized(theta, x)
矢量化实施的优势
- 我们的代码运行高效
- 我们的代码变得更加简单,易于调试
演示时间:)
Jupyter 笔记本电脑演示(非矢量化与矢量化实施)
源代码
本教程中使用的所有代码都可以在我的 GitHub 帐户上获得点击这里
埃米尔·佩龙在 Unsplash 上的照片
结论
在本教程中,您学习了矢量化技术,这是提高代码效率的方法之一。
下节课再见:)
接触
Gmail-> jalalmansoori19@gmail.com
github->https://github.com/jalalmansoori19
参考
- https://speaker deck . com/jakevdp/losing-your-loops-fast-numpy-pycon-2015
- 吴恩达教授在 Coursera 上的机器学习课程
XGBoost 是什么?以及如何优化?
来源:图片由 Free-Photos 来自 Pixabay
在机器学习和 Kaggle 竞赛的世界中,XGBoost 算法占据了第一位。
介绍
像许多数据科学家一样,XGBoost 现在是我工具箱的一部分。该算法是数据科学领域(真实世界或竞争)最流行的算法之一。它的多任务方面允许它在回归或分类项目中使用。它可以用于表格、结构化和非结构化数据。
GitHub 上有一个包含代码的笔记本。笔记本用于文件(文本)的分类。
XGBoost
XGBoost 或极端梯度提升是一种基于树的算法(Chen and Guestrin,2016[2])。XGBoost 是树家族(决策树、随机森林、装袋、提升、梯度提升)的一部分。
Boosting 是一种集合方法,主要目的是减少偏差和方差。目标是顺序创建弱树,以便每个新树(或学习者)关注前一个树的弱点(错误分类的数据)。在添加弱学习者之后,数据权重被重新调整,称为“重新加权”。由于每个新学习者加入后的自动校正,在收敛后整体形成一个强模型。
XGBoost 的强项是并行性和硬件优化。数据存储在内存中,称为块,并以压缩列[CSC]格式存储。该算法可以执行树修剪,以便以低概率移除分支。模型的损失函数中有一项通过正则化来惩罚模型的复杂性,以平滑学习过程(降低过拟合的可能性)。
该模型即使在缺失值或大量零值的情况下也能很好地执行稀疏感知。XGBoost 使用一种称为“加权分位数草图算法”的算法,这允许算法专注于错误分类的数据。每个新学习者的目标是学习如何在每次迭代后对错误数据进行分类。该方法允许您按分位数对数据进行排序,以便找到正确的分割点。这是ϵ参数的目标,也就是分割的值(ϵ=0.1;分位数=[10%,20%,…,90%])。
升压过程的迭代次数由具有集成交叉验证方法的算法自动确定。
作者提供了不同树算法的比较表:
陈和 Guestin,2016。第 7 页,表 1。
优化
XGBoost 具有超参数(估计器不学习的参数),必须通过参数优化来确定。这个过程很简单,每个要估计的参数由一个值列表表示,然后每个组合由模型进行测试,通过比较模型的度量来推断最佳组合。对参数的搜索需要通过交叉验证用指标来指导。不要害怕,[sklearn](https://scikit-learn.org/stable/index.html)
有两个功能可以帮你做到这一点:[RandomizedSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.RandomizedSearchCV.html)
和[GridSearchCV](https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.GridSearchCV.html?highlight=gridsearchcv#sklearn.model_selection.GridSearchCV)
。
网格搜索
网格搜索是一种尝试计算超参数最佳值的调整技术。这是通过算法的超参数空间的手动指定子集的详尽搜索。
随机搜索
第二种方法被认为更有效( Bergstra 和 Bengio,2012) [1],因为参数是随机选择的。随机搜索可以在连续和混合空间中使用,并且当只有少量超参数影响最终性能时非常有效。
这些方法怎么用?
笔记本
随机搜索
让我们从一个随机搜索开始。下面的代码显示了如何调用RandomizedSearchCV()
。要估计的超参数存储在字典中。XGBoost 可以在训练期间考虑其他超参数,如早期停止和验证集。您可以用在fit()
方法中传递的另一个字典来配置它们。
在接下来的代码中,我使用通过随机搜索获得的最佳参数(包含在变量best_params_)
中)来初始化网格搜索的字典。
网格搜索
在下面的代码*、中,您将找到网格搜索*的配置。如前所示,交叉验证固定在 3 倍。
结论
关于 XGBoost 的超参数优化的这篇(小型)教程到此结束。但是这些方法可以被每一个机器学习算法利用。请记住,这些优化方法在计算方面是昂贵的(上面的第一个代码生成 3000 次运行)。
你现在可以在工作或比赛中使用它了。尽情享受吧!
参考
[1] 詹姆斯·伯格斯特拉和约舒阿·本吉奥,2012 年。随机搜索超参数优化,机器学习研究杂志 13(2012)281–305
[2]陈天琦和卡洛斯·盖斯特林,2016。【https://arxiv.org/pdf/1603.02754.pdf】XGBoost:一个可扩展的树增强系统,
客户一生的价值是什么?
使用 Python 估算非订阅环境下客户的终身价值(LTV ),以设计适当的保留策略并最大限度地减少客户流失
米歇尔·汉德森在 Unsplash 上的照片
在我之前在发表的一篇文章中,我们讨论了生存分析技术来预测我们的客户何时会流失,以及针对客户的策略来最小化客户流失。这是在一个合同设置中,其中“死亡”是客户终止或不续订他们的订阅。
在本帖中,我们将着眼于购买直到你死(BTYD)类的统计模型,以分析非订阅业务模型中客户的行为和购买模式,以建模和预测客户的终身价值(CLV 或 LTV)。
什么是客户 LTV?
客户的终身价值是指公司在整个客户关系中(无论是在单个客户层面、群体层面还是整个客户群层面)预期从客户那里获得的净收入或收入总额,使用现金流贴现法(DCF)将其贴现为当前的美元价值。
根据可用的数据,LTV 可以代表总收入或净收入,即收入减去成本。使用收入数字通常不太麻烦,因为客户级别的历史销售数字很容易获得。然而,计算特定于客户的成本可能需要某些假设,这就有点主观臆断了。
为什么是 LTV?
在非合同商业模式中,公司与其客户之间没有合同或订阅协议(例如,电子商务或零售),我们可以在任何给定交易后停止购买。或者我们可以在 12 个月后回来重复购买。因此,没有明确的二进制事件来识别特定客户是否仍然活着。这使得实际上不可能通过逻辑回归或决策树有效地预测作为二元事件的流失。
在没有合同协议的情况下,分析我们的客户的更好方法是预测我们可以预期我们的客户在未来与我们一起消费的货币价值,以及预测的客户流失概率——给定他们的历史购买模式和行为。
请注意这里的区别:我们不知道在观察结束日期,客户是否已经发生了变化。因此,我们不能训练算法来预测在模型训练期间我们不可用的数据点(流失)。相反,流失概率将通过基于购买历史的其他统计和概率方法来确定。
BTYD 模型介绍
我们将利用以下两个统计和概率模型:贝塔几何/负二项分布(BG/NBD)模型和货币价值的伽马-伽马模型来分析历史客户购买行为数据和模式,并预测未来的购买频率和货币价值。这些模型已被经验证明优于传统方法,并遵循购买直到你死(BTYD)统计模型。
BG/NBD 模型预测预定义时期内的未来预期交易数量以及客户存活的概率。而 Gamma-Gamma 模型将结合到 BG/NBD 模型中,根据以预定贴现率贴现后的当前美元价值来预测购买的预期货币价值。
这两个模型都在 Python 的lifetimes
包中实现。
模型假设
在基本层面上,上述两个模型依赖于以下假设:
- 每个顾客有两个硬币:一个’购买硬币,决定其购买的概率,并由他连续投掷;以及决定退出且不再购买概率的“骰子硬币,每次购买后翻转一次
- 当处于活动状态时,客户进行的交易数量遵循泊松过程,交易率用λ表示(一个时间间隔内的预期交易数量)。简单来说,泊松过程是一系列离散事件,其中事件之间的平均时间是已知的,但事件的确切时间是随机的。下一个事件的发生独立于前一个事件。因此,在我们的案例中,客户是否会重复购买与其历史购买行为无关。这似乎违反直觉(从同一家企业多次购买的客户通常会再次购买),但在实证研究中却得到了很好的支持。
- 每个客户都有自己的购买硬币(有自己的正面和反面概率)
- 类似于“购买”硬币,每个客户都有自己的“死亡”硬币,每次交易后都有特定的存活概率
- 在每次交易后,顾客以概率
p
变得不活跃,即,在每次交易后,每个顾客将投掷第二个“骰子”硬币以确定他是否重复购买 - 交易率
λ
和退出概率p
在客户之间独立变化,分别遵循伽马和贝塔分布 - 客户特定交易的货币价值围绕其平均交易价值随机变化
- 不同客户的平均交易额各不相同,但任何特定个人的平均交易额不会随时间而变化
- 平均交易值在客户中的分布与交易过程无关
数据要求
BG/NBD 和 Gamma-Gamma 模型在客户层面只需要以下数据点:
- 最近度代表顾客最近一次购物的年龄。这等于客户第一次购买和最后一次购买之间的持续时间。因此,如果 X 女士只进行了一次购买,她的新近度将是 0。
- 频率代表客户进行重复购买的周期数。这意味着它比客户购买的总周期数少 1。如果使用天数作为单位,那么频率就是客户第一次购买后购买的天数(或任何时间段)。如果顾客只购买了一次,他的频率将是 0。此外,频率不考虑同一时间单位内的多次购买。因此,如果 Y 先生在第 1 天购买了两次,在第 3 天购买了三次,那么尽管每天购买了多次,他的频率仍然是 1。
- 时间表示无论选择什么时间单位,顾客的年龄。这等于客户第一次购买和研究期末之间的持续时间。
- 货币价值代表给定客户的重复购买的平均值,即所有重复购买的总和除以重复购买的时间单位总数。货币价值可以是利润、收入或任何其他金额,只要它是为每个客户一致计算的。
我们可以通过lifetimes
中一个叫做summary_data_from_transaction_data
的便利实用函数,从以下交易级数据(通常在内部报告系统中可用)中提取上述四个所需的数据点:
- 发票或交易日期
- 发票或交易货币价值
BG/NBD 和 Gamma-Gamma 模型在运行
我们将在项目中使用公开的电子商务零售数据。该数据集包含近三年间从英国一家在线零售公司购买的所有商品,可从此处下载。
原始数据的格式如下:
数据预处理
接下来,我们将执行以下步骤,将原始数据转换为所需的格式:
- 将
InvoiceDate
转换成日期时间格式,并从中提取日期值 - 删除缺少
Customer ID
的行,因为我们的分析将在单个客户级别进行 - 从
Quantity
字段中过滤出负值,因为这些值可能与客户退货有关,而与 LTV 预测无关 - 为每张发票(
Quantity x Price
)的Sales
新建一列,并过滤出lifetimes
:Customer ID
、InvoiceDate
、Sales
所需要的这些列 - 使用
summary_data_from_transaction_data
函数将我们的事务级数据转换成lifetimes
所需的汇总形式
生成的数据将采用以下形式:
客户# 12608 只购买了 1 次(没有重复),因此根据模型定义,其频率和最近次数都是 0,并且其年龄是 405 天(即,在分析中第一次购买和期末之间的持续时间)。货币价值也是 0,因为它是所有重复购买的平均值,因此忽略了唯一的一次购买。
另一方面,顾客# 12745 总共购买了两次,因此:
frequency
为 1,即 1 次重复购买recency
是两次购买之间的天数T
是首次购买和观察结束日期之间的天数monetary_value
是第二次购买的总价值,即唯一的重复购买。对于 1 次以上的重复购买,它将是所有重复购买的平均销售额
最后一个预处理步骤是排除我们没有重复购买的客户,即频率为 0。BG/NBD 和 Gamma-Gamma 模型都专注于对有重复交易的客户进行计算。如果我们考虑一下,对于一个只进行过一次历史购买的客户来说,用任何模型来预测未来交易的概率和货币价值都是相当具有挑战性的。否则,该模型将预测只有一次购买交易的客户仍然活着的概率为 100%,这是不现实的。
迄今完成的工作代码如下:
BG/NBD 模型培训和可视化
训练 BG/NBD 模型就像训练 scikit 中的任何其他 ML 算法一样——使用lifetimes.BetaGeoFitter()
的fit
方法学习。
lifetimes
有几个内置的效用函数来绘制和验证 BG/NBD 模型的内在假设:
lifetimes.plotting.plot_transaction_rate_heterogeneity
绘制λ(顾客购买倾向)的估计伽玛分布。理想情况下,这应该反映一种异质分布,即不集中在一个单一的值lifetimes.plotting.plot_dropout_rate_heterogeneity
绘制p
的估计贝塔分布,客户在交易后立即退出的概率(“骰子”)硬币。这也应该显示一种异质分布
尽管交易率在我们的数据中似乎是不均匀的,但退出概率的不均匀性较小,大多数值仅集中在小于 0.1 左右。一个潜在的原因可能是我们的数据中重复购买的客户数量较少——在更长的时间内收集更多的数据可能有利于我们的建模目的。然而,我们将继续我们的练习,看看它进展如何。
模型可视化
一旦 BG/NBD 模型经过训练,我们可以从以下图表中收集有用的见解:
频率/最近热度图
此热图显示了客户在下一个时间段可能进行的交易数量(默认值为 1,即第二天、第一周等。基于我们数据中的交易频率),给定模型参数:
我已经使用T = 7
作为函数的参数来分析未来 7 天的预期购买次数。
直观上,我们可以看到,高频率(多次重复购买)和新近性(最近最后一次重复购买)的客户在未来有望购买更多。我们的最佳客户位于热图的右下角,其特征是重复购买次数超过或等于 175 次,最近一次购买是在他们超过 1000 天时。
简而言之:
- 有多次重复购买(频率)和首次购买与最近一次购买之间有较长时间间隔(最近)的客户可能是未来的最佳客户
- 多次重复购买(频率)但第一次和最近一次购买(最近)的时间间隔较短的客户可能永远不会再回来
- 浅蓝色和绿色区域的客户很有兴趣,因为他们可能会回来购买,但我们仍然可以预计他们在接下来的七天内会购买大约 0.7 次。这些客户可能需要一点哄骗或推动才能回来购买更多
活动热图的概率
该热图显示了在给定模型参数的情况下,客户存活的概率:
无论客户是否经常购买,只要他们具有历史上较高的最近购买率(即,他们第一次购买和最近一次购买之间的时间间隔大于或等于 1000 天),其存活的可能性几乎为 1.0。
此外,新近度稍低的客户(即,最近一次购买是在他们第一次购买之后相对较短的时间段之后)即使没有进行大量的重复购买也具有较高的存活概率。
购买了大量商品但购买时间较短的客户很可能已经退出(右上象限)。
模型训练和可视化的代码如下:
英国天然气公司/NBD 模型验证
为了执行模型交叉验证,我们可以将事务数据划分为校准和维持数据集。然后,我们将使用维持数据集作为生产数据(在模型训练期间不可见),根据校准数据拟合新的血糖/NBD 模型,并比较维持期内重复购买的预测和实际数量。
在维持期内,实际重复购买次数和预测重复购买次数的平均值对比图揭示了以下情况:
在上面的图中:
- x 轴代表在校准期间观察到的频率值
- y 轴代表维持期的平均频率(蓝线)和模型预测的平均频率(橙线)
正如我们所见,在大约 15 次重复购买后,该模型可以非常准确地预测客户群的行为。对于更高的频率值,该模型确实产生了更多的误差,并且低估了平均重复购买量。如前所述,这很可能是因为我们的数据中有大量重复购买的客户数量相对较少。
英国天然气公司/NBD 模型验证代码:
伽马-伽马模型训练
现在,我们将根据我们的数据拟合 Gamma-Gamma 模型,根据每个客户的购买模式来计算他们未来可能的销售额。
没有比这更简单的了:
预测时间
现在我们已经训练好了两个模型,让我们在客户层面做一些预测。首先,我们将预测每位客户在未来 30 天(或您选择的任何其他天数)内的购买数量:
CustomerID 12748 预计将在接下来的 30 天内进行 5 到 6 次购买。
接下来,我们将计算客户存活的概率,并绘制其分布图:
分布图揭示了预期大多数客户有很高的存活可能性。在与业务和营销团队讨论之后,假设我们决定采用以下概率阈值来对客户进行分类:
- 如果活着的概率小于 0.5
- 如果存活的概率在 0.5 到 0.75 之间,则存在高流失风险
- 否则不搅动
我们得到以下计数:
接下来,我们将使用我们训练好的 Gamma-Gamma 模型来预测未来 12 个月的平均未来交易价值和 LTV,假设月贴现率为 0.01%。根据预期的 LTV,我们的前 20 名客户是:
现在,我们已经有了每个客户的估计流失率、未来购买价值和 ltv,这些客户在历史上都曾在我们这里购买过一次以上。
预测代码:
结论
现在,尽管我们没有与最有价值和风险最大的客户签订合同,但我们已经对他们有了一些可操作的见解。
完整的 Jupyter 笔记本可以在 GitHub 这里获得。
一如既往,如果您想讨论任何与数据分析、机器学习、金融和信贷风险分析相关的问题,请随时联系 me 。
下次见,继续!
参考
[1]法德尔,P. S .,哈迪,B. G. S .和李,Ka。(2005).简单的方法“计算你的顾客”:帕累托/NBD 模型的替代方案。营销科学。24.275–284.10.1287/mksc
[2]法德尔,P. S .和哈迪,B. G. S. (2013 年)。货币价值的伽玛-伽玛模型。从这里检索
你的样本量是多少?伪复制的危险
你的不确定性估计正确吗?
简单吧?在统计学入门课程中,样本量总是给定的。n = 1000。或者 n = 20。但在现实世界中,你得自己算出 n。
如果数据是平面的,那么 n 就是行数。简单。
但是现实世界的许多数据并不平坦。n 是什么?何谓爱情?狐狸说了什么?生命、宇宙、万物的意义是什么?这些都是让我夜不能寐的问题。
我们将从一个过于简单的例子开始。乍一看,问题“n 是什么?”听起来毫无用处,但是希望到最后你会发现这是一个普遍存在的实际商业问题。我们有一万行数据是很常见的,但是“样本大小”更接近于十。
“样本量”在不确定性的量化中起着直接的作用。一个点估计是不够的;什么是似是而非的数值范围?
平面数据
假设你想知道一所学校学生的平均身高。我是神谕,知道真实的平均身高是 167 cm,但你不知道。
你找到了 10 名志愿者,他们是正态分布人群中的代表性样本(嘿,我说想象一下)。你拿出卷尺,以厘米为单位记录下:
151 180 156 158 147 163 166 161 167 171
在这种情况下,很简单。n = 10,你可以在 162 附近建立一个 95%的置信区间(155,169)。167 在这个 CI 内。
在给定的设置下,95%的随机样本将产生包含 167 的 95% CI。
不平衡数据
你从折扣店买了你的卷尺,你被告知它被诅咒了:它提供的测量值稍微有些偏差,但平均来说是正确的。
未被描绘的:不可思议的恐怖。(来源)
它带有第二个卷尺,免费!第二个卷尺是也同样被诅咒。但是你可以选择颜色!
你选择黄色是因为你是个无趣的人。(来源)
当你宣布你将进行第二次测量时,一半的学生说他们上课会迟到并匆忙离开。您使用第二盘磁带记录了前五名学生的身高,所以现在您的数据看起来像
151 180 156 158 147 163 166 161 167 171
153 187 159 157 145
你有 10 个学生,但有 15 个测量值。这就是伪复制 —你收集了更多的数据,但是采样单位(学生)的数量不变。
你应该如何估计平均身高?如果你平均 15 次测量,那么有些学生会被重复计算。你的不确定性水平将会下降,因为你的观察不再独立。学生的三围取决于学生的真实身高。
正确的方法是取每个学生的平均测量值,这样你的数据看起来就像:
152 183.5 157.5 157.5 146 163 166 161 167 171
然后取平均值,得到 162.4 的估计值——可以说是平均值的平均值。(如果你没有为你的 A/B 测试这样做,你要么有一个 警告 问题,要么有一个更好更先进的方法。)但是如何建立置信区间呢?你更确定前五个值,但是我们要假装后五个值携带同样多的信息吗?
就此而言,n 是什么?模型的正确自由度是什么?我们无法回答这个问题(实际上,我们可以,但仅限于 iid 高斯误差),但最好假设 n=10,而不是 n=15。如果答案存在的话,我们希望它在 10 到 15 之间。我们稍后再讨论这个。
平衡数据
下课后,剩下的五个学生来找你进行第二次测量(嘿,他们是好人)。你疯狂地嘲笑你现在完整的数据集,你迫不及待地释放它的潜力来解开宇宙的秘密:
151 180 156 158 147 163 166 161 167 171
153 187 159 157 145 164 163 161 166 172
取所有观察值的平均值和标准差,构造 n = 20 的 95%置信区间,得到以 162.4 为中心的区间(157.6,167.1)。
图为:进行假设检验后的普通科学家。(来源)
然后闪电击中你,因为宇宙不想让这种错误的分析见天日。
怎么了?
假设您重复测量三次以上,并记录这些观察结果:
151 180 156 158 147 163 166 161 167 171
153 187 159 157 145 164 163 161 166 172
154 187 156 156 146 163 164 160 168 169
152 180 159 155 146 165 162 161 167 170
152 183 158 162 145 166 165 158 165 172
将这些视为 50 个独立的观察值(换句话说,忽略伪复制)将导致以 162.3 为中心的(159.4,165.1)的非常窄的 95% CI。167 的真正价值远在 CI 之外。
如果你对不同的学生重复这个设置,167 将会比期望的 5%的时间更多地位于区间之外。
问题是:你在观察同样的 10 个学生。为什么一遍又一遍地看到它们会让你更加确信人口意味着什么?如果这行得通,当人们可以多次盯着同一个东西看时,为什么还要花这么多钱来收集数据呢?
鉴于测量误差来自相同的正态分布(即误差为高斯分布,与学生的真实身高无关),正确的方法是取平均值的平均值:
152.4 183.4 157.6 157.6 145.8 164.2 164.0 160.2 166.6 170.8
因为我们只观察了 10 名学生,所以我们构造了 n = 10 的 95%置信区间,得到以 162.3 为中心的(154.9,169.7)。
事实上,数据很少是平衡的。即使你建立了一个最终目标是获得平衡数据的研究,参与者也可能会退出。
如果加粗的误差假设不合理(例如二进制结果),那么我们不能这样做,必须使用更复杂的模型:
贝叶斯机器学习来拯救!
在其核心,贝叶斯 ML 处理伪复制(虽然它也适用于平面数据)。
这听起来并不显著,直到您意识到绝大多数数据都遭受伪复制。企业有回头客,并(希望)从每个客户那里进行多次测量。研究可能希望随着时间的推移跟踪同一批人。
数据的层次结构
还记得我们如何将 15 个观察压缩成 n=10 个吗?你可以有十几家商店,每家都有数千名顾客,但是一旦有人提出一些问题(“促销的平均提升是多少?”),你实际上必须将 10,000 个观察值压缩成 n=12 个。要么这样,要么你必须假装你的从属观察是独立的。不太漂亮。
大多数流行的机器学习算法(xgboost、随机森林、GLM 等。)本身不处理伪复制。有两种可能的选择。可以在交叉验证中适当随机化折叠(来自同一个学生的观察永远不要去不同的折叠!)并希望结果可以一般化。或者,您可以汇总数据(例如,按学生计算测量值的平均值)并丢弃一些信息。
下面是我用来生成上述数据的 R 代码:
num_students <- 10
num_pseudoreps <- 5set.seed(12)
height <- rnorm(num_students, 167, 10)
meas <- matrix(0, nrow = num_pseudoreps, ncol = num_students)
for(i in 1:num_pseudoreps){
meas[i,] <- round(height + rnorm(num_students, 0, 2))
}
为了得到类似频率主义者的估计,我将使用具有极弱/均匀先验的 MCMC 来拟合一个随机效应模型。在实践中,这些先验知识不应该在基本例子之外使用。
library(rstan)balanced <- data.frame(
student = sort(rep(1:num_students, num_pseudoreps)),
measured = as.numeric(meas)
)
unbalanced <- data.frame(
student = c(1:10, 1:5),
measured = c(meas[1,], meas[2, 1:5])
)model <- stan_model(model_code = '
data {
int<lower=0> N;
int<lower=0> S;
real y[N];
int<lower=1, upper = S> students[N];
}
parameters {
real mu;
vector[S] mu_s;
real<lower=0> pop_sigma;
real<lower=0> meas_sigma;
}
model {
mu ~ normal(0, 10000);
pop_sigma ~ uniform(0, 1000);
meas_sigma ~ uniform(0, 1000);
mu_s ~ normal(mu, pop_sigma);
y ~ normal(mu_s[students], meas_sigma);
}
')set.seed(1)
mcmc <- sampling(
model,
data = list(
N = nrow(balanced),
S = num_students,
y = balanced$measured,
students = balanced$student
),
iter = 5000
)
posterior <- mcmc@sim$samples[[4]]$mu[1001:5000]
使用具有 50 个观察值的平衡数据,后验分布具有(154.2,170.2)的 95%可信区间和 162.3 的平均值。这比我们之前得到的 CI 略宽,部分是因为我们估计了一个额外的讨厌的参数:测量误差。
神奇发生在不平衡的情况下。95%可信区间是(154.4,170.0),我们不必猜测使用什么 n。在这个示例中,好处并不明显,因为我们正在使用忽略伪复制是最不有害的设置。
然而,当我们越来越远离舒适的:
*高斯分布(如二元结果、严重偏斜的人口分布)
不相关的参数(例如,忠诚客户可能会访问更多的和*花费更多)
*有些平衡的数据(例如,一些客户一周访问 100 次,而另一些客户只访问一次)
采用平均值会给出越来越差的结果。(查看我的 GLM 文章以了解精确加权平均值的细节。)
铁是羽加迪姆 leviosa。(来源
直觉上,这是因为平均值假装所有的抽样单位具有相等的权重,即使它们并不相等。
考虑到一些最普遍的指标是百分比(例如转化率)或极度右偏(例如平均支出),贝叶斯机器学习在每个组织中都有一席之地。
最后,如果你经常需要在工作中进行统计推断,可以考虑将贝叶斯机器学习作为你工具箱的核心部分。它们实际上是为解决真实数据中普遍存在的伪复制问题而设计的。
“清理”数据和“训练”机器学习算法意味着什么
奥利弗·黑尔在 Unsplash 上拍摄的照片
在计算机和人工智能的上下文中理解术语“干净”和“训练”
为了避免在人工智能项目上浪费大量的时间和金钱,经理们必须对数据是如何处理的有很强的理解。数据处理包括数据科学家采取行动,将肮脏的真实世界数据转化为干净、可理解的数据。只有当数据没有错误并且格式正确时,机器学习算法才能提供有效的结果和预测。正如生活中的许多事情一样,“垃圾进来等于垃圾出去。”
数据处理的一部分包括搜索异常值或不可能的数据点并检查它们。例如,数据集包括客户的出生日期。过滤此数据以检查超过 90 或 100 岁的出生日期可能会显示出生年份在 19 世纪的数据点。然后,数据科学家可以删除这些数据点以避免混淆模型。
数据处理的另一个重要部分是处理缺失值。数据集通常不完整,数据科学家必须决定删除包含缺失元素的整个条目,或者他们可以插入一个占位符(可能使用中间值或最频繁值)。如果数据科学家确定数据集中有太多缺失值,经理必须决定收集更多数据、继续处理当前数据还是终止项目是否划算。做出这一决定时,应充分了解收集或不收集的成本,以及新数据具有当前数据集所缺乏的完整性的可能性。
一旦经理与数据科学家沟通并确定数据质量令人满意,可以开始培训!这就是机器学习术语可能引起混淆的地方。数据科学家不是拿着秒表和哨子站在他的电脑旁,对着数据大喊让他跑得更快。相反,他们编写几行代码将数据集一分为二。一组称为“训练组”,另一组称为“测试组”。通常在训练集中使用 80%的数据,在测试集中使用 20%的数据。
正如人们可能认为的那样,训练模型发生在训练集上。这意味着算法在集合中的所有数据点上运行,并且它输出将用于预测或分类未来数据点的公式或方法。一旦数据科学家对输出结果感到满意,并对模型进行微调,就该对其进行测试了。
由于测试集中的数据点不同于定型集,测试将确定模型归纳新数据的能力。通过在测试集上运行新模型,数据科学家可以将训练集的实际输出值(或标签)与模型的预测输出值进行比较。当模型的输出与实际输出相比合理时,泛化误差低,并且模型对新数据反应良好。
由于泛化误差较高,该模型很好地学习了训练数据,但在实际生活中不会有用。该模型不能从表示训练集中没有的新情况的数据中提供有用的输出。为了避免训练具有高泛化错误的模型,数据科学家可以使用更复杂的拆分。他们可以运行一种算法,识别彼此最相似的数据点(在数据集中称为片段),并确保来自每个片段的相同数量的数据点在测试集和训练集中。这有助于确保两个数据集中的数据代表总体数据。
虽然上述大部分工作是由数据科学家承担的,但经理们可以通过理解数据处理和培训的高层次方面,为人工智能项目增加难以置信的价值。最终,经理是决策者,掌握数据对模型生产影响的高级专业知识有助于做出更好的决策。
关联需要什么
以及在我们的分析中如何解释它
舒伊布·阿卜尔哈萨尼在 Unsplash 上拍摄的照片
相关性(确切地说是统计学上的相关性)是对两个变量之间相互关系的一种度量,不管它们是不是因果关系。这种程度的测量可以在任何类型的数据上进行(连续的和连续的,分类的和分类的,连续的和分类的)。尽管相关性说明了它是如何衡量相互关系的,但相关性度量的存在并不能为因果关系提供有力的证据。这意味着相关性并不意味着因果关系。那么相关性是如何有用的呢?
相关性是有用的,因为它可以表明实践中可以利用的预测关系。例如,一天中温度越高,卖冰淇淋的次数越多。这也可能意味着因果关系,因为当天气较热时,人们倾向于购买冰淇淋,而当天气较冷时。然而,就像我之前陈述的那样;大多数时候,相关性并不意味着任何因果关系。
在我们进入相关性和它如何计算之前,让我展示一下协方差的概念。
协方差
在统计学中,协方差是变量 X 和 y 之间关联的度量,确切地说,它度量的是变量的线性关系趋势。这里我将展示协方差是如何计算的。
协方差的计算方法是将变量的每个成员减去其平均值(以数据为中心)。将这些居中的分数相乘,以测量一个变量的增加或减少是否与另一个变量相关联。最后,计算这些居中分数的期望值( E )作为关联的汇总。另一项中的期望值本身就是平均值或均值( μ) 。
协方差的问题在于,X 和 Y 可以取各自范围内的任何值。这模糊了解释过程,并且使得相互之间的协方差比较变得不可能。例如, Cov ( X , Y ) = 7 和 Cov ( A , B ) = 5 会告诉我们这些对分别是正相关的,但是很难判断 X 和 Y 之间的关系是否强于 A 和 B 这就是相关性变得有用的地方-通过数据中的可变性测量来标准化协方差,它将产生具有直观解释和一致尺度的产品。
现在,让我们完成第一个关联。
皮尔逊相关系数
皮尔逊相关是数据分析过程中最常用的相关之一。皮尔逊相关度量变量连续 X 和变量连续 Y 之间的线性关系,其值介于 1 和-1 之间。换句话说,皮尔逊相关系数通过一条线来衡量两个变量之间的关系。
让我们看看皮尔逊相关系数是如何计算的。
如果你注意到,分数方程的上边(分子)类似于我们之前讨论的协方差方程。这意味着我们也可以将皮尔逊相关系数表述如下。
上面的等式表明协方差除以 X 标准偏差(σX)和 Y 标准偏差(σY)的乘积。标准差的除法过程是为了标准化我们的数据,并确保相关值落在 1 比 1 的范围内。这简化了我们的相关性解释。那么,我们如何解释皮尔逊相关性呢?
当相关系数接近值 1 时,意味着变量 X 和 y 之间存在正关系,正关系表示一个变量的增加与另一个变量的增加相关。另一方面,相关系数越接近-1 就意味着存在一种负相关关系,即一个变量的增加会导致另一个变量的减少。如果 X 和 Y 是独立的,那么相关系数接近于 0 ,尽管即使两个变量之间有很强的关系,皮尔逊相关也可能很小。
如果你从上面的解释中意识到,实际上皮尔逊相关系数和回归线的斜率之间有明显的联系。首先,让我展示一个带有回归线的散点图的例子。
在上图中,回归线是最佳的,因为它使所有点到回归线的距离最小。由于这一特性, Y 和 X 的回归线的斜率在数学上等价于 X 和 *Y、*之间的相关性,通过它们的标准偏差来标准化。
换句话说,皮尔逊相关系数反映了两个变量之间的关联性和可变性。这一特性也意味着皮尔逊相关易受异常值的影响。
这种与直线斜率的关系说明了为什么皮尔逊相关性描述了线性关系,以及为什么相关性在预测建模中很重要。
如果我们想测量变量之间的非线性关系呢?接下来我会展示一些其他的测量方法来描述这种非线性关系。
斯皮尔曼等级相关
与皮尔逊相关系数不同,斯皮尔曼等级相关测量两个变量之间的单调关系(严格地增加或减少,而不是两者都增加),并通过值的等级顺序来测量。尽管 Spearman 秩相关法仍然适用于离散的顺序变量,但仍然可以测量连续变量 X 和连续变量 Y 之间的相关性。
这里我们根据数据等级而不是分数来计算 Spearman 等级相关性。这意味着我们计算数据秩和秩标准差之间的协方差。如果所有的秩是唯一的或者秩之间没有联系,我们可以将等式简化如下。
其中 n 是观察次数,d 是秩差。这个公式只有在没有领带的情况下才严格使用。
Spearman 等级相关可以类似地解释为 Pearson 相关系数,因为它们的值在-1 到 1 之间。得分越接近 1 意味着变量之间存在正单调关系(数据不断增加),反之亦然。如果变量 X 和变量 Y 独立,则值将为等于 0 。
当我们谈论等级时,等级到底是什么?下面是我从维基百科上获得的一个排名过程的例子。
更容易理解排名的方法是,我们将数据从最小到最大排序,并根据数据顺序分配排名。1 是最小的等级,这意味着等级 1 被分配给相应列的最小值。为什么是各自的专栏?从上表中我们可以看出,我们根据各自的列对数据进行排序,因为我们想知道列 X 和列 Y 的排序之间的协方差;我们给每一列分配等级。准确的说,我们要的是每行之间的排名差。
皮尔逊和斯皮尔曼相关性之间的差异在下图中得到最好的说明。
皮尔逊相关与斯皮尔曼等级相关
因为我们的上述数据显示了完美的正单调关系(数据总是增加)和非线性关系;我们的 Spearman 相关等于 1。在这种情况下,皮尔逊关系较弱,但仍然显示出很强的相关性,因为数据之间存在部分线性关系。
肯德尔τ秩相关
另一种测量变量之间非线性关系的方法是应用肯德尔的 Tau 等级相关性。Kendall Tau 等级相关系数衡量给予同一组对象的两组等级之间的相似程度。然而,与 Spearman 系数不同,Kendall Tau 只测量方向一致性,而不测量等级差异。因此,这个系数更适合于离散数据。下面是我们如何测量肯德尔τ相关性。
其中和谐对是等级一致的值对(( x 1, y 1),( x 2,y2)):x1<x2 和 y 1 < y 2 或 x 1 > x 2 和不和谐对是不遵循这些的等级对
从上面的等式中,我们可以看出,测量值取决于物体对的反转次数。为了评估它们,每个等级顺序由所有对象对的集合来表示(例如,[a,b]和[b,a]是表示对象 a 和 b 的两对)。让我们使用一个样本数据集来衡量我们的相关性。
数据集示例
上面是一个样本数据集,在各自的列中有排名。我们需要根据之前的规则来计算一致对和不一致对的数量。(1,2)和(2,7)是 1 <2 and 2<7 while (1,2) and (4,1) are discordant pairs because 1 < 4 but 2 > 1 的整合对。如果是我们的数据集示例,对应对是:
- (1,2)和(2,7)
- (1,2)和(3,5)
不和谐的一对是:
- (1,2)和(4,1)
- (2,7)和(3,5)
- (2,7)和(4,1)
- (3.5)和(4.1)
这意味着我们有 2 个一致对和 4 个不一致对。使用前面的等式 2–4/(4(4–1)/2)将得到-0.33。
Kendall Tau 将取 1 到+1 之间的值,其中值越接近 1 表示当一个等级顺序与另一个等级顺序完全相反和时,值越接近+1 表示两个等级顺序相同。Kendall Tau 相关性也可以解释为处于相同顺序(一致)的对象的概率与处于不同顺序(不一致)的观察之间的概率差。
肯德尔τ适用于我们想知道变量的顺序是否相似的情况;尤其是如果我们的数据是离散的。然而,还有其他方法来测量离散变量相关性( Shaked Zychlinski 已经写了一篇关于它的很好的文章这里但是我想更详细地阐述它)
克莱姆的 V 型
克莱姆 V 是两个离散变量之间关联的度量。测量基于皮尔逊卡方统计,输出范围在 0 到 1 之间;值越接近 0 表示两个变量之间的关联越少而 1 表示两个变量之间的关联越强。没有负(-)值作为输出,因为不存在负关联。克莱姆的 V 计算是用下面的公式计算的。
其中,χ是卡方统计量,n 是观察值的数量,k 是列数,r 是行数。
因为 Cramer 的 V 过高估计了关联强度(卡方统计值倾向于随着行和列的数量之间的差异的增加而增加),我们需要纠正偏差。这是通过下面的等式完成的。
在哪里
数据集示例
幸运的是,python 中的 scipy 和 pandas 模块为我们提供了一种计算所有数字的简单方法。在我的例子中,我将使用 seaborn 的 tips 样本数据集。
#Importing the important module
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns#Load the dataset
tips = sns.load_dataset('tips')#Creating new category based on the tip feature (0: tip below 3 and 1 tip equal or more than 3)tips['tip_category'] = tips['tip'].apply(lambda x: 1 if x>3 else 0)
假设我们想知道 total_bill 和 tip 特性之间的关系。用熊猫的方法。corr,我们可以在几秒钟内测量我们的相关性。熊猫。corr 方法只提供 3 种相关度量;皮尔森,斯皮尔曼和肯德尔。
#Using the .corr method from pandas, default is Pearson Corellation
tips[['total_bill', 'tip']].corr()
total_bill 与小费变量之间的皮尔逊相关系数
tips['total_bill', 'tip']].corr('spearman')
total_bill 与小费变量之间的 Spearman 等级相关性
如果我们需要相关结果作为统计假设测试,我们可以使用 scipy 模块中的函数来计算。
from scipy.stats import pearsonr, spearmanrpearsonr(tips['total_bill'], tips['tip'])
#Output: (0.6757341092113647, 6.6924706468630016e-34)spearmanr(tips['total_bill'], tips['tip'])
#Output: SpearmanrResult(correlation=0.6789681219001009, pvalue=2.501158440923619e-34)#Where the first number represent the Correlation Coefficient and #the second number represent the p-value.
在相关分析中,我们可以检验变量之间是否存在关系的统计假设。正式的说法是:
- H0:变量 X 和变量 Y 之间没有统计学上的显著关系
- H1:变量 X 和变量 Y 之间有一种统计上的显著关系
就像任何其他假设检验一样,我们基于 p 值评估我们的假设。通常,我们将 alpha 水平设置为 95%,这意味着如果 p 值低于 0.05,那么我们拒绝 H0,接受 H1。在这种情况下,H0 是相似的,如果我们说变量 X 和变量 Y 是独立的。
我们也可以用类似于上面的方法计算肯德尔τ相关性。如前所述,Kendall Tau 相关性更适合应用于离散变量,为此,我举一个大小和 tip_category 之间关系的例子。
tips[['size', 'tip_category']].corr('kendall')
Kendall Tau 尺寸和小费之间的相关性 _ 类别
from scipy.stats import kendalltaukendalltau(tips['size'], tips['tip_category'])
#Output: KendalltauResult(correlation=0.3528363722264162, pvalue=6.456364135002584e-09)
计算克莱姆的 V 需要一个额外的模块,校正偏差版本需要我们自己定义。对于未校正的版本,我们可以使用 researchpy 模块来帮助计算我们的 Cramer’s V。让我们将其应用于性别和大小变量之间的关系。
pip install researchpy #only if you never have this module beforefrom researchpy import crosstab
cross, res = crosstab(tips['sex'], tips['size'], test = 'chi-square')
res
使用 researchpy,我们可以获得关于统计测试和相关性分析的信息。尽管如我之前所说,它还没有修正,这意味着它高估了关联强度。出于这个原因,我会使用之前由 Shaked Zychlinski 定义的偏差校正的 Cramer V 函数。
def cramers_v(x, y):
import scipy.stats as ss
confusion_matrix = pd.crosstab(x,y)
chi2 = ss.chi2_contingency(confusion_matrix)[0]
n = confusion_matrix.sum().sum()
phi2 = chi2/n
r,k = confusion_matrix.shape
phi2corr = max(0, phi2-((k-1)*(r-1))/(n-1))
rcorr = r-((r-1)**2)/(n-1)
kcorr = k-((k-1)**2)/(n-1)
return np.sqrt(phi2corr/min((kcorr-1),(rcorr-1)))cramers_v(tips['sex'], tips['size'])
#output: 0.058202656344848294
正如我们在上面看到的,修正和未修正版本之间的关联强度是不同的。
结论
我已经展示了几种测量变量之间关系的方法,以及我们如何解释这种测量。
得出相关值之间存在因果关系的结论是很诱人的,但正如许多人以前说过的那样,“相关性并不意味着因果关系”。事情可能不像数字显示的那样简单。在我们得出任何结论之前,我们需要批判性思维来剖析我们从这种相关性中获得的信息。
如果你喜欢我的内容,并想获得更多关于数据或作为数据科学家的日常生活的深入知识,请考虑在这里订阅我的时事通讯。
如果您没有订阅为中等会员,请考虑通过我的推荐订阅。
部署一个模型需要什么
将机器学习模型投入生产时的基本步骤和最佳实践
图片由 Pixabay 的 Mudassar Iqbal 提供
所以你(或你的团队)花了几个月的时间在笔记本上摆弄代码。您已经失眠了,不知道是否应该使用 Word2Vec 或 BERT 来矢量化您的文本输入。你已经在几十个(不,几百个?真的,几千?)连续几天,你终于达到了你想要的那种甜美的准确度。这种满足感就是你从事数据科学工作的原因。你手里拿着宝贵的 model.pickle 文件。你知道你的公司会通过使用它获得大量的金钱,但是你可能没有意识到这是最容易失败的时刻。不幸的是,许多模型无法投入生产。例如,2009 年 4 月,网飞组织了一场奖金为 100 万美元的 Kaggle 竞赛,但获胜的模型从未投入生产![1].所有这些工作和准确性只有在一天结束时有人能够真正使用该模型时才会有回报——稳定、可靠、快速和大规模地产生价值。
那么,实际部署一个模型需要什么呢?下面是一个部署路径的一些基本步骤和注意事项,当您的模型从研发转换到生产时,请记住这些步骤和注意事项。
1.将您的模型包装在 Web 服务器中
当然,许多人使用手动部署选项。每当需要做出新的预测时,您的队友可以手动运行该模型。但是这种方法很可能无法满足您的业务需求。作为自动化的第一步,您可以创建一个简短的脚本来加载您的模型并对新数据进行评分,但是每次您需要预测时,您都会浪费时间来加载和重新加载您的模型,这可能不是一个微不足道的损失。
这个挑战的一个解决方案是用一个简单的 web 服务器来包装您的模型。web 服务器会将您的模型加载到内存中,并能够以较低的延迟立即提供预测。对于大多数语言来说,有很多关于如何编写 web 服务器的教程。
想得更远一些,您还应该问自己:这个服务器会一直只托管一个模型吗?或者以后,您需要一起托管多个模型吗?
2.改进您的 Web 服务器
现在你有了一个 web 服务器,你必须问自己如果它崩溃了会发生什么?您的模型有望为高影响力的业务流程提供动力,并且为不同事件建立应急计划至关重要。可能会发生运行时异常。您可能在某个地方有内存泄漏,这导致您的预测评分过程最终在内存耗尽时被终止。您不希望晚上在紧急情况下醒来重新启动它,所以最好提前考虑并围绕您部署的单独运行的模型开发流程管理。它将处理自动重启,并提供报告机制来传达服务的实时状态。
3.托管您的 Web 服务器
既然您已经有了本地运行的模型,并且运行稳定,那么您需要向世界公开它。您的公司是在裸机上托管软件,还是依赖某个云提供商?在任何情况下,您都需要将您的服务器托管在某个地方。您关于托管的决定应该取决于模型的公共可用性。您的模型是公开提供给客户,还是仅在您的内部网络中提供?如果模型是公开可用的,您需要为 web 服务器建立一个授权机制,以限制恶意用户的访问。
任何软件都需要更新,所以一旦你的网络服务器被托管在某个地方,你需要一些更新它的过程。当更改完成后,您需要测试服务是否继续工作。为了实现这一点并确保您团队的生产力,您应该建立某种形式的持续集成/持续交付管道。
4.高可用性服务
高可用性 ( HA )是衡量系统运行性能水平的一个特征。它通常以正常运行时间的百分比来衡量。“两个 9”或 99%的正常运行时间意味着您的服务在一年中有 88 小时不可用。问问你自己:如果你的模型宕机 88 小时,会对你的业务造成多大影响?
大多数 web 服务在 HA 上提供服务级别协议。但是,即使达到三个 9(99.9%)的正常运行时间也非常困难。您的 web 服务器的主机可能会关闭。托管它的数据中心可能会停电。高可用性的基础之一是消除单点故障[2]。要做到这一点,您需要拥有模型的多个副本,并在它们之间保持平衡。请记住,在地理上分散它们将减少失败的数量。为了能够适应不断变化的负载并优化托管成本,能够扩大和减少副本的数量非常重要。
5.监视
即使采取了前面所有的步骤,仍有可能出错。也许您的服务器的所有节点都关闭了,或者您的测试管道没有发现一个 bug。为了能够对这种紧急情况做出反应,您需要对您的服务进行监控和警报。收集服务日志将有助于在此类问题发生后发现其根本原因。
为了使您的服务更新建立在科学决策的基础上,您需要收集关于您的服务当前如何运行的数据。你不应该说你的模式“慢”;相反,您应该精确,并根据响应时间的中间值或其他重要的百分位数进行操作。你不应该说你的服务“太失败了”;相反,您应该有准确的失败请求百分比作为基准。
6.更多监控?!
但是仅仅监控服务对于我们的用例来说是不够的。一旦你将一个模型投入生产,它就开始退化。大多数情况下,这与您的模型预测的数据漂移有关。为了在一段时间内提供准确的预测,您需要监控模型的性能。最流行的技术包括监控模型的输入变量、预测和准确性。想象一个使用美元价格作为输入的模型,假设由于一个错误,发送了乌克兰格里夫纳的价格。该模型将照常处理请求,因为它仍然是一个数字特性,但是您的预测将非常不同,因为该数字现在大了 30 倍。
您需要设置明确的阈值,以确定模型何时发生漂移,并在模型预测准确度较低时发出警报。这些通知与关于服务健康的通知一样重要。
7.再训练
一旦您清楚地知道您的模型预测不佳,您就需要用更多的最新数据来更新您的模型。我们之前提到的 CI/CD 管道可以方便地持续更新您的模型。为了重新训练模型,您将需要更新的、最近的标记的数据,因此您还需要一个过程来收集新的标记数据。小心不要注入过多的历史数据,因为如果最近的数据与历史数据相差太大,模型的效果可能会更差。您可以将最近的数据优先于历史数据。
另一个有趣的方面是,对于全新的数据,不同的 ML 算法可能会执行得更好。你应该不时地考虑不只是重新训练相同的算法,而是用其他算法进行实验。或者你可以更进一步,每次更新时,试着自动适应不同的型号并选择最好的型号。
现在,我们已经从一种模式转变为一种可持续的服务。虽然这并没有涵盖所有内容,但我希望它能为您提供基本需求和最佳实践的全面概述。
参考资料:
[1]迈克·马斯尼克(Mike Masnick),为什么网飞从未实现赢得网飞 100 万美元挑战赛(2012)的算法,tech dirt:https://www . tech dirt . com/articles/2012 04 09/03412518422/Why-网飞-Never-Implemented-Algorithm-That-Won-网飞-100 万-challenge.shtml
[2]布雷克·索恩(Blake Thorne),四个九及更高:高可用性基础设施指南(2018),Atlassian 博客:【https://www.atlassian.com/blog/statuspage/high-availability
[3] Alexandre Gonfalonieri,为什么机器学习模型在生产中退化(2019),走向数据科学:
https://towards data science . com/why-machine-learning-models-degrade-in-production-d0f 2108 e 9214
我从机器学习的 CI/CD 中学到了什么
了解为什么经常重新训练机器学习模型是必要的,以及如何为文本分类模型建立 CI/CD 管道
用模型给出的概率分布度量概念漂移。
大多数软件开发团队已经采用持续集成和交付(CI/CD)来更快地迭代。然而,机器学习模型不仅依赖于代码,还依赖于数据和超参数。在生产中发布新的机器学习模型比传统的软件开发更复杂。
机器学习工程师还在讨论机器学习中的 CI/CD 实际上是什么意思,使用哪些工具。大多数机器学习团队使用几种工具来拼接他们自己的流程,以发布一个新模型——更新每月发布一次,每天发布一次——这不是最佳方式。
在之前的一篇文章中,我在 400 万篇 Reddit 帖子上训练了一个机器学习模型,将一篇帖子分类到一个子编辑中。一个月后,我注意到 Reddit 上的主题发生了变化,我需要收集新的数据来重新训练模型。在本文中,我将介绍发布新版本的步骤,描述如何为这类项目构建 CI/CD 管道,以及为什么在机器学习中经常重新训练模型是必不可少的。
出现了持续集成的需求
为了收集 5k 个最受欢迎的子编辑的 1k 个最新帖子,我创建了两个使用 Python Reddit API 包装器的 CLI。我将数据存储在 SQLite 数据库中。
之前,我用 fastText 训练了一个文本分类器,并在测试分割中报告了 0.4 的 f1 分数和 0.6 的召回率。这意味着大约三分之二的情况下,前五个预测包括人类在测试数据集上选择的子集合。
从数据工件、执行和 API 端点之间的依赖关系生成的端到端 ML 管道。
测试分割的性能可能不代表新数据的性能,这有几个原因。例如,预计用户在某些子编辑上发布的主题会随着时间而变化。在机器学习中,这被称为概念漂移,为了避免概念漂移,人们需要定期重新训练并发布新版本的模型。
概念漂移是指目标变量的统计特性随时间以不可预见的方式发生变化。 百科
为机器学习模型收集用户反馈
为了收集用户反馈,我将模型部署为一个 API, Valohai 团队制作了一个 UI 来与模型交互。我在黑客新闻上分享了 UI。
下面你可以比较测试数据和 8k 用户提交的 p@1(模型给出的第一次预测正确的概率)的分布。
测试数据的平均 p@1 为 0.549,用户提交的平均 p @ 1 为 0.531。我很惊讶地看到概率如此接近,这意味着模型达到了类似的确定性水平。如果这些值太远,这意味着模型是根据不代表实际使用的数据训练的。
在之前的文章中,我报道了 f1-分数与 p@1 正相关但稍有滞后。因此,当标签未知时,模型给出的概率可用作估计 f1 分数的代理。下面,0.55 的 p@1 对应于 0.4 的 f1 分数。
重要的是,不要仅仅依靠定量测试来建立对机器学习模型的信心。对黑客新闻的评论大多是正面的,但也提出了一些模型不起作用的案例。很少有人报告说它对一些子街道不起作用。在大多数情况下,模型没有在这些子街道上训练,因为它们不是最流行的子街道的一部分。这很难定量衡量,但知道这一点很重要。
尝试使用搜索词“爱尔兰软件开发人员”来查找/r/DevelEire。运气不好,但如果查询是“爱尔兰软件开发商 Reddit”,谷歌会把它作为第一个结果。 黑客新闻讨论
也有评论建议采用更复杂的模型。
改进的一个地方是使用更好的单词嵌入集。FastText 确实很快,但它不再靠近 SOTA。您最有可能使用简单的平均池,这就是为什么许多用户得到的结果看起来不对。尝试一种分块方法,为文档的每个块获取一个向量,并将这些向量水平连接在一起(如果向量是 50d,每个文档做 5 个块,那么无论文档有多长,每个文档都有一个 250d 的固定向量)。这部分解决了高度稀释的载体的问题,这是一些用户报告的不良结果的原因。你也可以做“专注池”,像变压器头一样进行池操作——尽管这是一个 O(N)操作,所以 YMMV。 黑客新闻讨论
在这一点上,我可以构建一个可能执行得更好的更复杂的模型,或者简单地收集更多的数据。更多的数据往往比更好的模型对性能有更大的影响。在生产机器学习中,避免复杂性是能够快速迭代并降低维护模型成本的关键。
从长期来看,还有第三种方法可以改进模型,即构建一个持续的集成和交付管道,定期用新数据重新训练模型,以便性能不会随着时间的推移而下降。
测量概念漂移
为了衡量概念漂移,我在训练第一个模型一个月后收集了最新的 Reddit 提交内容。
我导出了旧的子数据的新提交,并比较了测试和新数据之间的 f1 分数。有了 Valohai,我可以运行版本控制的执行,并在一个界面上比较它们。当在团队中工作时,这避免了陷入一个团队成员在本地运行一个实验并报告不同结果的情况。但是你忽略了哪些数据集、代码和参数。在一个团队中,如果没有版本控制,就像没有发生一样。
比较执行#56 和执行#81,我看到召回从 0.40 下降到 0.25 。该模型在新数据上表现不佳。该模型知道它,因为它也可以在新数据的 p@1 的分布上看到。
用模型给出的概率分布度量概念漂移。
在对执行#69 中的新数据进行再训练之后,新模型对新测试数据实现了类似的 0.40 召回率。新模型在额外的 700 个子数据集上进行训练,使其对最终用户更有用。
实际上,当我将数据随机分为训练、验证和测试时,模型在新数据上的性能低于 0.4。按时间顺序划分更好,在旧数据上训练,在最新数据上测试。正如 Szilard Pafka 在 Twitter 上指出的:
您应该在时间有序的测试集上测量准确性。这种“实际”准确度通常会低于通过标准交叉验证获得的准确度。不要欺骗自己,当您在生产中部署您的模型并开始在真正新的数据上使用它时,时间间隔的准确性将是您实际获得的准确性。
我当然被愚弄了,但我要补充的是,当在生产中进行机器学习时,获得更好的理论准确性并不是你的最终目标。重要的是使用相同的指标来比较每个版本控制的实验。
最后,由你的企业和终端用户来决定你的机器学习模型是否有用。如果 Reddit 部署了这样的模型,那么该模型的有用性可以通过选择该模型建议的子编辑的用户百分比来衡量。
机器学习的持续集成
机器学习中的持续集成意味着每次你更新代码或数据,你的机器学习管道就会重新运行。集成是在发布新模型以验证最新数据和代码之前完成的。我还没有为这个项目设置它,但这是我打算如何与瓦罗海这样做。
Valohai 附带了一个开放的 API,当推送新代码时,我可以用它来触发机器学习执行和管道。例如,我可以定义一个 Github 动作来触发每次提交的 Valohai 执行。我还可以创建特定的规则,只触发特定提交的执行,并根据机器学习存储库中修改的代码决定运行哪个执行。如果您的数据不断更新,您可能只想定期重新训练模型。
您可以使用 p@1 之类的代理来测量概念漂移,并在出现重大性能损失之前发布新版本。还可以使用 Github actions 定期调度工作流,使用最新数据在 Valohai 上运行机器学习管道。
机器学习模型验证
大多数机器学习团队不会在没有一些人工验证的情况下部署到生产中。例如,比较生产模型和新候选模型的不同报告。
要建立对新模型的信心,您可以将它应用于所有历史数据并比较预测。结果不应该完全不同。然后,您可以检查性能发生显著变化的数据片。
对于 subreddit 分类器,我比较了每个标签的性能。下面,你可以看到当我使用旧模型和最新数据时,关于政治的子主题的 f1 分数显著下降。
f1-score_diff 是将旧模型应用于新数据时的 f1 值= diff(数据 2,数据 1)
用新数据重新训练模型后,我注意到性能损失较小,r/ukpolitics 略有改善。还有两个新的分支:中立政治和温和政治。
总体而言,f1-score_change 分布遵循 0 附近的正态分布。大多数子记录的性能变化在-20%到+20%之间。新模型仍然是准确的,更有用的,因为它是在更多的子数据集上训练的。我现在有信心发布机器学习模型的新版本。
机器学习的连续交付
理想情况下,您可以首先将您的模型部署到您的临时环境中,并让它运行几天。您还可以通过 canary 版本向一部分用户软发布您的新模型。
Valohai 帮助您为您的机器学习 API 创建不同的版本,并在必要时轻松回滚。将一个新模型作为 API 端点发布就像用一个执行生成的模型工件创建一个新版本一样简单。在测试了新版本之后,您只需要更改生产版本的别名。
为了发布新版本,我将别名从“生产→ 20200331.0”更改为“生产→ 20200602.0”
结论
当数据属性改变以克服概念漂移时,重新训练机器学习模型是重要的。为了最终在机器学习中实现 CI/CD,你可以从自动化你当前过程的某些部分开始。
首先,它有助于为每个机器学习执行版本化数据、代码和参数,并将结果附加到您的拉取请求。然后,您可以使用 Valohai 创建端到端的机器学习管道,当代码和数据发生变化时,外部会触发这些管道。最后,您可以创建使用最新数据运行的参数化报表。
Valohai 已经为机器学习执行、数据、管道和 API 部署提供了版本控制,简化了生产中新模型的集成和部署。Valohai 包括托管的 Jupyter 笔记本电脑,以对您的所有机器学习代码进行版本控制,并轻松地使笔记本电脑实验成为公司范围内生产流水线的一部分。
资源
最初发表于T5【https://blog.valohai.com】。
连续 15 天使用 Vim 后,我学到了什么
学习和生活课程
从 Vim noob 到业余爱好者的旅程
发推文强调 Vim 挑战的模因/笑话
Vim 是什么?
Vim 代表VisualImproven,一个最初为 Unix 创建的编辑器。
为什么使用 Vim?
很厉害。
您可以非常快速地进行复杂的编辑。查看我的 surround.vim 帖子来感受一下它的威力。
刻意的练习和环绕。vim 让我爱上了 Vim
towardsdatascience.com](/how-i-learned-to-enjoy-vim-e310e53e8d56)
符合人体工程学。
如果您知道如何触摸键入,使用 Vim 意味着您可以将手放在主行键上,而不必不断地将手移到箭头键、触控板或鼠标上。
到处都是。
它安装在几乎每个系统上,而其他编辑器如 Emacs 和 Nano 可能不可用。它是跨平台的(适用于 Windows、macOS 和 Linux)。大多数系统中的默认编辑器是 Vim,因此至少知道如何使用它进行基本编辑,以及最重要的是如何退出 Vim ( Escape :q!
then Enter)是很有用的。
如今,即使是笔记应用程序也可以让你使用 Vim。一款相对较新、非常流行且功能强大的笔记应用 Obsidian 使用 Vim 绑定:
[## 使用这个免费的笔记应用程序做更好的笔记,它将成为你的第二大脑
黑曜石使连接想法变得容易,帮助你更好地思考和写作
medium.com](https://medium.com/@ausius/take-better-notes-with-this-free-note-taking-app-that-wants-to-be-your-second-brain-1a97909a677b) [## 如何记笔记:来自人工智能、神经科学、社会学家和免费应用程序的见解
帮助您更好地记笔记和思考的见解和工具
medium.com](https://medium.com/@ausius/how-to-take-notes-insights-from-ai-neuroscience-a-sociologist-and-a-free-app-34b4be63080a)
我为什么想学 Vim?
FOMO 或 f 耳朵 o f m 丢失 o ut 。
虽然许多人从来没有“了解”Vim,但是许多开发人员和程序员使用它,并且非常信赖它。Vim 用户是否知道一些非用户不知道的事情?我想给 Vim 一个机会,这样我就能理解为什么它如此两极分化,并看看 Vim 是否也会在我身上生长。
Vim 是最受欢迎的开发环境之一( Stack Overflow 2019 调查)
我想挑战自己,提高我的工作效率。
我喜欢学习新的想法和生产力工具,并且我总是试图在学习方面做得更好。我认为学习 Vim 为实施和测试有效的学习策略提供了一个很好的机会。
高效获取知识和技能
medium.com](https://medium.com/@ausius/2-meta-learning-principles-to-help-you-learn-more-efficiently-44061c9951e1)
我想说服自己,我不是一只老狗。
我弹钢琴和打字已经快三十年了(分别从 5 岁和 7 岁开始)。学习 Vim 感觉真的很像学习如何弹钢琴和触摸打字——它包括学习新的手部动作和运动。
但是,当我大脑中的神经连接仍然具有高度可塑性时,我就获得了钢琴和打字技能;小时候,我的大脑就像一块海绵,急切地等待着吸收它遇到的一切。
我是不是变成了一只学不会新把戏的老狗?我不(想)相信那件事。我想证明自己是错的。我想说服自己,我仍然可以快速学习新技能。我想知道我还能重新连接我大脑中的神经通路。
我的学习计划
我没有制定或遵循任何具体的循序渐进的计划。缺乏计划看起来是个坏主意,特别是因为有效的学习通常需要在学习之前做好计划。但我并不担心,因为我心里已经有了一个项目。
我的简单到可笑的项目和目标:从现在开始每天使用 Vim。
我经常用 Python、R 和 JavaScript 编写代码,我的计划是只允许我自己使用 Vim 来编写代码。本尼·刘易斯用这种方法学会了流利地说多种语言。这应该也适用于维姆。
我预料会有挣扎,尽管我不确定会有多少挣扎。我告诉自己,每当我陷入困境时,我就会用谷歌搜索解决方案——这种策略应该会奏效,因为目前的形势(新冠肺炎),大多数人的生产力都受到了影响,所以如果我因为 Vim(我是一名博士生)而行动缓慢,很可能没有人会问为什么。
在每一天结束时,我总结了我的一天,并记录了我的进展,你可以在下面看到。
第一天
灰心丧气。艰难地移动光标。
我学会了用hjkl
导航和移动光标,以及 Vim 中的编辑模式:普通、插入和可视化。我还学会了如何用d
删除文本,用y
复制或拖动,用v
选择。
我努力编辑文本,但没有完成多少工作。我的大部分时间都花在了在网上搜索解决方案,或者盯着我的显示器,努力记住该按哪个键。
Vim 用户经常将 Caps Lock 键重新映射到^控件
第二天
痛苦而缓慢。艰难地选择和改变文本。
我使用 Visual Studio 代码,所以我安装了 Vim 扩展,,它支持 Visual Studio 代码中的 Vim 键绑定。让自己完全沉浸在 Vim 中可能是最快的学习方法。
我还经常使用 RStudio ,并意识到我还可以启用 Vim 键绑定(选项>代码>键绑定)。糟糕透了——我挣扎着用 Vim 选择和编辑文本,并一直使用我的旧键盘快捷键。
高效地在文本中导航和移动光标
medium.com](https://medium.com/better-programming/4-keyboard-shortcuts-to-edit-text-efficiently-and-improve-productivity-66894c8d51b8)
我创建了一个文本文档来跟踪按键绑定。我还为 Anki 添加了几个重要的按键,这是一个空格重复的抽认卡应用程序,我已经用了将近十年了。从现在开始,每当我第一次学习新的按键绑定时,我都会添加到 Anki 中,这样我就可以定期查看它们,并将其保存在长期记忆中。
第三天
糟糕透了。我一定是做错了什么。
尽管我今天又学了几个动作,但我仍然在和 Vim 做斗争。比如我知道怎么用vip
选择段落。但是,这仍然不是很好——过去我花 5 分钟完成的事情现在需要 10 分钟以上。因此,我别无选择,只能经常使用我的非 Vim 键盘快捷键。否则,我将无法完成任何工作。
我开始怀疑我是不是做错了什么。不知道其他 Vim 用户刚开始用 Vim 的时候有多纠结?人们怎么才能学会喜欢这个怪物呢?
在 YouTube 上找了几个视频,打算明天去看。其中一个比较了使用和不使用 Vim 时手在键盘上的动作。这个视频有点说服我坚持下去。
第四天
受到启发。隧道里的一些光。
我喜欢维姆,因为我还没有达到极限。克里斯·图米
我今天看了几个 YouTube 视频,但是克里斯·图米的掌握 Vim 语言是一个启示。Chris 改变了我对文本编辑的看法:我们大部分时间都在编辑现有文本,而不是编写新文本。我希望我在第一天就看到了这个视频。
我意识到 Vim 旨在使编辑变得容易,而普通的文本编辑器只关注写作。我迷上了 Vim 并安装了 Vim,这样我也可以在 Firefox 中使用 Vim。
我对 Vim 的兴奋溢出到学习爵士钢琴(我是一个古典钢琴家)。我想做更多的事情来发展和重组我大脑中的连接。我认为这是明智地成长和衰老的关键。我练习了所有调的 ii-V-I 音级,遵循的是四度循环,这显然比古典音乐家使用的五度循环更适合爵士乐。
我不再使用v
、d
和i
的组合来编辑文本,因为ciw
已经成为我最好的朋友。
练习 ciw:改变一个内部单词重复。
第五天
改进。我在维姆和爵士钢琴上变得更好。
显然,要学习 Vim,你必须把鼠标当成你的死敌。使用鼠标会妨碍您学习 Vim 和提高。
我开始使用相对行号(:set relativenumber
)——另一个游戏规则改变者。我现在可以更高效地浏览文档。我还使用Shift }
和Shift {
在段落或文本块之间导航。
我还听了塞隆尼斯·蒙克的钢琴独奏,并试着在我的钢琴上随机应变。
在过去的几天里,我也一直头痛得很厉害,我想知道这是否是我与 Vim 斗争的结果?
第六天
兴奋。维姆成了我的朋友。
ct
和cT
是我的新宠。我用它们来删除和修改从光标当前位置到某个字符的文本。
我尝试在 bash 中用set -o vi
启用 Vim,在 zsh 中用bindkey -v
启用 Vim,但是我不太喜欢这种体验,所以我禁用了它。
第七天
缓慢而稳步的进步。尽管还在挣扎。
今天在 Visual Studio 代码中工作时,我经常使用 Ctrl-W 在窗口/窗格之间切换。过去花我 1 个小时的事情现在要花我 1.5 甚至 2 个小时。我从来没有这么努力去压抑和抑制我使用箭头键的习惯。
我想知道其他人用了多长时间才变得擅长使用 Vim?
第八天
前路漫漫。
今天用 Visual Studio 代码写了好几个小时的 Python,R,MATLAB 代码。我还发现了 radian,一个非常漂亮的 R 控制台。
我越来越擅长复制和粘贴,但粘贴后仍无法高效替换文本。观看这个视频有一点帮助——使用f
或t
跟随一个字符找到当前行中的字符,并按;
或,
前进到下一个或移动到上一个匹配的字符。
多亏了这个 stackoverflow 问题,我也学会了如何替换或替换当前行中的字符::s/old/new/g
将当前行中的所有old
替换为new
。要仅替换第一个匹配实例,请移除/g
标志。
第九天
隧道还没有尽头。
我花了几个小时用 Visual Studio 代码把 Python 代码写成 PDF 文件。这花费了我比预期多得多的时间(不出所料),但是在那之后,我在导航和编辑文本方面肯定感觉舒服多了。
第 10 天
乐趣和快乐。
我今天安装了我的第一个 Vim 插件。我故意避免安装任何插件,直到今天,因为我想确保在使用任何插件之前,我掌握了基本知识。
今天,我觉得我已经准备好使用一个插件了,尤其是如果我认为它会大大提高我的工作效率的话。我安装了 surround.vim,,这有助于修改事物周围的事物对——这是编程时非常常见的编辑。比如把array(x)
变成print(array(x))
,文字用括号括起来。我喜欢它。
我现在开始喜欢使用 Vim 了。事实上,我并不期待在 MATLAB 和 RStudio 的 ide 中无法使用 Vim 的地方编码。
第 11 天
激动人心。
今天我学习了许多新的动作和技巧。例如,我可以使用%
在匹配的括号之间跳转。这很酷,对编程非常有用。
第 12 天
更多学习。
我今天开始做一个 JavaScript 和 Node.js 项目,一整天都在 Visual Studio 代码中使用 Vim。事实上,我今天用了将近 14 个小时的 Vim,并且有很多机会使用 surround.vim 插件。
vim 允许您添加、删除和更改成对的事物
第 13 天
说 Vim。
我读了几节实用 Vim,这显然是学习 Vim 的最佳书籍之一。
我已经开始欣赏维姆的哲学,感谢像维姆的崇拜这样的文章。我觉得我终于开始说维姆语了。
在我看来,使用 vim 的正确方法是通常停留在正常模式,只在插入模式下进行短暂的输入。对维姆的崇拜
vim 的“禅”是你在说一种语言,我学到的思考正常模式命令的一个好方法是作为一种语言,用动词、名词和形容词。动词是你的命令,如 ‘c’ (改变), ‘d’ (删除), ‘y’ (猛拉),名词是你的动作,如 ‘w’ (单词), ‘}’ (段落),或 ‘G’ (eof),形容词/副词是你的数字前缀和你的描述词,如 ‘a’ vim 命令应该组合成“句子”,在更高的层次上,向 vim 描述您想要做什么。
我现在意识到了自己的无能,并且知道我需要在哪些具体技能上努力才能最快地提高。因此,我开始使用刻意练习,一种强大的学习策略,来提高我的 Vim 技能。
第 14 天
结构。
我今天买了 Udemy 的 Vim 大师班,因为我觉得我的学习中的一些结构可能会有所帮助。我完成了前几节,真的很喜欢。也许我应该在第一天就开始上这门课。
第 15 天
毕业了。
最近我觉得在 Visual Studio 代码中使用 Vim 很舒服,所以我再次尝试在 RStudio 中使用 Vim。第二天我很讨厌它,但今天还不算太糟,所以我可能会继续在 RStudio 中使用 Vim。
虽然只有两周加一天,但是我已经非常喜欢它了,以至于我决定写一篇关于如何使用 surround.vim 插件的教程,这个插件在让我喜欢上 vim 的过程中发挥了巨大的作用。
刻意的练习和环绕。vim 让我爱上了 Vim
towardsdatascience.com](/how-i-learned-to-enjoy-vim-e310e53e8d56)
摘要
学习 Vim 提醒了我坚持的重要性,尤其是在最初挣扎的时候。我喜欢这种挑战,其中包括大量的学习、奋斗和真正的头痛。
但我最终还是让自己大吃一惊:我从没想过在短短的 15 天里,我就能和 Vim 有家的感觉。我从来没有想到学习 Vim 会激励我最终学习和练习爵士钢琴。
我的钢琴
毫无疑问,我越来越喜欢 Vim 我明白为什么它是一种疾病。
TL;DR:如果你不使用 Vim,不要读这篇文章。或者如果你读了,不要相信它。继续使用你现在喜欢使用的东西。不要下维姆兔子洞。
——Reddit 用户军团 b 在r/程序员幽默
对于那些总是试图改善自己的人来说,Vim 是会上瘾的。只要你每天都有时间和精力学习 Vim,你一定会找到提高的方法。
我不再像 15 天前甚至 5 天前那样纠结于 Vim。我每天都在进步,因为我经常使用它;但是就像每一种语言一样,我知道我永远也不会完全掌握 Vim,因为它太复杂了(无论如何,“完全掌握”某样东西又意味着什么呢?).这提醒了我应该如何生活——关注过程,不断成长,永不停滞。
更多帖子, 订阅我的邮件列表 。
提高公众演讲技巧的 4 个技巧
作为第一次参加网络研讨会的演讲者,我学到了什么
在 Unsplash 上由 Nycholas Benaia 拍摄的照片
我最近在一个由 Correlation One 主办的关于导师效应的网络研讨会上发言,这是一个由领先雇主赞助的数据和分析培训项目。虽然这不是我第一次在众人面前发言,但我以前从未被邀请担任小组成员。作为一名新毕业生成为演讲者之一的想法听起来完全令人生畏,但却非常令人兴奋。我参加过许多数据科学会议,会上发言人分享了他们的成功故事。谁能想到有一天我也会被邀请来分享我的经历!我一直梦想有一天我会成为演讲者之一,激励人们,但我从来没有想到这一天会这么快到来。
我感到紧张,但兴奋地分享我的经历。(图片由作者提供)
在我的成长过程中,几乎所有的老师都告诉我,我在公开演讲方面会很糟糕,因为我太害羞了,从来不说话。我记得几年前,我的老板甚至建议我参加演讲会来提高我的公众演讲能力。我去年才意识到,我也可以成为一名优秀的公众演说家。
当我在 Metis 的时候,我必须为我参与的每个项目做一个报告。我记得在我第一次演讲后,我收到的第一个反馈是我需要畅所欲言。所以,我决定我必须提高我的公共演讲技巧。最后,我的老师和同事对我的成长印象深刻,这对我意义重大!不管你过去有多糟糕,你总是可以扩展你的技能。
在这个博客中,我想分享一些我学到的提高我公开演讲技巧的经验。
写你的演讲稿
一旦你准备好了演讲稿,你现在能做的就是准备你想说的话。但是你从哪里开始呢?
我从我想涵盖的主题的大致轮廓开始。实际上,就像我写任何博客文章一样。没有必要坚持你的大纲,但是有一个大纲可以让你保持在正轨上,这样你就不会错过任何东西。写演讲稿时,用你平时说话的方式来写。如果你想吸引观众的注意力,可以随意加入一些闲聊或幽默。如果你不确定如何写提纲,查阅一些例子会很有帮助。
在你想好你的主题后,你可以开始考虑你想在每个主题/问题上花多少时间。
如果这是一个演示文稿,我尽量不要在每张幻灯片上放超过三个项目符号。经验法则是不要在你的幻灯片上列出太多的细节,因为当你的听众可以直接从幻灯片上读出来的时候,听你的演讲还有什么意义呢!
实践
练习,练习,练习!除非你是那种可以不假思索地谈论任何事情的人,否则你需要做好准备。因为英语是我的第二语言,所以练习对我来说更重要。我是那种在压力下容易忘记该说什么的人。但是,如果你练够了,我敢保证这种尴尬的情况绝对不会发生!
检查你的幻灯片。你甚至可以自己计时。PowerPoint 允许你添加一个屏幕计时器,帮助你记录你在每张幻灯片上花了多少时间。这将有助于你确保在有限的时间内涵盖所有要点。我不建议在最后一刻改变你的牌,因为这会让你感到有些措手不及。你甚至可能会跳过幻灯片,因为你忘记了你想说什么。
如果你愿意多走一步,我建议你自己录下来。听完你自己的陈述后,你可以试着微调你的演讲。如果你自己都不相信自己说的话,你怎么能指望听众会相信呢?此外,这是一个记录你进步的好方法!
处理紧张情绪
你就快到了!!对许多人来说,在演讲前感到紧张是完全正常的。不骗你,我一紧张就会手心冒汗。那完全没问题!真正帮助我在演讲中保持冷静的一个方法是不要去想观众。你可以假装在和自己或家人说话。你也可以在远处找到几个点/物体,当你说话时聚焦在上面,这样看起来你好像在看着观众,而你并没有。
这也是我需要改进的地方。但是我相信我做得越多,我就会越好。你也是!
反馈
恭喜你!你做到了!!!如果你收到任何负面反馈,不要难过。如果有人愿意花时间批评你,你应该把它当成你成长和变得更好的机会。记住,只要你付出努力,一切都可以得到改善!
“我明白了,人们会忘记你说过的话,会忘记你做过的事,但人们永远不会忘记你带给他们的感受。”―玛娅·安杰洛
我最怕的是人们会对我评头论足。事实证明,人们对你的评价远低于你对自己的评价。你可能认为人们可能永远不会忘记你做过或说过的令人尴尬的事情,但大多数人实际上都很健忘。他们可能不记得你到底说了什么,但他们会记得你是否自信。所以不用担心太多,去做就是了!
最后的话
最后,我想说的是,不要让你的现状决定你的未来。
如果你努力工作,保持专注,永不放弃,你最终会得到你想要的生活――唐纳德·米勒
我非常感激 Correlation One 邀请我成为小组成员之一。此外,我想对主办 DS4A 节目的 Correlation One 大呼小叫。如果你对数据科学感兴趣,想接触招聘经理和招聘人员吗👥来自世界 500 强企业,并且有行业导师指导,不要犹豫,赶紧申请吧!
感谢阅读!我希望这篇博客对你有所帮助。
如果你喜欢我的内容,请关注我❤️,看看我最近的博客:
举例说明最常见的离散概率分布
towardsdatascience.com](/understanding-and-choosing-the-right-probability-distributions-with-examples-5051b59b5211) [## 作为分析师如何准备商业案例面试?
作为数据分析师或数据科学家,我们不仅需要知道概率和统计,机器学习算法…
towardsdatascience.com](/how-to-prepare-for-business-case-interview-as-an-analyst-6e9d68ce2fd8) [## 构建电子商务产品推荐系统:第二部分——模型构建
这个博客是我之前工作的延续,在我之前的工作中,我谈到了我是如何收集产品评论和…
medium.com](https://medium.com/@kessiezhang/building-a-product-recommendation-system-for-e-commerce-part-ii-model-building-8b23a9b3ac27) [## 为电子商务建立一个产品推荐系统:第一部分——网络搜集
今天,如果我们想到机器学习在商业中最成功和最广泛的应用,推荐者…
medium.com](https://medium.com/@kessiezhang/building-a-product-recommendation-system-for-e-commerce-part-i-web-scraping-798b6251ab51) [## 如何将 Jupyter 笔记本转换成 PDF
用几行代码将 Jupyter 笔记本转换为 pdf(调试“500:内部服务器错误”)
towardsdatascience.com](/how-to-convert-jupyter-notebooks-into-pdf-5accaef3758)
对 51,000 篇期刊文章的无监督单词嵌入学习能告诉我们关于新冠肺炎的什么。
2019 年 7 月,我的一位前材料物理同事围绕从更老的科学出版物中发现新科学发表了一篇了不起的文章。这个想法很简单但很棒:如果文章编码了科学家思考特定科学概念的方式,人工智能可以通过学习这些文章中句子的模式来尝试识别新的关联吗?
来源:美国航天局
有监督的自然语言处理是一个很好的起点,但是将整个出版物的语料库减少到一个单一的结构化标签数据集并不完全是任何人想要花费他们的隔离时间去做的事情。相反, Tshitoyan 和他的同事们发现他们可以使用无监督的信息密集型单词嵌入来捕捉潜在的复杂材料科学概念。令人惊讶的是,他们发现通过训练一个简单的 Word2Vec 网络,他们可以在发现之前几年预测材料的导热性能!
有了一个空闲的下午,一杯新鲜的咖啡和对病毒学世界非常天真的概述,我们能把这种方法扩展到 51,000 篇新冠肺炎相关期刊文章的语料库(文本集合)吗?
用单词嵌入表示语言
当我们第一次学习一种语言时,我们被教授组成词汇的几个单词,然后我们根据上下文在词汇中的单词之间建立联系;我们称之为句子。有了这个极度淡化的概述,让我们试着教我们的计算机成为一名病毒学家。
首先,我们需要一种表示词汇表的方法。计算机没有将单词作为字符串处理的直观方式;一个常见的技巧是将每个单词映射到一个 n 维的二进制向量上,其中每一行代表词汇表中的一个单词和 n 个单词。当表示像“罗马”这样的单个单词时,向量在对应于“罗马”的行中有 1,在其他地方有 0。这被称为一键编码,如下图所示。
来源:马尔科·邦扎尼尼,2017 年
不幸的是,这并没有告诉我们关于单词排序的任何事情,因为我们必须学习句子的表达。做到这一点的一个方法是建立一个上下文的度量,或者一个单词在句子中与另一个单词“接近”的可能性。换句话说(没有双关语的意思),我们可以建立什么样的模型来表示语料库中单词之间关联的可能性?
我们可以训练一个神经网络来做到这一点,方法是尝试预测可能出现在以感兴趣的单词为中心的邻域或窗口中的单词。在窗口大小为 1 的 IMDB 评论上训练的网络更有可能预测“米夫林”旁边的“邓德”,而不是“比尔亚尼”旁边的“邓德”;这是因为短语“ Dunder Mifflin ”或(“Dunder”,“Mifflin”)作为训练示例出现的次数会比“ Dunder Biryani ”或(“Dunder”,“Biryani”)多得多。
另一方面,大小为 1 的窗口将无法将“Dunder Mifflin Paper Company”中的“Dunder”与“Paper”相关联,因为“Paper”是两个单词之遥。为了补救这一点,我们需要大小为 2 的窗口,这将产生更多的实例(“Dunder”,“Paper”)作为训练示例。选择适当的邻域大小对于捕获复杂语言的语义至关重要。
一个非常流行的网络是 Skip-Gram:一个隐藏层网络,它将我们的一个热编码输入向量映射到关联概率的输出。该网络如下图所示:
来源:克里斯麦考密克
隐藏层是这里的奖品;我们将一个主要包含零的二进制向量映射到一个 300 维向量,该向量用语料库的其余部分描述其语义表示。这种表示中的单词被称为嵌入,嵌入的词汇被称为语料库的嵌入。
更值得注意的是,我们可以在嵌入中使用向量代数来描述语言中单词之间的关系。“King”、“Kings”甚至“Emperor”的嵌入向量之间的余弦相似性得分(CSS)应该接近 1,因为它们出现在相似的上下文中,因此它们出现的训练对应该为形成嵌入的网络中的权重提供相似的更新。加减向量已经被证明可以捕捉语言规律,例如类比。例如,“男人是国王,就像女人是国王一样”通过嵌入的加法和减法运算符来表示:“国王”——“男人”+“女人”;这导致嵌入非常接近皇后。
现在我们有了一个模型,我们可以继续从出版数据的语料库中学习新冠肺炎研究的语言。
数据
作为对疫情的回应,白宫和一个由主要研究人员组成的联盟组建了一个名为新冠肺炎开放研究数据集,这是一个由超过 51,000 篇关于新冠肺炎、新型冠状病毒和其他冠状病毒的学术文章组成的资源,托管在 Kaggle 上。在他们的原始论文中, Tshitoyan 和他的同事们专注于从论文摘要中学习科学概念。摘要基本上提供了一个 TL;dr 概述了作者所做工作的方法、结果、发现和结论,因此形成了一个更小但更密集的冠状病毒研究信息语料库。
生成病毒学词汇
在 Tshitoyan 等人的论文中用于预处理期刊的相同协议被用于准备新冠肺炎开放研究数据集。使用 ChemDataExtractor (一种帮助归纳化学标识符的 repo)过滤句子中的关键词,如“ABSTRACT:”和“METHODS:”并标记化(拆分成单词数组)。非技术词汇被小写和去重音,以减少总词汇量。如果标记在语料库中出现超过 5 次,则被接纳到词汇表中,给出 22399 个独特的单词。
作者们还用 n 元短语丰富了他们的词汇。在给定训练数据的情况下,这些是具有很高可能性彼此相邻出现的 n 个单词的序列。g ensim 用于使用包括诸如“of”或“a”等常见术语的短语来生成 4-gram。如果短语在语料库中出现超过 10 次,则被纳入词汇表,给出 33504 个独特的短语。
型号
我在 g ensim 中使用了 Word2Vec Skip-Gram 实现,具有 200 维嵌入和 8 个单词的上下文窗口,下采样阈值为 0.0001,对语料库中 328 个最常见的单词进行下采样。使用随机梯度下降来训练网络,在 30 个时期内,学习率从 0.01 到 0.0001 线性下降。收集了 15,000 个语法科学类比用于评估网络性能,分数定义为“正确解决”的类比数量。该分数用于手动调整网络超参数。
结果—类比
首先,用几个类比查询测试嵌入的鲁棒性。询问“中东到 MERS 如同 _ is 到新型冠状病毒”等同于对令牌嵌入执行以下向量代数运算:“中东”-“MERS”+“新型冠状病毒”。前 10 个最接近的向量包括(‘中国 _ 在 _ 十二月’,CSS = 0.54),(‘南方 _ 中国’,CSS = 0.49),(‘武汉市’,CSS = 0.48)和(‘湖北省’,CSS = 0.48)。同样,询问“艾滋病之于艾滋病毒,就像 _ 之于新型冠状病毒一样”,得到了代表新型冠状病毒引起的疾病的 2019-nCov 的三种变体。“MERS is to MERS-CoV as _ is to 新型冠状病毒”给出了 2019-nCov 在前 10 名中的 5 名的变化。“骆驼”-“MERS”+“新型冠状病毒”= ('bat_species ',CSS = 0.39)。
这些结果特别令人兴奋,因为它们暗示了对文献中关键概念之间关系的一些了解。
结果—药品名称余弦相似性和相似性
接下来,我问药物新型冠状病毒冠状病毒、SARS 和 MERS-CoV 之间存在什么样的背景关系。我下载了一个包含 2542 种 FDA 批准的药物的数据库,其中 408 种与词汇表中的药物名称重叠。
值得注意的是,羟氯喹是与新型冠状病毒语义相似度最高的药物之一,这并不奇怪,因为它最近作为一种可能的治疗方法受到了关注。另一个有趣的发现是丙嗪,在 2004 年被报道为潜在的 SARS-CoV 蛋白酶抑制剂,但在 2008 年在小鼠模型中显示出缺乏临床疗效。伊马替尼是一种癌症治疗药物,在 2016 年的一项研究中被证明可抑制 SARS-CoV 和 MERS-CoV。
接下来,我在嵌入中使用了向量代数,提出了以下问题:“利巴韦林之于 SARS,就像 _ 之于新型冠状病毒?”。以下是余弦相似度最高的 10 个答案:
有趣的是,remedisivir 目前正处于试验中,等待其用于治疗轻度至中度新冠肺炎症状,而利托那韦的试验刚刚在一组新冠肺炎症状中结束,没有明显的益处。
一个有趣的问题是,有多少与新型冠状病毒相关的药物没有出现在同一个摘要中,因为这将表明基于从专门关注 SARS-CoV 和 MERS-CoV 的论文中获得的模式的潜在上下文类比。
结果—症状类比
与上面类似,询问“干咳之于 SARS 就如同之于新型冠状病毒”会返回一个全面的症状列表,其中许多已知与最近的爆发有关。
结论
Tshitoyan 和他的同事们通过用自然语言向 NLP 模型提问,对该方法进行了扩展。这项工作是一个下午的编码,仅仅触及了 NLP 的能力和由一些非常出色的人组装的惊人数据集的表面。还有很多很多事情要做。例如,我们可以用一个更复杂的上下文感知模型来代替 Word2Vec 模型,比如 Google 的 BERT 或 ELMO。当关键词没有出现在与新型冠状病毒出版物相同的摘要中时,可以提出更多关于蛋白质结构类比的技术问题,并弄清楚网络正在回答什么问题。毫无疑问,在这一领域已经做了很多工作,试图找到对抗一种使我们的星球停滞不前的疾病的策略。
是什么让一个数据分析师变得优秀?
关于分析的本质,第 2 部分,共 2 部分
在剖析卓越分析的本质之前,让我们先快速总结一下第一部分中关于分析的三个常见误解:
- 分析是统计。【T4 号】
- Analytics 就是数据新闻/营销/讲故事。【T8 号】【T9 号】
- 分析是决策。(不!)
误解 1:分析与统计
虽然他们使用的工具和公式是相似的,但分析师和统计学家接受的培训却是截然不同的
- 分析帮助你形成 假设 ,提高你的提问质量。
- 统计帮助你测试假设,提高你答案的质量。
如果你想了解更多关于这些职业的知识,可以看看我的文章**分析师和统计学家能相处吗?**
误解 2:分析与新闻/营销
分析不是营销。区别在于,分析是关于扩大决策者的视角,而营销是关于缩小它。
同样,数据新闻是关于以小的方式捕捉许多人的兴趣,而分析是关于以大的方式服务于少数人的需求。分析师首先服务于他们的决策者。
误解 3:分析与决策
如果我是你的分析师,我不会在这里为你选择(即使我可能比你有更多的领域专业知识)。你必须把我提升为决策者,这样做才合乎道德。
如果你想让某人成为分析师和决策者的混合体,要明白你是在要求两个角色合二为一,并明确分配这一职责。
要了解更多关于错误观念#2 和#3 的信息,请回到第 1 部分。在本文中,我们将继续讨论卓越分析。
是什么让分析师变得优秀?
**在 数据科学最被误解的英雄 ,中,我描述了数据科学的 3 大优点。分析师的优秀之处在于速度。
图片:来源
分析师查阅事实和为你产生灵感,同时尽量少浪费他们自己的时间(和你的时间!)的过程中。为了获得最佳的灵感时间回报,他们必须掌握许多不同形式的速度,包括:
- 获取有希望且相关的数据的速度。( 领域知识。
- 为操作准备数据的速度。( 软件技能。 )
- 汇总数据的速度。( 数学技能。 )
- 将数据摘要输入大脑的速度。( 数据可视化技巧。
- 将数据摘要输入利益相关者大脑的速度。( 沟通技巧。 )
- 激发决策者灵感的速度。( 商业头脑。 )
最后一点非常微妙(也是列表中最重要的一点),所以让我为您详细说明。
漂亮的可视化和有效的沟通琐事是浪费你的时间。令人兴奋的发现被证明是误解是浪费你的时间。小心翼翼地进入垃圾数据源是浪费你的时间。无关的轶事是浪费你的时间。分析师带给你的任何你觉得不值得花时间的东西…都是在浪费你的时间。
分析游戏就是优化每分钟的 灵感。
分析师会浪费你的时间——这是探索的一部分——所以分析游戏就是要尽可能少地浪费时间。换句话说,优化 每分钟灵感 (他们的时间和你们的时间,取决于你们每个人对组织的价值)。**
不要被对速度的简单解释所迷惑。从长远来看,一个草率的分析师总是被闪亮的无意义的“见解”所迷惑,只会拖大家的后腿。
评估分析师绩效
对于那些喜欢业绩评估的人,要注意你不能用 每分钟灵感 来衡量你的分析师。
图片:来源
这是因为可以提取的最大灵感量(由决策者主观定义)因数据集和数据集而异。但是你可以通过让他们在你已经非常熟悉的基准数据集上放松来评估他们的技能(而不是工作表现】。**
其中一碗豌豆是基准数据集。
打个比方,如果你让两个分析师从一本外语教科书中获取灵感,更好(更快)的分析师可能是该语言的母语使用者。你可以通过测量他们理解你用那种语言写的文章的速度来评估他们的相对技能。
如果你不热衷于自己创建一个标准化的分析障碍课程,你可能会喜欢看看 byteboard.dev 。 Byteboard 是一家革新科技面试的初创公司,他们最近推出了一项针对数据分析的技能评估。它使用真实世界的场景加上一个漂亮的界面来衡量数据探索、数据提取、定量交流和业务分析等任务的能力。当然,他们打算用它来帮助你面试新的候选人,但是没有理由你不能用它来快速测试你的现任分析师。
一本神秘的教科书!图片:来源
技巧不能保证影响。这取决于你的数据。
但是一旦你评估了技能,记住技能并不能保证影响。这取决于你的数据。回到之前的类比,如果你让两位分析师看一本你从未翻开过的神秘教科书,你不能让他们为他们发现的 每分钟灵感 负责,因为这本书可能充满了垃圾。如果是这样的话——不管他们的流利程度如何!—两个人都不会找到任何灵感带给你……这不是他们的错。有课本并不意味着你会学到有用的东西。数据集也是如此;它们的质量和相关性同样重要。
教科书是数据集的一个很好的类比,所以关于数据集和教科书还有几件事要记住:
- 一个决策者的垃圾可能是另一个决策者的财富。像教科书一样,数据集只有在覆盖了你想了解的主题时才会对你有用。(我在这里 写过那个 。)
- 如果它有人类作者,它是主观的。像教科书一样,数据集也有人类作者,他们的偏见会影响到内容。(我在这里这里 写过数据和偏差 。)**
永远不要因为数据中没有的东西而惩罚分析师
决策者们,把你的分析师想象成你刚刚进化出来的一个新的感觉器官:一种新的眼睛,它让你能够感知你原本会视而不见的信息。
如果你用你的新眼睛去看一些不值得看的东西,你不会把它们挖出来,对吗?
Gerax Sotelo 在 Unsplash 拍摄的照片
同样,如果分析师在你让他们为你检查的数据集中没有发现任何有价值的东西,不要惩罚他们。把他们留在身边是一种投资,让他们能够以新的方式看待事物。如果你不喜欢他们正在看的东西,把他们引向更有潜力的场景。
分析是看清你要去哪里和盲目飞行的区别。除非你全身裹着泡沫塑料,哪儿也不去,否则敏锐的感觉是值得投资的。
要深入了解卓越分析,请继续阅读本文。
感谢阅读!喜欢作者?
如果你渴望阅读更多我的作品,这篇文章中的大部分链接会带你去我的其他思考。不能选择?试试这个:
分析中的阿波芬尼亚的危险以及你能做些什么
towardsdatascience.com](/your-dataset-is-a-giant-inkblot-test-b9bf4c53eec5)
公开
自从我参与设计 Byteboard 的分析速度测试以来,我并不是完全没有偏见。我确实希望你会喜欢它。
图片:来源
感谢阅读!YouTube 课程怎么样?
如果你在这里玩得开心,并且你正在寻找一个为初学者和专家设计的有趣的应用人工智能课程,这里有一个我为你制作的娱乐课程:
在这里欣赏整个课程播放列表:bit.ly/machinefriend
与凯西·科兹尔科夫联系
让我们做朋友吧!你可以在 Twitter 、 YouTube 、 Substack 和 LinkedIn 上找到我。有兴趣让我在你的活动上发言吗?使用表格取得联系。****