谁说单片应用已经死了?
整体服务与微服务:没有放之四海而皆准的方法
图片来自 Pixabay
就软件设计而言,微服务和单片应用是设计、构建和部署软件的两种截然不同的方法。那么,微服务和单片应用有什么区别呢?
首先,微服务是业务逻辑的小部分,旨在彼此独立地开发、部署和扩展。相比之下,整体式应用程序被设计为作为一个整体来开发、部署和扩展。
然而,不同的组织有不同的资源,并且没有一个放之四海而皆准的方法来构建一个成功的产品。开发人员花费大量时间和精力来设计、构建和部署应用程序,结果却发现代码库不可维护、伸缩性不好,或者团队没有足够的资源或知识来维持项目,这种情况很常见。
因此,从一开始就确定项目结构和理解权衡是很重要的。本文将解释每种方法的优缺点,并帮助您决定哪种方法适合您。
学习率是我每周给那些对 AI 和 MLOps 世界好奇的人发的简讯。你会在每周五收到我关于最新人工智能新闻、研究、回购和书籍的更新和想法。订阅这里!
设计考虑
设计应用程序时,通过列出所有的功能和业务需求来设置环境是很重要的。在一张纸上写下申请的范围将有助于你确定实现目标所需的资源。这个阶段奠定了基础,我们都知道如果你在一个错误的基础上开始构建会发生什么。
因此,第一步是描述应用程序将交付给用户的服务。考虑所有的功能需求,把自己想象成客户。然后,你应该列出所有可以帮助你完成项目的资源。
为什么要破解这个练习?简单的回答是,它将帮助您确定您应该遵循的架构模型;这将使在单片和基于微服务的架构之间进行选择变得更加容易。
收集功能需求
最初,收集和理解项目的业务需求是非常重要的。一种简单的方法是提供以下问题的答案:
- 你的应用程序的最终用户是谁?
- 你的产品将提供什么服务?
- 应用程序的输入和输出是什么?
- 输入和输出的格式是什么?
列举可用的资源
确定了业务和功能需求之后,下一步是列出所有可以帮助我们完成这个项目的资源。同样,让我们做同样的练习,并回答一系列重要问题:
- 我们可以支配的工程资源有哪些?开发人员使用什么工具,哪种编程语言是他们工作中的常用语言?
- 你愿意花多少钱来实现它?换句话说,预算是多少?
- 截止日期是什么时候?你有时间吗,或者有到达市场的紧迫性吗?
单片与微服务
既然您已经收集并列出了应用程序的所有业务需求以及实现这些需求的可用资源,那么是时候决定最合适的应用程序架构了。
没有两个系统是完全相同的。然而,在大多数情况下,您可以在基于单片的架构或基于微服务的架构之间进行选择。无论您采用哪种系统,主要目标都是设计一个能够为客户提供价值并且易于维护和扩展的应用程序。
每个体系结构分为 3 个主要层:
- UI(用户界面):UI 通常响应 HTTP 请求并提供图形界面,这有助于用户体验
- 业务逻辑:业务逻辑层包含控制一切并向用户提供服务的代码
- 数据层:数据层提供对应用程序所需信息的访问,并存储应用程序的状态
巨石
在整体架构中,我们之前看到的应用层是同一个单元的一部分。它们在一个存储库中管理,共享所有资源,并且用一种编程语言开发。最后,它们被打包并作为一个二进制文件分发。
微服务
在微服务架构中,应用层是独立管理的。通常,每个单元都保存在一个单独的存储库中。它在运行时消耗自己的资源,有一个定义良好的 API 用于与其他微服务建立通信,它的实现栈独立于其余部分。最后,它作为一个单独的单元发布,通常作为一个容器化的服务。
在微服务和单芯片之间选择
我们如何在这些方法中做出选择?毕竟,微服务是新的趋势,如果我们选择这种方式,似乎我们总是会赢?还记得我们在*“设计考虑”*部分做的练习吗?让我们来测试一下。
那么,你什么时候会选择建造一个整体呢?假设您有严格的预算,并且您的工程团队由几个熟悉特定框架(例如 Java Spring 框架)的开发人员组成。此外,时间紧迫,你必须在一个紧张的期限内建立一些东西。
在这种情况下,我认为开发一个单一的、集成的系统是你最好的选择。单一应用程序具有较低的启动成本,较低的开发复杂性(一种编程语言,一个存储库),以及更快的上市时间(一个部署整个堆栈的交付管道)。
然而,基于微服务的架构的优势是如此巨大,随着时间的推移和业务的增长,您应该制定一个计划,将您的代码库迁移到河的对岸。这种转变的好处是更大的可伸缩性、更低的规模运营成本、更高的可靠性和更高效的软件开发过程。
结论
自从引入 web 应用程序以来,微服务范式慢慢地在其他组织中获得了牵引力。微服务是业务逻辑的小部分,旨在彼此独立地开发、部署和扩展。相比之下,整体式应用程序被设计为作为一个整体来开发、部署和扩展。
然而,没有放之四海而皆准的方法,单一的应用程序设计肯定不会消亡。你必须做好功课,决定什么最适合你所在的职位,然后开始建设!
关于作者
我叫迪米特里斯·波罗普洛斯,我是一名为阿里克托工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据运算的帖子,请在 Twitter 上关注我的 Medium 、 LinkedIn 或 @james2pl 。
所表达的观点仅代表我个人,并不代表我的雇主的观点或意见。
谁是《复仇者联盟 3:无限战争》中的主角?
利用网络分析和节点中心性确定复仇者联盟 3:无限战争最重要的特征
图片由来自 Pixabay 的 Carlos Hilario 拍摄
复仇者联盟 3:无限战争出现在大银幕上已经三年了。电影中有这么多角色,当决定哪个角色在故事情节中扮演最重要的角色时,无疑是具有挑战性的,甚至是有争议的。是钢铁侠吗?是绿巨人吗?是美国队长吗?为了找出故事中最有影响力和不可或缺的角色,我们可以利用社交网络分析来了解电影的情节。
1.数据
我们将使用复仇者联盟 3:无限战争的文字记录,可以在网上找到。以下是我改编的出处:
https://transcripts.fandom.com/wiki/Avengers:_Infinity_War
上面的脚本包含了无限战争的情节,这是在知识共享下授权的。
2.构建字符网络
我们构建一个网络,其中每个节点代表一个角色(例如史蒂夫·罗杰斯),每个边表示两个角色出现在同一个场景中。我们定义边权重为这两个由边连接的人物出现的共同场景的数量。
此时,我们注意到某些边的边权重很低,因为字符很少一起出现。我们可以去掉这些无关紧要的边,在网络中制造更多的空隙,以突出网络的结构特征。下图显示了字符网络,其中每条边的宽度表示两个节点之间的边权重
《无限战争》中人物的社会网络(图片由作者提供)
3.衡量一个角色的重要性
一个角色的重要性可以用多种方式来定义。以下是一些可能的标准:
- 这个角色有多少“朋友”(或关系)?
- 人物在维护网络结构中有多重要?
度中心性和特征向量中心性
程度中心性是衡量一个人物在网络中有多大影响力的有用指标。节点的度中心性是与它共享直接边的节点的分数。在我们的上下文中,高度的中心性意味着一个角色至少出现在一个场景中,而故事情节中的其他角色占了很大比例。
特征向量中心性是另一种测量节点影响的方法,基于它连接到什么类型的节点。如果相邻节点具有高中心性分数,则节点本身也将具有高中心性分数。这种排序方法比简单地查看节点度更简单,因此与度中心性相比,它是节点与网络中心的接近程度的更好指标。
左:程度中心性右:特征向量中心性(图片由作者提供)
我们观察到托尼·斯塔克(钢铁侠)根据程度中心性(左)出现在同一个场景中的人物数量最多,这意味着他与电影中的人物数量最多。然而,基于特征向量中心性,来自银河护卫队的人物(彼得·奎尔和德拉克斯)实际上占据了更多的中心位置(即,他们与更多的主要人物相连)。
中间中心性
介数中心性是通过特定节点的最短路径数量的度量,并且可以指示网络中节点的结构重要性。在我们的上下文中,具有高介数中心性的节点将表明,如果没有特定角色的出现,故事将无法顺利进行。如果一个节点具有高介数中心性,这意味着如果没有该节点,网络更可能变得脱节,因此该节点是不可或缺的,因为它是一组节点和另一组节点之间仅有的链接之一。
前 10 个字符的中间中心性得分
参照上面的柱状图,我们看到中间中心性有一个相当有趣的趋势。对于程度和特征向量中心性,前 10 名得分之间只有轻微的变化。然而,我们终于看到了一些角色之间在中间中心性方面的鲜明对比,布鲁斯·班纳和托尼·斯塔克名列前茅。
铰接点
考虑到布鲁斯·班纳的特征向量中心性甚至不在网络的前 10 名之内,布鲁斯·班纳(绿巨人)的高中间中心性看起来确实令人惊讶。让我们试着把他从网络中移除,然后观察会发生什么。
移除 Bruce Banner 后将网络分成两部分(图片由作者提供)
有趣的是,这个网络把自己分成了两个截然不同的角色群体。我们只在 Bruce Banner 的情况下观察到这一点,这解释了为什么他具有最高的中间值。这个节点作为一个关节点,这意味着如果这个节点被删除,该图将分裂成其取代不相交的集群。
这很有意义,因为在电影中,布鲁斯·班纳(绿巨人)是连接银河护卫队(左边)和其他复仇者(右边)的复仇者。布鲁斯·班纳(Bruce Banner)是一个警告复仇者联盟灭霸(反派)威胁的人,也是一个通过他与托尼·斯塔克(Tony Stark)和斯蒂芬·斯特兰奇(Stephen Strange)的联系间接将新角色引入复仇者联盟电影系列(如《守护者》)的角色。《无限战争》也紧随托尔·拉格纳洛克的事件,布鲁斯·班纳(或绿巨人)充当了两部电影之间的桥梁。
4.结论
从纯粹的影响力角度来看,托尼·斯塔克和彼得·奎尔与电影中的其他角色互动得更频繁,可以被认为是网络中最有影响力的节点。
然而,在考虑了布鲁斯·班纳在网络中的结构意义后,很明显布鲁斯·班纳是无限战争故事情节中不可或缺的角色,尽管像托尼·斯塔克和彼得·奎尔这样的角色在故事中与更多的角色互动。
这是一个相当简单的角色网络表示,这里可能有更多的角色。然而,基于我们从网络上获得的观察,似乎浩克绝对是一个关键的(也可能是被低估的)角色。
我希望你喜欢阅读无限战争角色之间的关系!网络让我们可以在多维的层面上可视化角色之间的关系,这对于揭示这些网络中有趣的模式是很有用的。用于生成网络的源代码,点击这里。
在这个项目的下一部分中,我们将使用哈利波特系列探索这样的故事网络是如何随着时间的推移而演变的。点击下面的链接继续阅读!
https://jiangzh.medium.com/storytelling-via-temporal-networks-110ddeefb633
我受到了下面这篇文章的启发,这篇文章使用了自然语言处理(NLP)方法来分析角色,如果你对更多的电影数据分析感兴趣,我强烈推荐它:
如果你有任何新的见解,请随时发表评论!
谁会赢得下一轮《反恐精英:全球攻势》?
使用贝叶斯统计预测回合获胜概率
的文章、代码和数据可以在 github 上的https://github.com/PaulHiemstra/bayes_csgo_round找到
介绍
像在其他领域一样,统计和数据的使用在电子竞技中有所增长。一个具体的领域是电子竞技广播,其中统计数据用于增强和改善观看体验。最近一个让我印象深刻的例子是 Blast Spring CS:GO 总决赛的一部分,在比赛中展示了一轮获胜概率“AI 预测”。随着回合的展开,这个概率被更新。例如,一个反恐(CT)玩家倒下会降低 CT 获胜的概率。我脑子里的齿轮立即开始转动:除了不称之为“人工智能预测”之外,我如何实现这样一个舍入预测器。在这篇文章中,我将提出我的解决方案,使用贝叶斯统计来解决这个问题。使用这种方法,需要回答的问题可能是:
- 放置炸弹时 1v1 获胜概率如何变化
- 当炸弹被放置时,获胜的概率一般是怎样变化的
- 当 CT 或 T 玩家倒下时,获胜概率如何变化
- 地图对获胜概率有什么影响
反恐精英玩家可以利用这些信息在特定情况下做出明智的决定。此外,一个团队可以使用总的获胜概率,并用它们来衡量自己。例如,你的 4v5 胜率与整体 4v5 胜率相比如何。
在接下来的几节中,我将慢慢建立统计模型。
还剩两个 CT
我想解决的第一个问题是当两个 CT 玩家活着的时候,CT 获胜的概率。一般来说,活着的玩家数量的减少应该会降低特定团队获胜的概率。但是在我们进入统计之前,首先我们必须确定使用什么数据。
为了计算这种可能性,我使用了大量的历史数据(感谢基督徒!):
*122410
Index(['time_left', 'ct_score', 't_score', 'map', 'bomb_planted', 'ct_health',
't_health', 'ct_armor', 't_armor', 'ct_money', 't_money', 'ct_helmets',
<<<SNIP>>>>>
't_grenade_flashbang', 'ct_grenade_smokegrenade',
't_grenade_smokegrenade', 'ct_grenade_incendiarygrenade',
't_grenade_incendiarygrenade', 'ct_grenade_molotovgrenade',
't_grenade_molotovgrenade', 'ct_grenade_decoygrenade',
't_grenade_decoygrenade', 'round_winner'],
dtype='object')*
该数据集在一轮 CS:GO 中提供了超过 122k 的快照,提供了该轮的属性,例如有多少 CT 仍然活着,哪些武器或工具仍然存在,等等。此外,它还列出了谁赢得了这一轮。回合属性和谁赢了回合的组合使我们能够计算赢的概率。
以下帮助器函数计算成功概率,在本例中只是计算总联系类型成功概率。
*0.4901887100727065*
其简单地计算例如CT
赢得一轮的次数与总回合数的比值。在这种情况下,它显示 CT 赢得了 49%的回合。但是当然,我们有更多的数据可用,而不仅仅是我们属于哪个队,例如有多少 CT 球员仍然活着。为了扩展我们的回合获胜概率以包括该信息,我们转向贝叶斯统计。
贝叶斯统计从 CT 获胜概率(𝑃(CT 获胜)的先验估计开始,在这种情况下,我们之前计算了总体获胜概率(0.49)。接下来,我们添加额外的证据,在这种情况下,我们知道只有 2 个 CT 玩家仍然活着。使用贝叶斯定理来计算后验* CT 获胜概率(𝑃(CT 获胜|2 存活)😗
当剩下两个联系类型时,𝑃(2 活着|联系类型获胜)是联系类型获胜的可能性*。等式右侧的所有项都可以使用我们的数据进行计算:*
*0.27515169576151494*
因此,当一轮中剩下两名 CT 玩家时,获胜概率从 0.49 下降到 0.27。这是有道理的,因为 CT 玩家越少,CT 赢得这一轮的可能性就越小。
de_cache 上还剩两个联系类型
为了使我们的 CT 获胜概率更加真实,我们将扩大我们放入贝叶斯定理的证据数量。这里我们添加了各队正在比赛的地图,de_cache
。
假设这两个证据不相关(条件独立),我们可以非常直接地扩展我们的公式。这里,除了两个联系类型处于活动状态的证据之外,我们还添加了我们在映射 de_cache 上使用的证据:
条件独立性的假设确保了新的似然𝑃(map 可以以这种简单的方式被插入。这导致以下后验 CT 获胜概率:
*0.48211252170893965*
这表明,给定 2 个 CT 在缓存上处于活动状态时,CT 获胜概率远远高于给定 2 个 CT 处于活动状态时的总体获胜概率,在本例中为 0.48 比 0.27。
引入更多的证据
添加更多的证据当然会使我们的估计更准确。为了让我们的代码更灵活一点(我是一个懒惰的程序员),我写了一些帮助函数,它允许我们传递任何我们想要的证据,只要它是我们数据集的一部分:
*0.48211252170893965*
这表明,通过在字典中提供证据,我们可以在缓存图中获得两个活动联系类型的相同后验概率。有了这些更灵活的代码,我们可以更自由地开始试验。例如,在这里,我们计算了 1v1 情况下放置炸弹前后的获胜概率:
这表明,当炸弹是而不是放置时,获胜概率稍微偏向于 T(CT 为 0.45)。这可能是因为 T 可以选择战斗发生的地点。当 T 成功放置炸弹时,概率会更有利于 T。
炸弹工厂的更多细节
有了更灵活的代码,我们可以计算出更多的概率,包括剩下的 CT 玩家,剩下的 T 玩家,玩的地图以及炸弹是否被放置:
请注意,这段代码需要很长时间才能运行,而且肯定没有经过优化。
从这一大组概率中,我们可以得出一些有趣的见解。例如,炸弹工厂如何影响 CT 获胜概率:
其中 x 轴是放置炸弹前的 CT 获胜概率,y 轴是放置炸弹后 CT 获胜概率的下降。在该图中,我们看到:**
- 一般来说,放置炸弹后,CT 获胜的概率会下降
- 当 CT 已经有很高的输赢机会时,概率的变化就不大了
- 最大的变化发生在当联系类型的获胜概率在 0.62 左右时,下降到 0.3 左右。
职业 CS:GO 的一个要点是,在获胜的概率非常均匀的情况下,让 T 的植物和游戏进行重拍是有风险的。
为了扩大我们对炸弹工厂的探索,我绘制了双方存活玩家的数量,以及在瓦片图中放置炸弹工厂前后的获胜概率:
有趣的是:
- 一般来说,5v5 的获胜概率几乎是 50/50。de_cache 是一个例外,它在很大程度上依赖于 CT。在较小的程度上,这也适用于裁减核武器和取消训练。
- 当少于三名 CT 或 T 玩家存活时,CT 获胜概率发生最显著的变化。
- 失去团队成员会降低每个团队的获胜概率。
- 正如我们在前面的图表中看到的,当 T 设法放置炸弹时,CT 获胜的概率显著下降。
有趣的前进方式
本文中的方法仍然很简单,一些可能的有趣的改进途径可能是:
- 添加更多的变量。这确实是一个挑战,因为数据集在计算获胜百分比时会越来越分散。另外,有些变量不是范畴。我目前的方法需要这样,所以这些必须分类。这可以使用
pd.cut
来完成。 - 超越条件独立的。现在我假设所有的证据都是有条件独立的,这通常是不正确的。使用一个贝叶斯信念网络我们可以整合各种证据之间的依赖关系。这篇文章用 Python 很好地介绍了 BBN 的。
- 地图和 CS:GO 元数据的变化可能会使我目前用来计算概率的数据失效。要在实践中使用这样的系统,需要使用相关的最新数据,例如来自 hltv.org 的数据。理想情况下,将证据纳入贝叶斯定理的方法可能是有益的。例如,较旧的数据对最终数据的影响可能小于较新的数据。不过,我不确定如何在实践中实现这一点。
我是谁?
我叫 Paul Hiemstra,是荷兰的一名教师和数据科学家。我是科学家和软件工程师的混合体,对与数据科学相关的一切都有广泛的兴趣。你可以在 medium 上关注我,或者在 LinkedIn 上关注 T4。
如果你喜欢这篇文章,你可能也会喜欢我的其他一些文章:
谁对 AI 和 ML 很好奇?
日常的例子让“人工智能”和“机器学习”不仅对数据专家来说是熟悉的概念,对普通大众来说也是如此。但是怎么熟悉呢?对谁呢?
本周我们有一个特别的音频节目:沙盒播客迷你剧数据的奖励集!我们用孩子们可以理解的方式解释“人工智能”和“机器学习”的含义,使用日常例子,如电视节目推荐、机器人吸尘器和数学作业。
这些日常例子使“人工智能”和“机器学习”不仅对数据专家来说是熟悉的概念,对普通大众来说也是如此。但是怎么熟悉呢?对谁呢?
谷歌趋势数据可以更精确地向我们展示这些术语有多流行,它们的用法如何随着时间的推移而变化,甚至它们在哪里更流行或更不流行。当然,这是一种分析方法,你可以使用各种关键词或短语,针对你最感兴趣的话题。
一段时间内的 AI/ML 利息
谷歌趋势帮助你探索人们搜索特定术语的次数。您可以一次比较多达五个术语,还可以查看地理细节(即,整个世界或特定国家的数据,以及美国、州、大都市地区或城市级别的数据)。
阅读趋势数据有点棘手。数据被标准化以反映搜索词的受欢迎程度,每个时间段的值从 1 到 100,100 反映该词的最高受欢迎程度。此外,悬停在地图位置上将提供从 1 到 100 的值,最频繁搜索该术语的位置得分为 100。(如果你想了解更多趋势,谷歌提供了深入的课程。)
如下所示,Google Trends 的网络界面提供了一种很好的方式来初步查看数据,随着时间的推移,相对搜索兴趣会被绘制出来,地图会自动显示。
作者图片(通过谷歌趋势)
但是,您会希望使用您最喜欢的软件进行更深入的挖掘,对吗?😉正如您可能猜到的,图右上角的小向下箭头将数据下载为 CSV 文件,以备进一步分析。地图显示也是如此。我下载了 2004 年至今美国大都市地区的数据。
下面是我的折线图在 Designer 中的样子——由于其更窄的布局,显得更有戏剧性:
作者图片
有趣的是,在 2013 年 10 月,美国对“机器学习”的搜索兴趣超过了对“人工智能”的兴趣,尽管人工智能的含义更广,而且流行文化也很熟悉。是什么让 ML 当时领先,并且之后几乎每个月都保持领先?
这种变化的一个可能原因可能是 Coursera 的增长,Coursera 成立于 2012 年,其特色是现在著名的由网站创始人之一吴恩达教授的机器学习课程。如今,它仍然是 Coursera 上最受欢迎的课程,注册人数达 380 万。
地理比较
将这些数据引入 Designer 后,可以将趋势数据与其他数据结合起来,包括 Designer 中包含的美国人口普查数据。例如,这允许我使用城市地区的名称来添加空间信息,并生成更具体、信息更丰富的地图。
我将谷歌趋势的地铁名称与来自分配输入工具的数据中使用的名称进行了匹配,然后向趋势数据中添加了一些基本的人口统计信息和空间数据。我创建了一个新的变量,ML 中的搜索兴趣与 AI 中的搜索兴趣的比率。确定对机器学习相对于可能不太专业的术语“人工智能”有更大相对搜索兴趣的地方可能是有趣的这一比率从旧金山-奥克兰-圣何塞大都市地区的 0.69 到北卡罗来纳州威尔明顿的 0.07 不等(不包括对一个或两个词都没有搜索兴趣的城市)。
我还使用城市地区的纬度和经度,通过K-质心聚类分析工具生成地理聚类。该工具与追加集群工具相结合,将城市分配到组中。拥有一个“集群”变量允许我在数据中寻找地理模式,而不依赖于纬度和经度。这种方法生成了下面的地图,其中的城市按照它们的人工智能搜索兴趣比进行了颜色编码;钻石越红的城市比例越高,而钻石越蓝的城市则相反。城市的数字标识了它们的地理集群。
作者图片
美国东北部的人工智能与人工智能搜索兴趣的平均比率最高,为 0.29,美国西部排名第二,为 0.27。虽然我们可能会在旧金山地区和西雅图等美国主要科技中心看到更多的“机器学习”搜索,但在地理集群中脱颖而出的城市也很有趣,如弗吉尼亚州的夏洛茨维尔和宾夕法尼亚州的匹兹堡。随着学生研究数据科学主题,主要大学可能也会提高 ML 与 AI 的比率。
继续学习
那些搜索 AI/ML 的人就像我们的数据(在沙盒中)听众,嗯,就像我们所有人一样——只是试图跟上这个快速增长和变化的领域!感兴趣的关键术语和概念将会改变,但拥有数据驱动和好奇的心态有助于我们所有人保持在趋势的顶端。
查看沙盒奖励集的数据,并与你认识的一个年轻人分享人工智能/人工智能的阴谋!
原载于 Alteryx 社区 并精选于 Alteryx 数据科学门户 。
谁不见了?
https://unsplash.com/@timmossholder
编写 Python 实用函数来计算要素方面的缺失值。
找出数据中缺少的东西是数据科学中令人头疼的数据争论任务之一。虽然它们是丢失的数据,但如果不指出并正确处理,它们会回来并长期困扰你!
在使用 Python 的项目中工作时,我发现找到丢失的数据很容易,但在笔记本中很好地呈现可能会很麻烦。因此,这是我的努力,使失踪的数据探索更容易和更有用。
动机
在 Python 中,我们可以使用简单的一行代码data.isnull().sum
来列出数据集中缺失的数据。但是问题在于这个函数如何产生一个包含所有特性名称的完整列表,不管它们是否有任何缺失值。当所讨论的数据集是一个包含许多特性的大数据集时,在笔记本中可能看起来非常混乱。
为了克服这一点,在本教程中,我们将了解如何编写一个简单的效用函数,该函数将仅计算具有缺失观测值的要素的缺失值,并将其存储在数据框中,该数据框稍后可用于报告或可视化。
准备
工具和库
在本教程中,我将使用 RStudio 作为 IDE。因此我将使用 R 包 Reticulate 来运行 Python 代码。
我将使用一个迷你 Conda 虚拟环境,后端的好奇乔作为 Python 环境。为了能够重现本教程,您可能想在 Conda 中创建自己的虚拟环境,并在reticulte::use_condaenv()
函数中使用其名称。要了解有关创建和管理 Conda 环境的详细信息,您可以访问此文档。
# loading libraries
library(reticulate)
library(dplyr)
library(kableExtra)
library(knitr)# setting up virtual python environment
reticulate::use_condaenv("curious-joe")
Python 函数
我们将看到的函数依赖于 Python 库 Pandas ,这是一个常用于数据争论和分析的库。
这个函数非常简单,你可以通过它来理解。但是对于 Python 编程的新手来说,这里有一个功能在函数内部流动的分解:
- 创建一个字符串值列表, colNames 用于存储列名,
- 用来自 colNames 的值作为列名创建一个空白数据框 df ,
- 运行 for 循环以迭代输入数据框的每一列,并执行以下一系列任务:
- 计算列中缺失值的百分比,并将输出保存在名为 p 的对象中,
- 计算一列中缺失值的总数,并将输出保存在一个名为 q 的对象中,
- 检查 p 、缺失值的百分比是否大于零,如果大于零,则用列名及其相应的计数和缺失值的百分比填充空数据框 df 。
- 将结果数据帧 df 按降序排序,
- 返回 df ,带有名称的数据框和带有缺失值的要素的缺失计数。
# pyhton library
import pandas as pd# @ countMissing
# Fetches columns from the spefied dataset that contains missing values
# @param dataFrame Name of the dataframe objectdef countMissing(dataFrame):
# colNames = ['colNames', 'missingValue', 'missingValuePerc']
colNames = ['Featuers', 'Missing_Value', 'Percentage_Missing']
df = pd.DataFrame(columns = colNames)
for i in dataFrame.columns:
p = round((dataFrame[i].isnull().sum()/dataFrame.shape[0]) * 100, 2)
q = round(dataFrame[i].isnull().sum(), 0)
if p > 0:
df.loc[len(df)] = [i, q, p]
# creating data frame with the missing value columns and values
df = df.sort_values(['Percentage_Missing'], ascending = False).reset_index(drop=True)
return(df)
演示
数据
为了演示该函数如何工作,我将使用 iris 数据集,并在数据中引入一些 NA 值(R 语言中的缺失值)。
# preparing data
data <- iris
data = data %>% mutate(Sepal.Width = ifelse(Sepal.Length >7, NA, Sepal.Width))
data = data %>% mutate(Sepal.Length = ifelse(Sepal.Length >7, NA, Sepal.Length))
在代码中,我们删除了 Sepal 的值。宽度和萼片。萼片时的长度特征。长度值大于 7。这导致 24 行缺少值。
应用
下面的代码块应用了我们刚刚创建的函数 countMissing() ,并打印出输出数据帧。
# calculating missing value using countMissing()
table = countMissing(r.data)
table## Featuers Missing_Value Percentage_Missing
## 0 Sepal.Length 12 8.0
## 1 Sepal.Width 12 8.0
让我们使用一些 R markdown 包来使输出看起来更好!
knitr::kable(py$table, caption = "Missing Values") %>%
kable_classic(full_width = F, html_font = "Cambria")
我们改进了什么?
如果你查看一下 countMissing() 函数,你会发现我们使用的是 isnull()。sum() 内部,我们可以使用相同的函数来获得缺失的计数。我们创建 countMissing() 的唯一原因是确保缺失计数以一种更可展示和可用的方式产生。虽然当它们在更大的数据集上运行时,差异会更明显,但是下面的代码块显示了这两种方法的输出是如何不同的。
r.data.isnull().sum()## Sepal.Length 12
## Sepal.Width 12
## Petal.Length 0
## Petal.Width 0
## Species 0
## dtype: int64
VS
countMissing(r.data)## Featuers Missing_Value Percentage_Missing
## 0 Sepal.Length 12 8.0
## 1 Sepal.Width 12 8.0
甚至更好的
knitr::kable(py$table, caption = "Missing Values") %>%
kable_classic(full_width = F, html_font = "Cambria")
在本教程中,我们基本上介绍了如何用 Python 编写函数。我们学会了如何编写自己的小效用函数来解决我们独特的问题。
感谢阅读!
通过阅读本文,您应该对 Python 中的函数是如何工作的,以及如何在您的数据分析中使用它有一个基本的了解!
不确定接下来要读什么?我为你选了另一篇文章:
阿拉法特·侯赛因
谁是谁,什么是什么:生物医学命名实体识别进展
思想与理论
命名实体识别研究概述,以帮助解决与生物医学领域相关的挑战。
介绍
在 Slimmer AI ,我们一直在探索生物医学领域的 NER(BioNER)。这种探索很重要,因为有一些挑战在其他领域并不总是存在,包括:
- 数据通常不能自由获取,尤其是在临床病例中。
- 数据注释需要专业知识。
- 生物医学概念的空间是巨大的,这使得 NER 系统不太可能超越它们被注释的特定设置。
本文概述了命名实体识别工作和研究,以帮助解决与生物医学领域相关的挑战,如生物医学数据集和处理它们的技术。我还将讨论迁移学习和多任务学习在这一领域的重要性。我将快速介绍一些 BioNER 的替代方法,与基于深度学习的流行模型(如 BERT)进行比较。
NER 发展概述
命名实体识别(NER)是自然语言处理的组成部分之一,被用于许多下游任务,如问题回答、主题建模和信息检索。**【1】**该任务涉及使用诸如人、组织、位置等类别来标记非结构化文本中的实体。
命名实体识别的目标是将单词识别为实体,并对它们所属的实体类型进行分类。图片作者,灵感来自 MonkeyLearn 。
早期的 NER 系统使用手工制作的规则、词汇、拼写特征和本体。**【1,2】**诸如此类的模型有一些好处,比如它们不需要带注释的训练数据。然而,这些模型有几个缺点。例如,词典需要详尽,相关词典需要由领域专家主动更新。
随着这一领域的发展,人们开始使用机器学习,但这种方法也有其缺点,如费力的特征工程。最近,引入了端到端深度学习方法,并消除了对每个特定数据集手动设计特征的需要。尽管缺乏特定领域的规则和知识,这些特征推断网络优于特征工程系统。【1】
数据集噪声和偏差
许多带注释的数据集已被引入生物医学领域,包括实体类别,如细胞系、化学、疾病、基因、蛋白质和物种。他们中的大多数使用 PubMed 的文章作为他们的来源,这已经被一些领域专家注释过了。对于流行的 BioNER 数据集的概述,GitHub 上由 Flair 或this overview所做的评论是很好的参考。
NER 数据集最突出的问题之一是数据集是不完美的,这并不局限于生物医学领域。例如,大多数人——如果不是全部的话——都会遇到注释者不同意或者缺少注释的问题。
李等人强调数据注记质量是领域的主要挑战之一。**【2】举几个例子,MedMentions 语料库的创建者通过让生物学家审查专业注释者所做的注释来评估注释质量,并报告了 97.3%的一致性。【3】2004 年的 JNLPBA 任务在 2019 年有了一个修订版,试图修复原始语料库中的不完善之处。【4,5】**有两轮注释,注释者在两轮之间讨论了一些分歧。在第一轮中,注释的一致性为 79.5%,而在第二轮中为 91.4%。这离 100%还是挺远的。Wang 等人分析了广泛采用的 CoNLL03 数据集,能够在大约 5.38%的测试句子中识别错误。鉴于最先进的测试分数已经达到 93%左右,他们进一步强调了这一点的重要性。
根据知识或视角,插图或文字可以有不同的解释。这可能导致注释者不同意和不完善的数据集。图片由 Pixy 提供。
发现注释错误需要深厚的专业知识和大量的时间投入。为了用另一种方式处理它们,王等人引入了一个叫做 CrossWeigh 的框架。他们的解决方案很简单,但确实需要相当长的运行时间。想法是训练多个模型,每个模型基于训练数据的不同分割。分割或折叠是以这样的方式建立的,即训练集不包含来自相应测试集的任何术语。不正确的预测在所有测试集上聚集,并且这个过程重复几次迭代(给定不同的随机种子来创建折叠)。直觉告诉我们,如果一个术语在每个文件夹中都被错误分类,那么这个注释可能是不正确的。然后通过在训练期间给它们较小的权重来抑制这些注释。随着 F1 分数提高 0.2-0.4%,他们注意到他们的模型变得更加稳定,在多次运行中 F1 分数的标准偏差更低。
正如在许多机器学习任务中显而易见的那样,数据集通常包含偏见。NER 也不例外。识别在训练(记忆)期间看到的实体提及和处理形态变化(同义词概括)通常不会对像(生物)BERT 这样的大模型造成问题。**【8】然而,Kim 和 Kang 发现,BioNER 模型经常利用数据集偏差,并且未能归纳出在训练期间未见过的概念。【8】**他们分析了 BC5CDR 数据集中的 50 个分类错误,发现 BioBERT 在其中 34%的情况下使用了统计线索。
为了解释他们滥用了什么样的线索,让我们首先快速查看一下 NER 数据集中最常用的格式:内-外-开始注释模式) (IOB)。当一个实体由多个(子)字组成时,例如组织’ Slimmer AI ‘,第一个字’ Slimmer '以 B- 为前缀,表示一个实体的开始, ‘AI’ 以 I- 为前缀,表示一个字是前面实体的一部分。不属于实体的单词用 O 标注。这种格式有助于区分文本中的连续实体。
用 IOB-scheme 注释的例句。 Slimmer AI 是一个组织实体,由两部分组成: Slimme r,前缀为 B- 和 AI ,前缀为 I- 。其他单词不是实体,用或标注。图片作者。
Kim 和 Kang 发现,一些单词只在训练集中与 B- 一起出现,因此在测试集中总是被归类为 B- ,导致不正确的预测。**【8】为了解决这种偏差,他们提出了基于偏差乘积法的去偏差程序。【9】**结果,这些模型确实对记忆性能产生了一点影响,但它们在同义词和概念概括方面有所改善。然而,他们的去偏置方法可能会减少在实体中使用有效模式的机会。这种模式的例子有“__ street”和“__ disease”,它们是非常相关的模式,可以用来促进概念的泛化。作者指出这是未来的工作。
生物医学领域的另一个大问题是,通常很难获得由专家注释的大型数据集。如果你碰巧找到这样一个黄金标准的语料库,它们通常都很小。为了解决小数据集的问题,你可以利用迁移学习、多任务学习或少量学习。
迁移和少量学习
使用预先训练的模型和应用迁移学习技术是当今 NLP 社区的常见做法,可以显著提高下游任务的性能。将它应用于 BioNER 任务也不例外,因为基于大量生物医学数据训练的几个模型已经开源并被频繁使用。最突出的模型之一是 BioBERT,首先在一般领域语料库上进行预训练,随后在 PubMed 等生物医学领域语料库上进行预训练。【10】为了说明开源这些模型如此重要的原因,仅生物医学领域预培训的后半部分就花费了 23 天时间,使用了 8 个 Nvidia V100 GPUs。这对中小型企业来说是一笔不小的投资。另一个取得显著成功的模型是 HunFlair 模型,它在 23 个生物医学数据集上进行训练,远远超过 SciSpaCy 和 HUNER 等 BioNER 模型。【11,12,13】使用领域特定模型而不是普通模型提高下游任务性能的证据是压倒性的。【8,10,11,14–18】
展示迁移学习概念的高级概述。在一个数据集上训练的模型的一部分被转移,并在另一个任务上进一步微调。图片由作者提供,灵感来自 TopBots 。
与随机初始化的 LSTM 相比,HunFlair 模型利用预训练,在不同类别的 F1 分数上提高了 0.80-4.75%。观察到的增加主要是由更高的回忆引起的。他们的模型和训练数据可以在他们的 GitHub 页面上找到,而且,由于它是流行的风格 Python 库的一部分,你可以很容易地根据自己的喜好扩展这个模型。【19】
Peng 等人引入了生物医学语言理解评估(BLUE)基准,其中 BioNER 是标准之一,以促进预训练模型开发中的研究(有关 BLUE 的更多信息,请查看各自的 GitHub 页面)。**【16】他们评估了几个 BERT 和 ELMo 基线,发现根据 PubMed 摘要和 MIMIC-III 临床笔记预先训练的 BERT 模型取得了最好的结果。【20】**他们的模型被恰如其分地命名为 BlueBERT,在所有数据集上均优于 ELMo、BioBERT 和其他最先进的模型。最佳模型设置在 BioBERT 上提高了 8.9 F1 分,单个数据集平均提高了 1.8 分。
Giorgi 和 Bader 利用银标准语料库,这些语料库往往更大,但质量较低。**【17】**这样的语料库可以通过使用现有的 NER 模型来标注大的、未标记的语料库来生成。作者通过首先在这些银标准语料库上进行训练,然后在金标准语料库上进行微调,在几个数据集上实现了 11%的错误减少。对于注释很少的数据集(< 6000),改进特别大。
预培训也带来了应用一些技术的机会,比如少量学习:只使用少量标签来微调你的模型。这是一项非常有用的技术,尤其是在缺少带注释数据的领域。Hofer 等人评估了在医学领域中处理这种小数据集的五种技术,直到仅使用 10 个训练样本。**【21】作为基线,他们使用了一个基于当时为 CoNLL-2003 和 OntoNotes 5.0 调整的最先进模型的模型。【7,22】**改善他们的少数镜头学习任务的技术之一涉及使用更多样本对相关数据集进行预训练。在对几个数据集进行测试后,他们在最佳设置下的 F1 分数比基线提高了 4.52%。使用同一个域中的数据集明显优于使用另一个域中的数据集。
另一种设置利用多个单独的数据集,并对所有数据集进行组合预训练。有趣的是,与使用单一数据集进行预训练相比,作者报告了-1.66%的负面影响。作者指出,这可能是由他们的训练策略引起的,因为他们使用了针对单独数据集优化的超参数。他们进一步认为,通过对第一个数据集进行预训练获得的权重可能不适合第二个数据集。值得注意的最后一种技术是使用专门在生物医学文本上训练的单词嵌入作为输入,而不是使用普通的手套嵌入。**【23】**这让他们的 F1 得分又提高了 3.78%。所有技术的结合使他们的 F1 分数从 69.30%提高到 78.87%,这是一个很好的提高。
多任务学习
除了应用迁移学习,另一种流行的方法是使用多任务学习:不仅训练手头的任务,还包括其他相关任务,以提高主要任务的表现。这背后的概念是,相似的任务或数据集具有语义和语法的相似性,这有助于为手头的任务训练更优化的模型。此外,它可以减少过度拟合的机会。常见的任务包括标注词性(POS)标签、句法成分和依赖关系。**【2,14】**此外,这些任务的数据相对容易获得,因为语法特征可以使用现成的工具包获得,如 NLTK 或 Stanford CoreNLP 。
应用多任务学习的示例架构。第一层由不同但相关的任务共享。图片由作者提供,灵感来自 Ruder.io 。
Tian 等人尝试使用键值记忆网络将句法特征结合到 BioBERT 模型中,并看到其性能提高了约 0.2–0.9% F1。这听起来可能不多。然而,当考虑到一些数据集上的一些模型已经在 90%以上的范围内执行时,这样的增加可能是显著的。
Wang 等人将使用具有不同实体类型的多个数据集的训练视为多任务问题。**【18】**他们通过迭代遍历数据集来训练不同的 BioNER 模型,同时在这些模型之间共享一些参数。在 15 个数据集的 14 个数据集上,它们优于之前的最先进水平,f 1 得分提高了 0.2%至 1.8%。
Khan 等人采用了类似的方法,但他们将他们的模型视为一个单一的模型,每个任务都有共享的底层和特定的顶层。**【15】**对于下层,他们使用了预训练的 BioBERT 模型。在三个数据集上的训练产生了最佳性能,与单任务学习模型相比,F1 分数提高了 0.2-1.3%,并在王等人的模型上进一步提高了 0.7-2.3% F1。
应用多任务学习的一种独特方式是让多个单一模型进行协作。CollaboNet 是一个应用这一技巧的框架,它使用在不同数据集上训练的特定模型来完成不同的任务。**【24】**作者指出,常规的多任务学习产生的模型在回忆上得分较高,但精确度较低。因为这些模型是针对几种不同的实体类型进行训练的,所以它们在预测正确的实体类型时往往会有困难。此外,作者确定了生物医学领域的一个问题,即实体可以根据上下文被标记为不同的实体类型。有些词在一种语境中可以表示基因,在另一种语境中可以表示疾病。
使用 CollaboNet,他们试图通过为协作的每种实体类型建立专家模型来解决这个问题。在训练期间,这些模型轮流被更新或作为合作者。每个模型接收协作者模型的输出,并将其用作辅助输入。因此,每个模型都被认为是自己领域的专家,同时通过利用多领域信息来提高其他模型的性能。与王等人相比,CollaboNet 的 F1 得分提高了 0.2-5.0%。**【18】**值得注意的是,使用 BiLSTM-CRF 架构的 CollaboNet 已经被 BioBERT 超越。然而,该框架本身仍然可以应用于更先进的模型,进一步提高它们的分数。然而,人们需要足够的记忆和时间来应用它。
缓解内存和时间问题的一种方法是使用较小的网络,或者使用利用权重共享的网络。一个很有前途的模型是生物阿尔伯特,基于(你猜对了):阿尔伯特。除了他们的参数缩减技术来加速模型,作者不仅在 NER 的任务上训练他们的模型,而且还应用了句序预测。这种技术从训练数据中提取两个连续的句子和两个随机的句子,并尝试预测一个句子是否跟随另一个句子。这允许模型更好地学习依赖于上下文的表示。
BioALBERT 在几个数据集上的表现一直优于 BioBERT,而且常常是大幅度领先,他们报告的分数相当可观。随着参数的减少,训练时间减少了大约 2-3 倍:这是一个巨大的胜利!作者在 Github 上公开了他们的模型。
基于知识的 NER 和本体论
当您由于昂贵且劳动密集型的标注过程而没有大量已标记数据时,可能有另一种训练模型的方法:基于知识的 NER。基于知识的 NER 模型基于与本体和注释的对应关系进行分类。
具有挑战性的 MedMentions 数据集将他们的注释建立在广泛的 UMLS 本体论的基础上。**【3】这个丰富的本体包含了数百万个概念,在几个专注于创建仿生系统的研究中使用。MedMentions 数据集“仅”标注了 35.2 万次 UMLS 概念,但它仍然是最具挑战性的数据集之一。大量的概念使得任何模型都难以记忆或概括。因此,在这个数据集上表现最好的基于 BERT 的模型达到大约 56% F1 的测试分数就不足为奇了。【27】**我的同事 Stephan Tulkens 的后续博客文章将尝试使用无监督方法处理 MedMentions 数据集,敬请关注!
回到基于知识的:2013 年,Zhang 和 Elhadad 通过对语料库中每个出现的 TF-IDF 向量进行平均,为每个出现的实体类型创建了签名向量。然后,将这些向量与所有名词短语块的向量进行比较,以识别所有实体。它优于传统的基于字典的方法,但低于最近的监督方法。
吉亚斯万德和凯特通过几项改进超过了张和艾尔哈达德。【28,29,29】他们只使用明确的 UMLS 项作为种子项来生成正反例。这些例子的句法和语义特征被用于训练决策树的集合。这个模型的输出然后被用来扩展例子,以包括模糊的 UMLS 术语。这个循环重复了几次。该方法优于其他非监督方法,并且在一些实体类上,它的性能与使用手动注释的监督系统相当。
类似地,De Vine 等人从自由文本笔记中学习概念嵌入,首先使用 UMLS 附带的匹配器提取概念。**【30】**然后,他们用概念的 ID 替换文本中的任何跨度,然后通过应用 skip-gram(例如,word2vec)学习概念嵌入。通过在两个小数据集上将概念之间的余弦距离与人类判断相关联来评估这些概念,并获得了积极的结果。
Beam 等人采用了类似的方法,后来他们的嵌入技术公开发布。**【31】Phan 等人通过使用一种“暹罗”网络来学习姓名嵌入:他们使用预先训练的单词嵌入和字符嵌入作为 BiLSTM 的输入。【32】**然后使用 BiLSTM 的输出来计算三个损失:一个损失是惩罚同义词之间的距离(即同义词应该靠得很近),一个损失是惩罚名称和概念(即由名称表示的概念)之间的距离,一个损失是惩罚到“局部上下文”的距离(即概念出现在其中的单词嵌入的平均值)。).他们的模型在许多检索、相似性和关联性任务上优于其他基线。
脸书人工智能的研究人员提出了无监督知识增强语言模型(KALM),它用知识库增强了传统的语言模型,端到端地训练以优化困惑。**【33】**在训练过程中,在给定目前观察到的上下文和作为输入的知识库的情况下,它使用门控机制来控制一个单词是一般单词还是应该被建模为对实体的引用。它随后在预测时间期间使用这种门控机制来预测一个单词是否是一个实体。它不需要任何额外的信息,例如在文本语料库中标记的命名实体标签,并且仍然实现了与现有技术的监督模型相当的性能。
Karadeniz 和 ozgür 解决了实体规范化的问题:将实体映射到一个本体/字典,这对理解被识别的实体是必要的。**【34】**由于几个原因,这在生物医学领域不是一个要解决的小问题。如前所述,通常存在歧义问题——实体可能根据上下文具有不同的语义。此外,还存在识别在文本中以不同表面形式出现的概念(例如,现在和过去时态,或缩写)的挑战。
作者通过使用带有句法分析信息的预训练单词嵌入,以无监督的方式利用语义和句法信息。他们获得了一个新的最先进的精确分数,以 2.9 个百分点的优势击败了之前的最先进分数。
但是,当您想要提取的实体没有在文本中明确提到,而是;含蓄?举个例子,假设一个句子包含水解这个词。单词水或 H2O 没有被明确地提到,但是你可以推断水参与了这个过程。
Shoshan 和 Radinsky 创造了潜在实体提取(LEE)的任务,在这里你试图识别这些隐含的实体。**【35】**在他们的研究中,作者使用反应体本体集中于生化反应领域。他们使用预训练的单词嵌入和顶部的 BiLSTM 分类器训练了几个一对一对所有分类器,一个分类器用于一种类型的实体。这里还应用了多任务学习,不仅训练每个分类器的指定实体类型,还训练其他相关类型。作者表明,他们的模型在识别这些潜在实体方面达到了很高的性能。作者得出结论,LEE 任务将显著改进许多 NER 系统和基于它们构建的应用程序。
结束语
生物医学命名实体识别的挑战是不可低估的。幸运的是,对于我们所有在软件产品开发中积极应用人工智能的人来说,有许多聪明的头脑帮助我们处理这个复杂的领域。
我被我们可以用来走得更远的许多“技巧”所鼓舞。例如,您可以使用 CrossWeigh 框架来处理嘈杂的注释,识别和去偏差您的数据,或者使用银标准语料库来预训练您的模型。如果有机会的话,你当然应该在相关的任务中利用迁移学习和多任务学习。
有许多预先训练的模型可用,您可以从多任务学习方案中进行选择。而且,如果你没有可用的带注释的数据,我建议求助于基于知识的系统,它利用本体论或任何其他种类的知识库。最后,考虑在你的文本中是否有隐含的实体。如果是这样,一定不要忽视它们,无论如何都要尝试提取它们。
最后一点:我确信我们已经错过了文献中一些有趣和有前途的技术。如果你知道任何,请在评论中留下回复,与社区的其他人分享(你太棒了)。祝你的 BioNER 之旅好运!感谢我的同事米歇尔·范·德·斯蒂格和斯蒂芬·图尔肯斯为这项研究做出的贡献。
参考
**【1】**v . Yadav 和 S. Bethard,深度学习模型命名实体识别近期进展综述 (2018),第 27 届计算语言学国际会议论文集。
**【2】**j . Li,A. Sun,J. Han,C. Li,面向命名实体识别的深度学习综述 (2020),IEEE 知识与数据工程汇刊。
**【3】**s . Mohan 和 D. Li, MedMentions:一个用概念标注的大型生物医学语料库 (2019),2019 年自动化知识库构建会议论文集。
**【4】**j . d . Kim,T. Ohta,Y. Tsuruoka,Y. Tateisi 和 N. Collier,jnl PBA 生物实体识别任务介绍 (2004),生物医学自然语言处理及其应用国际联合研讨会会议录。
【m . Huang,P. Lai,R.T. Tsai,W. Hsu,修订版 JNLPBA 语料库:用于关系抽取任务的生物医学 NER 语料库修订版 (2019),arXiv:1901.10219【cs .IR】。
****【6】z . Wang,J. Shang,L. Liu,L. Lu,J. Liu,J. Han, CrossWeigh:从不完全标注训练命名实体标记器 (2019),arXiv:1909.01441【cs .CL】。
****【7】e . f . Tjong Kim Sang 和 F. De Meulder,CoNLL-2003 共享任务介绍:独立于语言的命名实体识别 (2003),HLT-NAACL 2003 第七届自然语言学习会议论文集。
****【8】h . Kim 和 J. Kang,你们的生物医学命名实体模型是如何推广到小说实体的? (2021),arXiv:2101.00160【cs。CL】。
****【9】c . Clark,M. Yatskar 和 L. Zettlemoyer,不要走捷径:基于集成的避免已知数据集偏差的方法 (2019),2019 年自然语言处理经验方法会议和第九届自然语言处理国际联合会议论文集。
****【10】j . Lee,W. Yoon,S. Kim,D. Kim,S. Kim,C. Ho So 和 J. Kang, BioBERT:一种用于生物医学文本挖掘的预训练生物医学语言表示模型 (2020),生物信息学。
****【11】l . Weber,m . singer,J. Münchmeyer,M. Habibi,U. Leser 和 A. Akbik, HunFlair:一种用于最新生物医学命名实体识别的易用工具 (2021),生物信息学。
****【12】m . Neumann,D. King,I. Beltagy 和 W. Ammar, ScispaCy:生物医学自然语言处理的快速鲁棒模型 (2019),arXiv:1902.07669【cs .CL】。
l . Weber,J. Münchmeyer,t . rocktschel,M. Habibi,U. Leser, HUNER:用预训练改善生物医学 NER(2019),生物信息学。
【14】【2020】田永辉,沈文伟,宋永辉,夏,何,李,利用句法信息改进生物医学命名实体识别,BMC 生物信息学。
****【15】m . r . Khan,M. Ziyadi 和 M. Abdelhady, MT-BioNER:使用深度双向变换器的生物医学命名实体识别的多任务学习 (2020),arXiv:2001.08904 [cs .CL】。
【16】【y . Peng,S. Yan,和 Z. Lu,生物医学自然语言处理中的迁移学习:在十个基准数据集上对 BERT 和 ELMo 的评估 (2019),第 18 届 BioNLP 研讨会和共享任务会议录。
****【17】j . m . Giorgi 和 G.D. Bader,用神经网络进行命名实体识别的迁移学习 (2018),第十一届语言资源与评价国际会议论文集。
****【18】x . Wang,Y. Zhang,X. Ren,Y. Zhang,M. Zitnik,J. Shang,C. Langlotz,J. Han,深度多任务学习的跨类型生物医学命名实体识别 (2018),生物信息学。
****【19】a . AK bik,D.A. Blythe 和 R. Vollgraf,用于序列标注的上下文字符串嵌入 (2018),第 27 届计算语言学国际会议论文集。
****【20】a . e . w . Johnson,T.J. Pollard,L. Shen,L.H. Lehman,M. Feng,M. Ghassemi,B. Moody,P. Szolovits,L.A 和 R.G. Mark, MIMIC-III,一个可免费访问的危重病数据库 (2016),科学数据。
m . Hofer,A. Kormilitzin,P. Goldberg 和 A. Nevado-Holgado,医学文本中命名实体识别的少镜头学习 (2018),arXiv:1811.05468【cs .CL】。
E. Hovy,M. Marcus,M. Palmer,L. Ramshaw 和 R Weischedel,onto notes:90%解决方案 (2006),NAACL 人类语言技术会议论文集。
****【23】j . Pennington,R. Socher 和 C.D. Manning, GloVe:单词表示的全局向量 (2014),2014 年自然语言处理经验方法会议论文集。
****【24】w . Yoon,C. So 和 J. Lee, CollaboNet:用于生物医学命名实体识别的深度神经网络协作 (2019),BMC 生物信息学。
****【25】u . Naseem,M. Khushi,V. Reddy,S. Rajendran,I. Razzak 和 J,Kim, BioALBERT:一种简单有效的生物医学命名实体识别预训练语言模型 (2020),arXiv:2009.09223【cs .CL】。
****【26】z . Lan,M. Chen,S. Goodman,K. Gimpel,P. Sharma 和 R. Soricut, ALBERT:一个用于语言表征自我监督学习的 Lite BERT(2019),arXiv:1909.11942【cs .CL】。
****【27】k . c . Fraser,I. Nejadgholi,B. Bruijn,M. Li,A. LaPlante 和 K.Z. Abidine,使用通用和特定领域深度学习模型从医学文本中提取 UMLS 概念 (2019),arXiv:1910.01274【cs .CL】。
****【28】s . Zhang 和 N. Elhadad,无监督生物医学命名实体识别:临床和生物文本实验 (2013),生物医学信息学杂志。
****【29】o . Ghiasvand 和 R.J. Kate,无人工标注的临床命名实体识别的学习 (2018),医学信息学解锁。
****【30】l . De Vine,G. Zuccon,B. Koopman,L. Sitbon 和 P. Bruza,用神经语言模型进行医学语义相似度 (2014),第 23 届 ACM 信息与知识管理国际会议论文集。
****【31】a . l . Beam,B. Kompa,A. Schmaltz,I. Fried,G. Weber,N. Palmer,X. Shi,T. Cai 和 I.S. Kohane,从多模态医学数据的海量来源中学习的临床概念嵌入 (2018),太平洋生物计算研讨会。
****【32】m . c . Phan,A. Sun,Y. Tay,生物医学名称的鲁棒表征学习 (2019),计算语言学协会第 57 届年会论文集。
****【33】a . Liu,J. Du,V. Stoyanov,知识增强语言模型及其在无监督命名实体识别中的应用 (2019),计算语言学协会北美分会 2019 年会议论文集:人类语言技术。
****【34】i̇.Karadeniz 和 a . ozgür,使用单词嵌入和句法重排通过本体链接实体 (2019),BMC 生物信息学。
****【35】e . Shoshan 和 K. Radinsky,潜在实体提取:如何提取文本中没有出现的实体? (2018),第 22 届计算自然语言学习会议论文集。
为什么是 0.9?走向深度学习中更好的动量策略。
思想与理论
更复杂的动量策略如何让深度学习不那么痛苦。
(摘自鲍里斯·波亚克的《最优化导论》)
介绍
动量是一种广泛使用的策略,用于加速基于梯度的优化技术的收敛。动量被设计成在低曲率方向上加速学习,而在高曲率方向上不变得不稳定。在深度学习中,大多数实践者将动量的值设置为 0.9,而没有试图进一步调整这个超参数(即,这是许多流行的深度学习包中动量的默认值)。然而,没有迹象表明这种对动量价值的选择是普遍合理的。
在这篇文章中,我们概述了最近的研究表明,在整个训练过程中衰减动量值可以帮助优化过程。特别推荐一个新颖的恶魔动量衰减策略。为了支持这一建议,我们对动量衰减的不同策略进行了大规模分析,并与其他流行的优化策略进行了比较,证明了使用 Demon 进行动量衰减实际上是有用的。
概述
这篇文章将首先总结深度学习优化的相关背景知识,重点介绍当前训练深度模型的常用技术。在此介绍之后,将介绍并激励恶魔动量衰减策略。最后,我们将对 Demon 进行广泛的实证分析,并与各种流行的优化策略进行比较。 总的来说,我们旨在通过这篇文章证明,通过开发更好的策略来处理深度学习中的动量参数,可以获得显著的好处。
背景
对于任何深度学习实践者来说,训练模型在计算上可能是昂贵的,这并不奇怪。当考虑超参数调整过程时,模型训练的计算费用甚至进一步加剧。例如,当考虑超参数调整时,一些最先进的语言模型可以花费数百万美元在公共云资源上进行训练(参见此处了解更多细节)。为了避免如此巨大的训练费用,深度学习社区必须发现优化策略,这些策略使得 (i) 有助于快速收敛, (ii) 能够很好地概括,并且 (iii) 对于超参数调整(相对)健壮。
带动量的随机梯度下降(SGDM)是一种广泛用于深度学习优化的工具。在计算机视觉(CV)领域,SGDM 被用来在几个著名的基准测试中实现最先进的性能。但是,SGDM 的超参数在众所周知的数据集(如 ImageNet)上是高度可调的,因此,用 SGDM 训练的模型的性能通常对超参数设置很敏感。
为了减轻 SGDM 的弱点,开发了自适应的基于梯度的优化工具,其对模型内的每个参数采用不同的学习速率(即,基于一阶梯度信息的历史)。尽管已经提出了许多这样的自适应技术,Adam 仍然是最受欢迎的,而 AdamW 等变体在自然语言处理(NLP)等领域中很常见。尽管自适应方法的收敛速度有所提高,但它们在历史上一直难以达到与 SGDM 相当的泛化性能,并且仍然对超参数调整相对敏感。因此,即使是深度学习优化的最佳方法也是有缺陷的— 没有一种用于训练深度模型的单一方法总是最佳的。
这能怎么办?
虽然没有单一的优化策略总是最好的,但我们证明了深度学习社区中很大程度上未探索的衰减动量策略提供了改进的模型性能和超参数鲁棒性。事实上, Demon 动量衰减策略与众多领域中流行的学习速率策略(例如余弦学习速率循环)相比,表现出更加一致的性能。尽管最近的一些研究已经探索了超过 0.9 的简单设置的调整动量,但是还没有进行大规模的经验分析来确定训练期间动量参数的最佳实践。通过这篇帖子,我们希望解决这个问题,并使动量衰减成为深度学习优化的一个众所周知的选项。
最佳动量随 Demon 衰减
虽然存在几种衰退势头的选择,但我们推荐恶魔策略,在本文https://arxiv.org/abs/1910.04952中提出。 Demon 在实践中被广泛评估,并显示出优于所有其他动量衰减时间表。在这里,我们花时间来描述这种势头衰减策略,它的动机,以及如何在实践中实现它。
什么是妖?
(图片由作者提供)
众多众所周知的衰变策略,包括恶魔策略,如上图所示,其中 x 轴代表训练从开始到结束的进程。这些策略中的大多数最初是作为学习率衰减时间表而被推广的。然而,在这篇文章中,我们也评估了每一个动量衰减的有效性。与其他衰减时间表相比,恶魔等到训练后期才显著降低动量值。因此,对于大多数训练,恶魔保持动量值接近 0.9,在后期训练阶段迅速衰减为零。 Demon 策略的动机是衰减梯度对所有未来训练更新的总贡献。关于恶魔的动机的更严谨的描述,可以参考的关联论文,它提供了更广泛的理论和直观的分析。下面的等式给出了 Demon 衰变时间表的确切形式。
恶魔衰变时间表(图片由作者提供)
这里,t
表示当前迭代次数,T
表示训练时的总迭代次数,β表示动量参数。因此,上面的等式产生了在 Demon 衰变纲图的训练的迭代t
时动量参数的值。β的初始值代表动量参数的初始值。一般来说,可以使用值 0.9 来初始化β,但是在实践中观察到稍高的值会产生改进的性能(例如,0.95 而不是 0.9)。在所有情况下, Demon 用于将动量参数从训练开始时的初始值衰减到训练结束时的零。
向现有优化器添加 Demon
虽然恶魔的衰变时间表并不复杂,但是确定如何将这个时间表整合到现有的深度学习优化器中并不是立即显而易见的。为了帮助理解如何将 Demon 用于 SGDM 和 Adam 等流行的优化器,我们在下面提供了这些优化器的 Demon 变体的伪代码描述。
SGDM 和亚当中的恶魔(图片由作者提供)
从上面的算法描述中可以看出,SGDM 和 Adam 优化器并没有因为添加了 Demon 而有很大的改变。特别是, Demon 仅用于修改 SGDM 和 Adam 中第一个矩估计(即训练期间随机梯度上的滑动平均)的衰减因子。优化器的其他方面都没有改变,这表明在实践中采用 Demon 实际上非常简单。
代码中的恶魔
实现 Demon 时间表的代码也非常简单。我们在下面用 python 语法提供它。
Python 中的 Demon 代码(图片由作者提供)
恶魔的实验分析
我们在实践中广泛评价妖*。在几个数据集上提供了实验,如 MNIST,CIFAR-10/100,FMNIST,STL-10,Tiny ImageNet,PTB 和 GLUE。此外, Demon 经过了众多流行模型架构的测试,包括 resnet 和 Wide ResNets、非残差 CNN 架构(即 VGG)、LSTMs、变压器(即伯特微调)、VAEs、噪声条件分数网络和胶囊网络。我们使用 SGDM 和 Adam 进行基线实验,每个实验有 10 个不同的学习速率和动量衰减变量。此外,基线实验提供了广泛的最新优化策略,如 YellowFin,AMSGrad,AdamW,QHAdam,准双曲动量和聚集动量。我们的目标是在下一节中总结所有这些实验,并展示使用 Demon 进行动量衰减所带来的好处。*
大局
在执行的所有实验中(即所有数据集、模型和优化策略组合),我们记录了与所有其他优化策略相比,每个优化策略产生前 1 或前 3 性能的次数。直观地说,这种度量反映了优化策略在模型和领域中的一致性。下面给出了最佳性能优化策略的性能统计数据。
不同优化策略的前 1 名和前 3 名性能比率(图片由作者提供)
从上面可以看出, Demon 在不同的域中产生了极其一致的性能。特别是,它在近 40%的实验中产生了任何优化策略的最佳性能——比第二好的余弦学习率时间表绝对提高了 20%。此外, Demon 与其他优化器相比,在超过 85%的总实验中获得了前 3 名的性能,这表明 Demon 即使不是最好的,也仍然表现良好。
有趣的是,除了与许多广泛使用的优化策略相比产生更一致的性能之外, Demon 在动量衰减方面明显优于其他调度。事实上,在所有实验设置中,任何其他动量衰减策略都无法实现顶级性能。这一发现强调了这样一个事实,即当选择适当的衰变策略时,动量衰变是最有效的。基于这些结果,恶魔显然是那些被考虑的最佳动量衰减策略。
详细的实验结果
Demon 已经在多个不同领域的众多模型和数据集上进行了测试。在这里,我们提供了使用 Demon 运行的所有实验的详细结果。对于这些实验中的每一个, Demon 都与众多基准优化方法进行了比较(如本节开头所述)。应该注意的是,下面显示的实验结果用于生成上面概述的汇总统计数据,从而揭示出 Demon 具有迄今为止所考虑的任何优化方法中最一致的性能。
(图片由作者提供)
(图片由作者提供)
超参数稳健性
除了加速训练和推广之外,降低超参数敏感性的优化策略也是需要的,因为它们可以减少超参数调整的需要,这在实践中是计算昂贵的。我们通过记录各种可能的超参数的模型性能(即测试精度),评估了 Demon 相对于 SGDM 和 Adam 优化器(即深度学习中最广泛使用的优化器)对不同超参数设置的鲁棒性。
超参数稳健性结果(图片由作者提供)
从左到右,上面描述的实验是在 STL-10 上使用 SGDM 的 Wide ResNet,在 CIFAR-100 上使用 SGDM 的 VGG,以及在 CIFAR10 上使用 Adam 的 ResNet-20。 Demon 性能显示在顶行,而普通优化器(即 SGDM 和 Adam)的性能显示在底行。较浅的颜色表示较高的性能,并且单独的模型被训练以在上述每个瓦片内生成测量值。对于测试的所有实验设置,可以看出,在训练期间使用 Demon 会在不同的超参数设置中产生明显更大的光带。例如,在 STL-10 数据集上, Demon 除了与 SGDM 相比实现了更好的顶级性能之外,在每一列中平均有 5-6 个浅色瓦片,而 vanilla SGDM 只有 1-3 个(大致如此)。这些结果表明 Demon 在大范围的超参数上产生了合理的性能,这意味着它对超参数调整更加鲁棒。
其他值得注意的实证结果
对恶魔的实验支持是巨大的,我们推荐任何对具体实验指标和结果感兴趣的人参考的论文。然而,有几个关于恶魔的额外实验结果特别值得一提。
微调用恶魔上胶
变压器模型是深度学习中训练计算量最大的模型之一。为了测试使用 Demon 是否可以提高变压器的性能,我们使用 Demon 和 Adam 对 BERT 进行了微调。结果如下所示。
恶魔大战胶水上的亚当(图片由作者提供)
可以看出, Demon 在 GLUE 数据集上的 BERT 微调方面优于 Adam。此外,为了实现这些结果,不需要对 Demon 进行额外的微调。我们只需使用其他实验中使用的相同超参数,并以最小的努力获得更好的性能。这个结果很有趣,特别是因为 Adam,它是 NLP 领域中的一个首选优化器,已经在 GLUE 数据集上进行了广泛的调优。
定性结果为 NCSN
NCSN 在 CIFAR-10 上的初始得分(图片由作者提供)
我们发现在 CIFAR-10 上训练的噪声条件得分网络 (NCSN)在数量上优于 AdamDemon*,如上表所示。然而,当用 Adam 和 Demon 训练的模型的结果被定性地检查时,我们注意到一个有趣的模式。*
亚当(左)和恶魔(右)的 NCSN 结果(图片由作者提供)
从上面可以看出,用亚当训练的 NCSN,尽管获得了稍微提高的盗梦空间分数,但产生了看起来不自然的图像(即,所有图像看起来都具有绿色背景)。相比之下,用恶魔训练的 NCSN 产生的图像看起来明显更真实。
结论
深度学习社区的大多数从业者将动量超参数设置为 0.9,并将其遗忘。我们认为这不是最优的,通过采用更复杂的动量策略可以获得显著的收益。特别是,我们介绍了 Demon 动量衰减时间表,并证明与许多其他广泛使用的优化器相比,它产生了显著改善的经验性能。 Demon 非常容易使用,我们鼓励深度学习社区尝试一下。关于这篇文章没有包括的更多细节,请随意阅读为恶魔写的论文。
非常感谢你阅读这篇文章,非常感谢你的任何反馈。对于任何有兴趣了解更多类似研究的人来说,本文中介绍的项目是由莱斯大学计算机科学系优化实验室进行的。查看此处了解该实验室的更多细节,该实验室由Anastasios Kyrillidis博士领导。
为什么数据科学导师可以在 2022 年帮助你
办公时间
从数据科学导师那里学到的两年经验
拥有一个数据科学导师可以帮助你提升你的职业和教育。当我刚开始作为一名数据科学家工作时,我有两位导师。一个是经验丰富的数据科学家,从团队成立之初就一直在团队中,而另一个是技术人员,想要指导年轻女性。从那以后,作为我职业发展的一部分,我一直在学习如何指导个人、管理团队以及与团队分享愿景。
最近,我在演讲会上做了一个名为的演讲,一次推挤。根据《柯林斯字典》的解释,push comes 的意思是“当事情变得危急时……需要做出决定。”通常,你会对你的职业生涯做出决定,你是否需要导师不应该是其中之一。所以,让推来推去,找到导师!今天,我想和你们分享过去一年我从导师那里学到的一些最重要的经验。
1.你是哪种类型的贡献者?
当我第一次开始在数据领域的旅程时,我和一位资深数据科学家坐在一起,问他我可以做些什么。在这次谈话中,他问了我一个很重要的问题:你现在是什么类型的贡献者,你想在哪里?当时,我的回答含糊不清,但现在回想起来,我对自己的目标有了更清晰的认识。当你刚加入一个团队或公司时,可能很难知道你希望你的职业生涯走向何方。但这是当时我能被问到的最好的问题。
当你和你的导师在一起时,问问他们职业发展和目标。例如,在你的团队和公司中,不同的职业道路是什么样的?你如何为你职业生涯的下一步做准备?一位导师可以帮助你回答这些问题,并问你一些你可能不会问自己的难题。
现在我已经在我的道路上走了几年,我对我想去的地方和我想做的工作类型有了更好的想法。我可以在与我的新导师一起工作时回答这些问题,并针对我工作的具体公司提出这些问题。如果我没有我的第一位导师,他推动我探索我的选择,我不知道我现在是否会对我的职业目标有如此好的把握。所以利用你的机会,找一个好的导师帮你发现你的道路。如果你觉得在你的团队中找不到合适的人,那就在你的公司或者你所在的行业中寻找可以和你一起工作的人。不要害怕伸出手去问别人。
**为什么需要导师?**他们会问你一些尖锐的问题,要求你反思自己的决定和下一步行动。你的导师可以帮助你更好地了解你在工作和职业中想要什么。你可能会改变你的想法,但是如果你有一个适当的计划,你可以朝着它努力。
2.展示并理解你的附加值
要学的最具挑战性的一课是理解我的项目和工作所带来的附加值。这在与商业利益相关者合作时尤为重要。这些利益相关者想知道你给企业增加了什么,以及他们如何利用它。
当我学习如何展示附加值时,我遇到的最大的绊脚石是解释我的工作成果。我经常展示我完成一项任务的行动,比如我在 sprint 中完成的用户故事。但这不是人们想看到的。相反,他们想看到你的结果摘要。例如:
- 你的模型的准确性提高了吗?如果是,改善的程度和影响是什么。
- 您是否自动化或简化了流程?这项工作节省了多少时间?清理一个流程节省了多少钱?
像这样跟踪指标对于展示您的工作、展示您的影响以及跟踪您的进展来说是一笔宝贵的资产。如果我没有一个导师来帮助我理解这种分析的重要性,我不相信我会这么快获得这种技能。导师是宝贵的资产,他们可以帮助你学习你可能从未考虑过的技能。
**你为什么需要一个导师?**在工作中有一个紧密合作的导师可以帮助你获得宝贵的技能,比如学习跟踪项目的绩效。此外,他们可以教你如何向利益相关者积极展示你的工作,并分享它如何为企业增加价值。
3.讲述你的故事
在这一年中,我在自己撰写的文章或发表的演讲中与共事过的学员分享了我的故事。在这段时间里,我也和我的导师们谈论了我的经历和我可以改进的地方。
我的导师给我的最重要的建议之一就是讲述你的故事。
你知道你是谁,你完成了什么,你从你的经历中学到了什么。但是你能和别人分享吗?即使你觉得自己的职业生涯才刚刚开始,你也已经学到了可以分享的经验和见解。这是我开始用媒体写作的主要原因之一。即使我才大学毕业几年,我仍然可以尝试帮助其他人,他们可能没有像我一样的机会去学习新的东西。通过这些对话,我意识到我有一些我经常说的经验,可以很好地转化为书面形式,我打赌你有!无论是公开演讲,文章写作,指导,还是其他形式的交流,分享你的故事。
**为什么需要导师?**当你思考他们提出的挑战性问题并对你们的讨论进行反思时,指导关系可以帮助你更多地了解自己。随着你成长为一名数据科学家,导师还可以教你如何展示你的故事和发展你的个人品牌。
最后的想法
数据科学领域的导师可以教你很多东西。一位导师可以在你的项目中帮助你,提供反馈,并在你需要帮助时帮助推动你前进。考虑在 2022 年找一个导师,尤其是如果你是从数据科学开始的话。当你在自己的岗位上学习和成长时,找到一个会为你辩护和支持你的人会是一笔宝贵的财富。这里有三个问题你可以问你的导师:
- 你是什么类型的贡献者,你想成为什么样的贡献者?考虑你在职业生涯中想要什么,并与你的导师讨论如何才能实现。2022 年或者未来几年,你的职业生涯如何才能走到下一步?
- 你如何最好地向企业和利益相关者展示你的增值?你能获得什么结果,那是怎样的积极影响?
- 你如何发展你的个人品牌并与他人分享你的故事?如何开始把自己学到的东西教给别人?
在过去的一年里,你从导师那里学到了什么?你在考虑 2022 年的导师吗?
感谢阅读!我希望你喜欢阅读我今年学到的东西。如果你愿意,你可以通过使用这个链接成为一个媒体成员来支持我的写作。
为什么阿德和 FDE 不是运动预测的最佳指标
行业笔记
最流行的运动预测度量的缺点和可能的替代方法。
[图片由作者提供]
介绍
现代自动驾驶技术通常意味着三种任务:感知、预测和规划任务。感知提供关于周围环境、静态和可移动障碍物的信息。预测提供了观察到的可移动物体的未来轨迹。在规划期间,该信息被处理,然后创建相对于机器人目标的未来轨迹。
首先检测周围物体(感知),然后预测其未来轨迹(预测)然后规划机器人路径(规划)[图片由作者提供]。
预测方法有很多种,大部分都是产生一个或几个预测轨迹。为了获得预测的质量度量,应该将预测轨迹与地面真实轨迹进行比较,为了做到这一点,有多种可能的度量可用。原则上,它可以是任何能够比较两个时间序列的函数,例如,最长公共子序列或豪斯多夫距离。
预测和地面真实轨迹的例子。为了评估预测的质量,应该将它们与一些度量标准进行比较。
最常见的度量是平均位移误差(所有轨迹点之间的平均 L2 距离)和最终位移误差(最终轨迹点之间的 FDE - L2 距离)。
平均位移误差(ADE)和最终位移误差(FDE)[图片由作者提供]。
这些指标很容易计算,也相对容易解释,但是它们有一些潜在的缺点,我想在这篇博文中讨论一下。首先,让我们从平面的角度来看一个预测轨迹的质量。
规划者视角
一般来说,规划者的任务之一就是避免与周围物体发生碰撞。从这个角度来看,如果预测的轨迹导致与自我-智能体路径相同的交集,这是一个很好的预测。在这种情况下,规划者可以根据预测采取行动,避免进一步的碰撞。如果预测的轨迹与未来的自我-代理路径完全不相交,但地面真相相交,则可以视为最坏的情况。在这种情况下,计划者可能不会行动并击中目标。介于两者之间的情况可能会导致更安全的情况(如预测更早的交叉口)和更危险的情况(如预测更晚的交叉口)。
机器人可能会与有交点的轨迹对齐,而忽略没有交点的轨迹[图片由作者提供]。
因此,这里的要点是,预测应该提供与机器人的规划路径尽可能接近地面事实的交集。
艾德和 FDE 怎么了
阿德和 FDE 没有考虑所提供的交叉点是否接近地面真相,此外,这两种度量标准可以对指向相反方向的轨迹进行相似的评分。为了说明这一点,我们来看下面的动画:
具有相同 ADE 分数的轨迹子集[图片由作者提供]。
考虑一些任意的地面真实轨迹(蓝点)。有一个具有相似 ADE 分数的轨迹子集,该分数在动画的每一步都从 0 到 5m 变化。可以看到,有许多轨迹指向不同甚至相反的方向,但这些轨迹与更长但指向正确方向的轨迹得分相同。FDE 度量表现类似。
此外,FDE 还有一个额外的缺点,它可以完全错误的轨迹得分。考虑下面的图像:
两条轨迹都有一个相似的终点[图片由作者提供]。
在这里,FDE 得分的值最低,为 0。但是预测的轨迹并不完美。这些缺点使得创建另一个没有这些属性的指标成为明智的选择。
我们能做些什么呢?
把轨迹的“相交能力”考虑进去,似乎是合理的。最直接的方法可能是测量到地面真实交点的距离,但这很难,因为它取决于机器人的规划路径。此外,这种度量没有考虑没有交叉点的轨迹的质量。那么如何才能在交集能力上建立代理呢?
我们可以把一个轨迹的相交能力看作它可以相交的轨迹集的大小。这样一个集合是无限的,为了使它易于处理,我们可以通过限制离轨迹的距离来考虑它的子集。通过这样做,可以在轨迹周围创建一个缓冲区,该缓冲区可以作为相交能力的代理。
可作为轨迹相交能力代理的轨迹周围缓冲区示例。缓冲区越大,可以相交的轨迹就越多。
通过这种方式,轨迹可以表示为由轨迹本身和缓冲区大小定义的多边形。因此,可以计算地面真实值和预测轨迹之间的交集联合分数来比较它们。
将轨迹表示为多边形。现在可以计算 IoU 来比较轨迹[图片由作者提供]。
这种度量具有几个期望的属性:
- 它始终在范围[0,1]内。1 是最佳匹配。
- 如果预测轨迹指向与地面实况相反的方向,则得分为 0。这就像有一个内部失误率,并惩罚完全错误的预测。
- 人们可以改变缓冲区的大小,改变它对错误预测的惩罚力度。
缓冲器的大小可以由自车的典型规划范围来确定,然后可以针对期望的属性进行调整。例如,让我们来看看三种不同缓冲区大小具有相同分数的轨迹子集:
具有相同 IoU 分数的轨迹子集[图片由作者提供]。
只有非常接近地面实况的轨迹对于小的缓冲区大小具有高的分数。缓冲区的大小越大,分数相同的轨迹范围就越大。具有低 IoU 的分数对应于至少前几个点接近地面真实情况的轨迹。等于 1 的分数总是对应于与地面真实情况完全匹配的轨迹。这种度量没有上述阿德和 FDE 的缺点,可以从另一个角度用于预测比较。
结论
理解性能指标的行为总是很重要的,运动预测任务也不例外。最常见的度量标准,如 ADE 和 FDE,提供了关于模型性能的有用信息,但也有一些限制和缺点。为了将这些限制考虑在内,人们不应该只受这些度量的限制,而应该从不同的角度,尤其是从那些可以相互补偿的角度来估计预测性能。所提出的度量可以用来代替经典的 FDE 或 ADE,或者作为评分预测的补充度量。根据您的应用程序的特定需求创建一组指标,并可视化一组具有相似分数的轨迹以更好地理解您的指标,这可能是一个好主意。
为什么人工智能伦理学需要文化驱动的方法
许多组织都缺少一大块:通过合作建立代表原则的文化。
蒂姆尼特·格布鲁(Timnit Gebru)是一名埃塞俄比亚裔美国人,以其进步的人工智能伦理研究而闻名,他是谷歌伦理人工智能团队的联合负责人,周四在一条推文中表示,她因一篇强调人工智能偏见的研究论文而被谷歌解雇。虽然人工智能伦理研究人员和社会学家表达了他们对这一举动的担忧,但在当前组织对人工智能伦理的方法中存在着明显的差距。那就是合作建立文化来代表人工智能伦理原则。
数据或技术的所有权或使用权总是不平衡的,一边是经济和政治,另一边是权利和透明度。由于对偏见、政治影响、仇恨言论和歧视的担忧,技术伦理(人工智能伦理)正在成为全球科技企业在平台或产品伦理和负责任的人工智能方面的董事会议。
学术智库和技术巨头已经开发并分享了人工智能伦理的几个框架和原则。像谷歌和脸书这样的公司已经公开了他们的道德原则,并启动了一个分享见解的过程,分享他们在当前时代用什么和如何处理关键的道德问题。通常,框架或公司原则试图涵盖许多主题(如果不是全部的话),包括隐私、不歧视、安全和安保、问责制、透明度和可解释性以及保护人类价值。
聚焦人工智能伦理
公司的努力围绕三个主要领域发展:( a)建立原则、政策、指南、清单和焦点小组,以处理人工智能伦理,包括负责任的人工智能领导者和/或产品经理;(b)开展研究,以了解关键的道德问题并找到解决方案,(必要时利用或配合学术/学者的支持),并定期发布或分享有关努力或研究成果的最新情况;©使战略和倡议与人工智能伦理原则相一致,并在某些情况下带来或建立工具来帮助整个社区解决选定的伦理挑战。
这些努力虽然值得称赞,但极其有限。这些努力中有许多是由少数个人或群体做出的,公平和责任的定义是非常动态的或不断发展的,并且这些努力是针对最明显的挑战。它没有解决组织内存在的相互冲突的方法。这其中缺少了一大块,那就是合作建立文化来代表原则。
缺失的缺口
关于人工智能中的伦理,我们揭露的挑战比实际上要少。当 Joy Buolamwini 在 2017 年的 Ted 演讲(我如何与算法中的偏见作斗争)中发言时,使用面部识别的组织开始重新审视他们的产品和这类产品中固有的偏见。算法中的偏见并没有就此结束,随着越来越多的模型被开发,越来越多的数据被注释,越来越多的用例被识别,它还在继续。作为一个社会,我们天生就有偏见,并试图在某些方面采取初步措施来恢复(例如男女薪酬平等)
虽然政策和原则是一个很好的开始,但培养这种文化可能是持久的;人们有着共同的使命,并自愿与负责任的行为保持一致。文化不能用一套任务来建立;对于那些已经将人工智能伦理原则确立为他们的目标的组织来说,他们需要着眼于朝着它前进。这一进程将需要协调一些因素,包括信念(接受某事存在/为真,无需证明)、感知(理解或看待某事的方式)、身份(决定某人/某事是谁或什么的特征)、意象(视觉象征)、判断(结论或意见)和为任务协同工作的利益相关者的情绪(本能或直觉)。
人工智能伦理的文化驱动方法
这些因素可能都不仅仅取决于事实。这些因素中的每一个都对我们个人和集体的思想和行为产生独立或相互依赖的影响。让我们看看关键因素,以及影响这些因素是如何驱动文化现象的:
1。培养对道德准则的更广泛的情感:
情绪是公司所代表的原则的强有力的传达者和影响者。他们在宏观层面上是有效沟通的推动者,在个人层面上,它激发了许多携带这种原则情感的个人的自豪感和人生目标。结构化的交流和参与故事,生活经历,努力使社会的一部分从父权制中发展出来,是情感可以发展的一些方式。当对人工智能伦理的规定原则采取行动和努力时,情绪能够产生积极的神经反应,并对偏离这些原则表现出消极的神经反应,从而起到威慑作用。
2。向组织灌输对道德原则的信念
信念和感知很重要,因为员工并不总是了解组织对人工智能伦理原则的感受有多深。灌输共同的信念和认知需要战略方法来塑造与目标同步的商业模式,协调各级领导,设计沟通和展示代表性行为。例如,如果利益相关者不认为一个组织解决歧视问题的努力是有限和不可靠的,那么上述努力(原则、政策、研究等)对他们的影响将是有限的。
如果组织期望员工和利益相关者以某种方式行事,就有必要注意灌输这些信念。要做到这一点,可以将道德原则作为员工和利益相关方目标的一部分,或者确保道德原则成为利益相关方的关键战略讨论点。例如,Martin Fishbein 和 Icek Ajzen 在他们的“理性行动理论”中提到,行为的意图先于实际行为,这种意图是相信实施这种行为会导致某些结果的结果。这些反过来帮助组织创造一个环境,帮助人们提高他们对组织应该代表的价值观和原则的声音,从而引导方向。
3。不断丰富信念和情感
灌输信念和情绪的方法本身不会有显著的影响,除非这种努力是一致的。在这种情况下,保持一致并不局限于做同样的事情,而是通过每一次尝试来丰富其中的努力。例如,确定或创新与员工和利益相关者互动的方式,将故事讲述与真实世界的见解/事件联系起来等。Eric Van den Steen 在他的研究(“共同信念的起源”)中提到,人们更喜欢与分享他们信念和假设的人一起工作,因为这样的人“会做正确的事情”,并坚持认为信念会随着共同学习的时间而演变。这种方法必须渗透到新员工,包括横向招聘、第三方和业务合作伙伴,尤其是董事会和高级管理层。
结论
在某些方面,在人工智能伦理问题上保持沉默可能会反映出组织的不良表现,并表现出共谋,正如在 Gebru 的案例中可以看到的那样。这与组织内外沟通方式的语义差异无关。着眼于灌输共同的信念或实现积极的感知,并创造一种对人工智能道德的令人信服的情感,这不仅是必不可少的,而且是品牌和业务蓬勃发展的必要条件,因为与既定原则/价值观不一致的声誉的负面影响可能是灾难性的。因此,有必要对人工智能伦理有一个整体的看法,并通过向各种利益相关者灌输价值观来合作建立负责任的人工智能或人工智能伦理文化。
此前发布于 Linkedin Pulse ( 此处)
为什么算法不公平?
旅行、移动和交付服务平台的试金石
资料来源:Freepik.com
近年来,旅游(票务)、移动(交通网络和打车平台)和送货服务平台已经成为一种常态,不用说,我们许多人都非常感谢《新冠肺炎时报》对他们的支持。凭借深厚的技术基础、整合的生态系统观点和满足客户需求的努力,他们已经成为 gig 经济的重要贡献者。此外,这些应用与数以百万计的用户和数以千计的合作伙伴有着内在的联系,能够满足他们的旅行、移动和交付需求。这种应用程序的算法公平性是必不可少的。它承担了更多的重要性,因为许多这些算法是无人监督的,给定的超实时行动不能被人类界面监控。
上周,在欧洲多个国家开展业务的在线食品配送公司 Deliveroo 被意大利一家法院勒令支付 5 万欧元,原因是该公司使用了一种歧视性的算法来对其骑手进行排名。有问题的算法,一个声誉排名算法,对违反当地劳动法的 gig 递送工人进行排名。例如,该算法根据送货工人的出勤情况对他们的声誉进行排名,而没有考虑可能受法律保护的原因,包括骑手生病。
虽然 Deliveroo 回应说,这一判断是基于一种假设的可能性,而且他们最近没有使用有问题的算法,但问题仍然存在:旅行、移动和交付服务平台算法公平吗?
Gig travel、mobility 和 delivery 公司使用机器学习和人工智能进步作为其商业模式的核心元素,以应对环境中的紧迫挑战。开发这些算法是为了解决特定的问题陈述,并且在许多方面局限于实现这样的目标。为了提高性能,使用了一层优化技术来为所述目标获得最佳的可用结果。
首先,目标可以是用另一个内在条件来解决问题陈述(例如,应该导致更好的收入)。例如,一个旅游票务应用程序总是推荐价格较高的座位作为首选座位,而不是价格较低的座位。在这种情况下,算法的目标是通过在预订时尽早选择座位来简化旅行。然而,该算法似乎被限制为促进优质座位的选择。类似地,出租车聚合器提供了一个选项,只需点击一个按钮,就可以预订任何可用类别的出租车(经济舱/高级舱)。然而,当点击时,它总是预订一个高级类别,而不是经济舱,尽管经济舱是可用的。
第二,例如,目标可以是为驾驶员更好地分配乘车,或者为顾客减少预计到达时间(ETA)。实际上,这些目标不一定是算法开发的相互包容的目标,除非减少的 ETA 是游乐设备分配的一个影响因素。
让我们考虑一个平台正在寻求提高驱动程序合作伙伴的收入(其中一部分将是公司收入),可能有几个目标,一个或多个数据科学家可能会关注。它们包括激励忠诚度、更好的乘车分配、优化路线和司机定价。为了激励忠诚度,可能存在定义驾驶员忠诚度的排名算法,该算法考虑包括日常活动、登录时间(供应时间)、获得的终身价值(LTV)和客户评级在内的指标。实际上,这些排名将受各自国家劳动法规的约束,可能不会像 Deliveroo 的情况一样,歧视司机缺席(未登录平台)的合法原因。此外,通过向排名高的驾驶员提供激励,追求使这些驾驶员优先于其他驾驶员的无限循环,其中后者将在一段时间内受到歧视或劝阻。这是导致人们注意到预测性监管算法表现不公平、边缘化某些教派的相同背景。
类似地,智能分配乘车目标将具有层,这些层是有助于某些结果的算法。这些可能包括在前往司机首选目的地的途中分配乘车,或通过取消需要司机注意掉头的预订来限制取消。在后一种情况下,目标(限制取消)是通过引入约束(消除预订)来实现的。在上述案例中,考虑到目标不需要相互包容的现实,这可以被认为是对贫困客户的歧视。
此外,动态价格优化或社会验证方法,如果不试图平衡司机合作伙伴和客户的目标,可能会对另一方产生歧视或偏见。此外,使用从司机伙伴和客户/用户的设备中挖掘的数据来预测竞争信号(无论司机是在另一个平台上驾驶还是客户在另一个平台上乘坐),本质上与数据道德和竞争实践相冲突。
这种算法公平性的问题是由许多原因造成的,包括代表性不足或不平衡的数据集,算法的有限集体观点,或组织内跨团队分层的多样化或冲突的目标或选择。
虽然新兴的研究人员试图优化算法以平衡一个或多个目标的结果,但平衡所有目标似乎并不明显。此外,这种平衡所有可能出现歧视的因素的方法不会成为旅游、移动或递送公司的首选商业选择。如果它不是首选的商业选择,它将不会为他们提供足够的激励来投资于会影响其延迟的计算密集型优化模型。
针对这种广泛使用的应用程序的自我调节算法公平性的努力对于保护对这种问题没有既定理解的利益相关者是至关重要的。与此同时,算法公平行动主义、监管框架、算法审计和社会影响商业模式应该也将有助于从当前阶段取得进展。在那之前,算法的歧视仍将不可避免。
为什么(以及如何)将笔记本投入生产
使用现代开源工具部署、测试和调试 Jupyter 笔记本电脑。
Jupyter 实验室截图(鸣谢:【jupyter.org】T2)
将笔记本和生产放在同一个句子中,肯定会引发一场激烈的网上辩论。这个话题经常出现,经常听到团队完全放弃笔记本电脑,因为它们不是用于生产的。不幸的是,讨论经常集中在当前工具已经解决的问题上,但是对于许多从业者来说,解决方案仍然是未知的。这篇文章展示了如何克服 Jupyter notebook 的一些限制,提出了一个工作流程来简化它们在生产中的使用,并讨论了仍然需要解决的问题。
笔记本的简史
计算笔记本的起源来自唐纳德·克努特介绍的识字编程。其核心是,这种思想提倡编写将源代码和文档交错的程序,以使程序更具可读性。笔记本电脑通过添加其他功能,如嵌入式图形和交互式代码执行,扩展了这一理念。
结合这三个元素(将代码与文档交错、嵌入图形和交互性)为数据探索提供了一个强大的界面。真实世界的数据总是带有特殊性;交叉文档有助于指出它们。数据模式仅在通过嵌入图形可视化数据时出现。最后,交互性允许我们迭代我们的分析,以避免每一次改变都要从头开始。
笔记本的问题
到目前为止,我还没有特别提到任何笔记本的实现。有多种风格可供选择,但是对于这篇文章的剩余部分,我将参考 Jupyter 笔记本。
为了支持交错文档,Jupyter 支持 Markdown 单元格。对于嵌入式图形,Jupyter 使用 base64 序列化图像,对于交互性,它公开了一个 web 应用程序,允许用户添加和执行代码。
这种实现决策有很大的副作用:
- **文件大小。**如果笔记本包含图像,文件大小会大大增加,很快就会破坏 git 存储库。
- 版本控制。
.ipynb
文件是 JSON 文件。git diff
输出版本之间难以辨认的比较,使得代码审查变得困难。 - **隐藏状态。**由于用户可以以任意顺序执行代码,这可能会产生中断的代码,当顺序运行单元时,其记录的输出不匹配。
- 测试/调试。鉴于笔记本的交互性,代码行增长很快。很快,你就会得到一个有一百个难以测试和调试的电池的笔记本。
文件大小和版本
前两个问题是.ipynb
实现的结果。幸运的是,它们很容易用当前的工具解决。例如,如果我们可以在 git 上存储相对较大的文件,我们可以配置 git 使用不同的算法为.ipynb
文件生成 diff 视图, nbdime 允许我们这样做。
如果我们关心 git 版本和文件大小,我们可以完全替换.ipynb
格式。 Jupytext 允许 Jupyter 将.py
(以及其他)文件作为笔记本打开;警告是任何输出都会丢失,因为.py
文件不支持嵌入图形。但是,您可以使用 jupytext 配对特性将输出保存在一个单独的文件中。
大多数人都不知道 Jupyter 不知道底层的文件格式。感觉像笔记本的东西并不意味着一定是 **.ipynb**
**文件。**改变底层文件格式解决了大小和版本问题;让我们来关注一下真题:隐藏状态。
隐藏状态
Jupyter 允许用户交互地添加和执行代码单元。当处理新数据集时,这非常有用。它使我们能够探索和清理我们的数据,同时保留迄今为止我们所执行的记录(代码和输出)。但数据探索过程多是试错;我们经常修改并重新执行以前的单元格,导致单元格的历史不是线性的。最近,一项对 GitHub 上 1000 万台笔记本的分析发现,36%的 Jupyter 笔记本拥有以非线性顺序执行的单元。
笔记本的隐藏状态是迄今为止对笔记本最重要的(也是最有效的)批评。这是笔记本的悖论:任意的单元格执行简化了数据探索,但是它的过度使用经常产生不可复制的代码。图片作者。
调试/测试
笔记本的隐藏状态是迄今为止对笔记本最重要的(也是最有效的)批评。这是笔记本的悖论:任意的单元格执行简化了数据探索,但是它的过度使用经常产生不可复制的代码。
但即使是完美的线性笔记本也有其他问题;主要是它们很难调试和测试。这有两个主要原因。首先,笔记本是有机进化的,一旦它们变得足够大,就会涉及太多的变量,以至于很难对执行流程进行推理。第二个原因是笔记本内部定义的函数不能进行单元测试(尽管这正在改变),因为我们不能轻易地将.ipynb
文件中定义的函数导入测试模块。我们可能决定在一个.py
文件中定义函数,并将它们导入到笔记本中来解决这个问题。尽管如此,如果没有正确完成,这将导致手动编辑sys.path
或PYTHONPATH
,从而导致其他问题。
笔记本中原型问题然后被重构用于生产
考虑到这样的问题,团队不允许在产品代码中使用笔记本是很自然的。常见的做法是使用笔记本进行原型制作,并将代码重构为模块、函数和脚本进行部署。通常,数据科学家负责原型模型;然后,工程师接手,清理代码并部署。重构笔记本是一个痛苦、缓慢且容易出错的过程,会给数据科学家和工程师带来摩擦和挫折。
在正常的重构过程中,工程师会做一些小的改动并运行测试套件,以确保一切都正常工作。不幸的是,数据科学家的代码很少附带全面的测试套件(为数据科学家辩护:当你的工作成果以你的模型有多好来衡量时,很难考虑代码测试)。缺乏测试极大地增加了重构过程的难度。
另一方面,软件项目需要维护。虽然工程师可能能够做到这一点,但数据科学家最适合完成诸如模型重新训练之类的任务。重构过程发生后,即使是编写原始代码的数据科学家也很难浏览工程师部署的重构版本。更糟糕的是,由于代码已经不在笔记本中,他们不能再交互地执行它。最终发生的是生产代码和新开发笔记本之间的大量复制粘贴。
如您所见,这是一个低效的过程,经常会导致管道中断,并大大降低部署更新所需的时间。所有这些都造成了过度的负担,在某些情况下,导致公司由于高昂的维护成本而放弃机器学习项目。
在生产中拥抱笔记本电脑
对于我职业生涯中完成的大多数机器学习项目,我负责端到端的过程:探索数据集以创建新的模型特征,训练模型,并部署它们。我亲身经历过这种痛苦的重构过程,我不得不在笔记本环境和产品代码库之间来回移动。在我与数据打交道的最初几年,我认为这个问题是理所当然的,并学会了忍受它。然而,随着我开始参与更重要的项目,这种方式对我来说风险太高,我无法继续工作,我开发了一个工作流程,让我在很大程度上克服了这些挑战。
在设计这个工作流程时,我把简单放在第一位。数据科学团队必须快速行动,因为他们的工作本质上是实验性的。这种方法不是最终的解决方案,但它是对当前实践的巨大改进。笔记本电脑和机器学习工具有很大的创新空间,可以支持一个工作流,为数据科学家提供交互式开发的能力,同时允许他们在部署过程中更好地与工程团队合作。
工作流摘要
提议的工作流程如下:
- 将脚本用作笔记本。
- 每个
git push
上有一个数据样本的冒烟测试笔记本。 - 在多个小笔记本中分解分析。
- 打包项目(即添加一个
setup.py
文件)。 - 从笔记本之外的功能中抽象出逻辑片段,用于代码重用和单元测试。
现在让我们详细讨论每一个。
切换底层格式:作为笔记本的脚本
如前所述,.ipynb
格式不能很好地与 git 兼容。然而,Jupyter 的架构允许使用替代文件格式。 Jupytext 使用户能够将.py
作为笔记本打开,有效地解决了 git 版本问题,方便了代码审查。数据科学家可以从 Jupyter 交互开发他们的代码,但是存储库将只包含.py
文件。本文的其余部分继续使用术语笔记本,但是请记住,我们指的是与 Jupyter 兼容的 Python 脚本。
隐藏状态、测试和调试
这三个问题高度相关,解决起来更具挑战性。与任何其他软件项目一样,解决方案在于开发模块化和可测试的代码。然而,面临的挑战是如何将其应用于高度不确定的环境,这种环境需要快速迭代,并采用 Jupyter 笔记本作为其主要开发工具。
我们希望实现以下目标:
- 每一次代码变更都要做测试笔记。
- 在多个小型笔记本中分离逻辑。
- 模块化数据转换,并分别进行测试。
测试笔记本
由于运行时的原因,测试数据处理代码本身就具有挑战性。我们不能在每次变更时都运行所有的处理代码,因为这可能需要几个小时才能完成。幸运的是,我们可以用少量数据检测最常见的错误:缺少列、错误的数组形状、不兼容的数据类型等。因此,一个有效的策略是在每次推送时使用数据样本运行所有笔记本,以消除笔记本损坏的可能性。然而,由于我们没有测试笔记本电脑的输出,这是不健全的;但是随着项目的成熟,我们可以加入更多完整的测试。如果你想了解更多关于测试数据科学管道的信息,请查看我在 PyData 2020 的演讲。
要自动执行笔记本,我们可以使用 papermill 或 nbclient 。注意,由于我们转换了底层格式,我们必须使用 jupytext 将.py
文件转换回.ipynb
,然后执行它们。
在多个小型笔记本电脑中分离逻辑
模块化代码是软件工程中的常规实践,因为它使代码更易测试和维护。然而,数据科学家在一个笔记本上编写整个项目的代码是很常见的。为什么?方便。一旦您将一个项目分解成多个部分,您就必须处理需要数据科学家额外工作的技术难题,在某些情况下,这种工作超出了他们的专业领域。简化模块化过程是 dbt 蓬勃发展的原因(以及许多其他原因):它允许数据分析师将庞大的 SQL 脚本分解成多个部分,组装成一个连贯的管道。我们可以把同样的逻辑应用到笔记本上。
笔记本模块化是大多数工具的不足之处。虽然许多工作流程编排者支持笔记本执行,但他们并没有让这个过程变得愉快。帮助数据科学家(包括我自己)编写更易维护和模块化的管道是我创建 Ploomber 的主要动机。
Ploomber 允许数据科学家分两步从多个笔记本电脑创建数据管道:
- 在一个
pipeline.yaml
文件中列出笔记本。 - 通过引用其他笔记本的名称来声明笔记本依赖关系。
例如,典型的pipeline.yaml
如下所示:
得益于 Ploomber(和 jupytext)插件,Jupyter 将.py
脚本识别为“笔记本”;因此,数据科学家可以交互开发。然而,在执行过程中,Ploomber 将它们转换为.ipynb
并执行它们,从而允许我们将源(.py
)和输出(.ipynb
文件中的表格和图表)分开。此外,任务可以生成任何其他数量的输出,如数据文件。
要建立执行顺序,用户只需声明必须在我们正在处理的笔记本之前执行的笔记本。例如,为了清理数据,我们必须下载原始版本,所以我们将在clean.py
中做这样的事情:
就是这样。如果我们重新加载笔记本,我们会在依赖项列表的正下方看到一个新的单元格:
Ploomber 解析我们的引用,并添加一个包含输入位置的新变量。我们可以继续以这种方式构建,并创建包含几十个任务的管道,而不必跟踪每个任务的输出。因为跨文件分割逻辑很简单,所以多人可以同时处理它。Ploomber 帮助创建可维护的管道,感觉就像一个笔记本。
通过使用upstream
变量引用其他任务,我们还可以确定执行顺序,从而允许我们创建一个这样的管道:
为了执行整个管道,我们运行:ploomber build
。
笔记本模块化有许多好处:它允许我们隔离运行部件进行调试,添加集成测试以检查每个输出的完整性,参数化管道以使用不同的配置运行(开发、试运行、生产),并行化独立任务等。
代码模块化和单元测试
笔记本中声明的代码不能轻易从其他笔记本中导入,这导致了.ipynb
文件之间的大量复制粘贴。因此,当部署一个模型时,工程师经常不得不处理这样的项目结构:
重构一个像上面这样的项目是一个真正的噩梦。当工程师不得不重构这样的项目进行部署时,已经太晚了:笔记本可能很容易包含数千个单元,其中有几个部分是复制粘贴的,没有单元测试。相反,我们应该致力于在项目的所有阶段保持最低的代码质量。
首先,使用脚本作为笔记本(如前所述)方便了代码审查,因为我们不再需要处理不同 .ipynb
文件的复杂性。其次,通过为数据科学家提供预配置的项目布局,我们可以帮助他们更好地组织工作。例如,一个组织得更好的项目可能是这样的:
前面的示例布局明确地将项目组织为三个部分。首先,我们用.py
替换.ipynb
文件,并将它们放在tasks/
目录中。第二,将多次需要的逻辑抽象在函数中,存储在src/
下。最后,在src/
中定义的功能在tests/
中进行单元测试。
为了确保该布局有效,在src/
中定义的代码必须可以从tasks/
和tests/
中导入。不幸的是,默认情况下这是行不通的。如果我们打开tasks/
中的任何“笔记本”,我们将无法从src/
中导入任何内容,除非我们修改sys.path
或PYTHONPATH
。尽管如此,如果数据科学家不能避开 Python 导入系统的有限性,他们会倾向于复制粘贴代码。
幸运的是,这个问题很容易解决。添加一个setup.py
文件,让 Python 将您的项目识别为一个包,您将能够从项目中的任何地方(甚至在 Python 交互式会话中)从src/
导入函数。每当我与其他数据科学家分享这个技巧时,他们就开始编写更多可重用的代码。要了解更多关于 Python 打包的内容,点击这里。
思考生产中笔记本电脑的未来
讨论笔记本在作品中的使用总是一场艰苦的战斗。大多数人认为笔记本只是用来做原型是不可否认的事实,但我不这么认为。笔记本是处理数据的绝佳工具,虽然当前的工具使使用笔记本编写生产就绪代码变得更加容易,但仍有大量工作要做。
这项工作的一部分是开发更好的工具,而不仅仅是改善笔记本体验:毫无疑问,提供实时协作、与 SQL 更好的集成或云中托管 Jupyter 实验室等功能有很大的价值;然而,如果我们不在部署代码时更重要的领域(如编排、模块化和测试)进行创新,笔记本电脑仍将被视为一种原型工具。
此外,这项工作的一部分是消除关于笔记本如何工作的神话。我希望数据科学领域的开发实践能够吸收笔记本电脑的精华并不断发展,而不是抛弃它们,回到前笔记本时代的相同方法。
如果您想在生产中采用包含笔记本电脑的工作流程方面获得帮助,请联系,我很乐意谈论这些话题。
特别感谢 Alana Anderson 和 Sarah Krasnik 阅读早期草稿并提供宝贵反馈。
最初发布于ploomber . io。
我们为什么(以及如何)与学术界合作
将学术知识转化为工业数据科学应用
作者:米格尔·马丁内兹和迪亚·阿尔巴库尔
(图片由埃德温·安德拉德提供。Unsplash)
介绍
成功的科技企业总是推动创新,尽可能为客户提供最佳价值,并扩大他们在市场中的差异化。改善这些方面的方法之一是探索关于如何使用数据科学解决客户挑战的新方法和想法。我们认为,与学术伙伴的合作是这些努力的基础。
大学合作的好处
如果处理得当,与大学的合作对于任何创新企业来说都是一个强有力的工具,这有几个原因。对于科技企业而言,主要驱动力是获取专业知识、提高员工幸福感和公司品牌。例如,我们已经接待了 30 多名访问研究人员和探索 Signal AI 研究领域的硕士生,他们都能够产生影响并促进他们的职业发展。作为一名研究人员,你专注于非常具体的问题,而在那个阶段,一个常见的挫折是,这项研究可能不会产生任何影响,也不会解决任何真正的问题。通过与技术企业合作,研究人员看到了他们的工作对用户的影响。除了影响力之外,博士生等早期研究人员非常渴望加入一家从事应用研究的公司,以便了解这条职业道路并发展重要的技能,如与非技术人员的沟通和协作。
专业知识
为了说明这一优势,我们以我们公司为例。Signal AI 正在解决一个非常复杂的问题,为了给用户提供尽可能好的服务,我们需要解决自然语言处理(NLP)和信息检索(IR)领域的大量研究问题。这些挑战包括但不限于重复数据删除、实体链接、主题分类、情感分析或引用检测。同时拥有一个相对较小的内部数据科学家团队。即使我们的大部分研究与 NLP 相关,也不可能拥有所有这些任务的所有专业和最新的知识。一般来说,即使对于在不太复杂的环境中工作的公司(例如,专注于一项非常具体的任务),与大学的合作也可以发挥重要作用,允许对如何解决问题的最前沿替代方案进行探索性研究。这也间接允许公司影响社区来探索和讨论该领域的具体挑战(例如,重新关注新闻数据的重要性或推动可再现性和可复制性),并影响关于未来挑战的辩论。
员工获取和保留
对于许多数据科学家来说,与学术界保持联系非常重要,不仅从专业角度来看如此,从个人角度来看也是如此。以这样或那样的方式回馈社区,是我们许多人的强大动力。这对于那些有研究背景或者想提高自己作为研究人员的声望的人来说尤其重要。在这两种情况下,随着时间的推移保持与学术界的联系是至关重要的,以便保持最新和/或继续为其领域的最新发展做出贡献。此外,参与会议组织和拥有一致的出版记录对于那些希望保留在工业界工作后回到学术界的选择的数据科学家来说可能是不可或缺的。通过鼓励学术合作,不仅更容易吸引研究人员,而且作为一个整体,员工对研究职能的总体满意度也会提高。
公司品牌
很多公司的定位都是 AI 优先的公司。然而,MMC 的研究显示,2019 年,欧洲 40%声称使用 AI 的创业公司没有任何迹象。再次以我们的公司为例,Signal AI 的主要优势和可防御能力之一是我们如何应用 AI 来解决我们客户面临的挑战,我们拥有良好的声誉,至少在 NLP 领域是如此,我们实现这一目标的方法之一是参与学术和实践社区。通过这样做,我们的声誉领先于我们,要么是因为人们知道我们参加的会议,要么是因为社区中的网络效应。
Signal AI 如何与学术界合作
在这里,我们首先分享了我们与大学合作的方法,然后是我们从几年的合作中学到的东西
我们在获得资助后不久就开始了我们的访问研究计划,早期职业研究人员(通常是博士生)将加入公司,在特定的研究领域工作 3-12 个月。每种情况都有特定的目标,但它们总是适合以下两者中的至少一个:
- 改进现有的系统组件(例如,我们的情感分析)
- 减少不确定性,研究新方法或想法的可行性
在这两种情况下,我们都鼓励客座研究员发表我们可以与社区公开分享的任何研究发现。事实上,自 2015 年以来,我们每年至少出版一本书,所有这些都是学术合作的结果。
除了访问研究项目,我们的数据科学家还活跃在研究领域(尤其是在信息检索领域),我们中的一些人还参与了该领域一些主要会议的组织工作。我们还赞助了一些会议和倡议。例如,我们在 ECIR 社区设立了行业影响力奖,以表彰那些从行业角度来看最具潜力的论文。与社区互动的另一个重要方式是发布真实的数据集。这是一个关键的方面,因为学术界渴望找到新的数据,而行业可以从社区工作中受益。出于这个原因,我们发布了我们的 1M 信号数据集,该数据集现已被下载超过 6000 次。该奖项和数据集的发布都是在影响社区并提高我们品牌知名度的同时回报社区的例子。这种模式的美妙之处在于,每个人都从中受益。
学习和反思
与大学合作对我们来说非常有用,但在不同的发展阶段也会遇到挑战,通常与两个高层次的方面有关:优先级和影响。
优先级
使用协作来改进当前工作的主要挑战之一是时间范围的差异。从确定研究合作开始,到我们公司有一名客座研究员,通常需要几个月的时间。在学术界,这似乎不是很长的时间,但对于一家初创企业来说,甚至对于扩大规模来说,这都是一段很长的时间。在此期间,公司的优先事项可能会发生足够的变化,使项目变得不那么有趣,甚至过时。为了应对这一挑战,我们现在明确界定了每项合作的范围,要么是对现有组件的改进,要么是以减少不确定性为主要目标的探索(例如,我们能在多大程度上根据我们的内容总结事件?).
影响
数据科学家面临的一个常见挑战是,我们倾向于关注以学术为中心的指标。不幸的是,纯质量的度量标准(例如,F1 代表分类)可能与他们的目标业务度量标准没有很好的关联。为了最小化这种风险,项目应该非常明确地说明他们的假设、假设以及他们对用户行为或价值的预期影响。最好的方法是从我们希望从用户角度实现的高层次影响开始(例如,在应用程序上花费更多时间),然后向下级联到我们认为有助于实现该目标的所有潜在解决方案(例如,在搜索引擎中获得更好的结果)。一些研究人员特别难以理解的一个方面是,小的改进可能对高层次的目标没有影响,但可能需要付出巨大的努力。该规则也有例外,通常与明显可以货币化的问题有关(例如,在一家预测每天有数百万笔交易的公司中,欺诈检测系统可以提高 0.05%),但在许多其他情况下,用户不会明显注意到的改进可能对改变他们的行为产生有限的影响。
确保我们选择的候选人能够在工业环境中工作也很重要。这包括从沟通技能到开发技能,以及在考虑潜在解决方案时,考虑到当前基础设施,集成的效率、简单性和可行性也是重要的方面。显然,该公司应该始终努力为研究人员提供尽可能多的基础设施支持、数据和监督,以尽可能发挥其影响力。
结论
一些最优秀的研究人才仍然在大学里,那里的一些人想知道他们的研究的影响。另一方面,公司更接近他们的客户问题。我们真诚地相信,尽可能地弥合学术界和工业界之间的差距对所有相关方来说都是一个双赢的局面,尽管这不是一个轻松的旅程,而且从规划和组织的角度来看存在一些挑战,但这对公司,尤其是中小企业来说,是一个以新的创新方式改进其产品的绝佳机会。
为什么数据科学工作最抢手的时候却很难找到?
我想是时候解决这个问题了
纳蕾塔·马丁在 Unsplash 上的照片
在当今快速发展的技术世界中,来自右翼、左翼和中间派的人们正在开始他们的数据职业生涯,或者在数十年的金融经验后进行职业转变,或者回到学校获得数据科学学位。最近,我在数据科学就业市场上寻找实习和全职工作,亲身经历了我称之为“椰子田”的现实。
找工作很累;将你简历的第 496 份草稿命名为面试的最终版本,在四轮面试和无数 LinkedIn 信息联系和推荐后,公司会跟踪你——如果你足够幸运地收到了录用函,只有当你有足够的信心在第一天发布 LinkedIn 更新时,你才会平静下来。
如今,越来越多的人自称为数据科学爱好者。虽然数据科学候选人指数增长的主要原因被认为是数据职位空缺数量的增长,但获得数据科学工作比以往任何时候都更难。
但是,如果你正确地认识到就业市场的期望,就不会失去希望。关键是要确定什么最适合你,并利用它来帮助你找到最适合你的目标和兴趣的公司。
五六年前,当数据不是业务决策的核心时,公司会根据组织的需求制造数据专家,随着分析数据的需求不断增加,这些公司得到了学术界和具有初步技能的训练营的帮助。
统计是过去的事了
当《哈佛商业评论》称“数据科学家:21 世纪最性感的工作”时,请记住——那是 2012 年(显然,那一年世界本该走向末日😀)
你在网上读到的统计数据并不代表今天的动态。
一个组织的需求、要求和期望已经发生了巨大的变化。即使是关于数据科学工作的最新统计数据也至少有四分之一的历史了,而且数据科学还在不断发展。从 2016 年开始,数据科学家是美国的头号工作,但在 2020 年,它排在第三位( Glassdoor 的年度排名),谁知道到 2025 年,它甚至可能不会进入前 10 名。
当然,这取决于你如何看待这些统计数据,但如果一个网站上写着“2021 年 xx 百万数据科学工作岗位”,并不意味着它们都对你开放。
与其在线阅读大量数据科学市场的点播文章,我建议与你的网络中的数据科学家联系(或建立新的联系),并从这些对话中了解更多关于环境的信息。阅读你感兴趣的公司最近正在进行的新项目,或者联系你 15 年前刚从数据科学转行到商业智能分析师的同事,听取他们的真实意见。
数据科学独角兽还有更多的东西
每个组织、每个业务线的数据科学工作要求每天都在变化。这个领域变得越来越生产化,越来越商业化。数据科学家有望在同一天补一个数据工程师和一个 BI 分析师。
我可以说出 50 个不涉及姓名数据的工作简介,但你从事的是数据科学生命周期中的一个流程。如果说我从我的同学(2021 届)找工作的经历中学到了什么的话,那就是,你不能把自己的求职限制在关键词数据科学家和数据分析师上。
下面是几个令人兴奋的职位,类似于数据科学家的职位,你可以为其培养技能并申请—
图片来源:作者
这并不总是关于候选人
候选人在面试中常常无法表达自己的价值。
通常,绩点 3.4 的候选人会在面试中击败绩点 4.0 的候选人。在面试中,理论知识可能只占你整体评估的 40%。但是,在实际项目中工作过,在团队或研究中合作过,在学校实习过——交流这些的能力,阐明你带来的独特优势和品质是让游戏适合你的能力。
虽然公司正在寻找在工作描述中列出的工具和技能方面具有丰富经验的候选人,以增加团队的价值,但简历并不总是能传达预期。在这种情况下,需要关注的不是候选人,而是他们制作简历的技巧。让候选人心动的是简历筛选后的谈话。
企业寻求擅长形成理论、检验直觉、发现模式的专业人士,这些模式能让企业预测盈利情况或解决利润低的问题;一个候选人,他有可能建议利用启发式开发的途径,从而为用户增加价值。在 6 小时的小组面试中,一名新毕业生肯定会紧张地回答财务分析问题。如果你正在招聘候选人,一次让你的候选人感到舒服的谈话将会受到高度赞赏。
公司希望他们的数据团队有独角兽;我们找一个能预测如何降低营销成本和增加客户获取的分析师怎么样?!
从众心理
仅仅因为人们说数据科学领域的工作很热门,似乎每个人都想通过几天的培训来赶时髦。从我三年的数据科学之旅中学到的东西来看,这不是一个 15 天课程就能帮你找到工作的领域。数据科学需要一门学科,一套学习过程。
当前就业市场中的求职者只具备足够危险的知识——关于他们知道什么和他们想做什么的知识。
在现实世界中,你看不到工商管理硕士(MBA)或计算机科学(T2)的招聘信息。它们是学位,不是工作。企业似乎更有兴趣聘用数据科学职位的原因是,他们认识到云计算、大数据、人工智能和机器学习的新兴趋势和需求。
是时候拓宽求职范围了,不要局限于数据科学。
这就是我的博客的结尾。感谢您的阅读!如果你在寻找数据科学工作或正在寻找工作时也遇到了困难,请在评论中告诉我。我很想知道更多关于你的旅程和想法。
如果你喜欢阅读这样的故事,并想支持我成为一名作家,可以考虑使用这个链接注册成为一名媒体会员(我可以赚取一小笔佣金,不需要你额外付费!)
数据帐篷快乐!
Rashi 是一名来自芝加哥的数据奇才,他喜欢将数据可视化,并创造富有洞察力的故事来传达商业见解。她是一名全职的医疗保健数据分析师,周末会边喝一杯热巧克力边写博客
为什么变形金刚的记号化方法那么多?
通往同一个目的地的五条路线?
作者图片
H uggingFace 的变形金刚库是 NLP 事实上的标准——被世界各地的从业者使用,它功能强大、灵活且易于使用。它通过一个相当大(且复杂)的代码库来实现这一点,这就产生了一个问题:
为什么 HuggingFace 变形金刚里有那么多的记号化方法?
令牌化是将文本字符串编码成转换器可读的令牌 ID 整数的过程。
从人类可读的文本到转换器可读的令牌 id。
给定一个字符串text
—我们可以使用以下任何一种方法对其进行编码:
这是五种不同的方法,我们可能会误认为它们会产生相同的结果——令牌 id。然而,这些实际上是产生不同产出的不同过程。
在本文中,我们将看看这些方法之间的区别和相似之处。你也可以在这里看这篇文章的视频版本:
变压器的标记化
在深入研究这些标记化方法之间的区别之前,有必要理解一下标记化在 transformer 模型的上下文中意味着什么。
在构建 transformer tokenizer 时,我们通常会生成两个文件,一个是 merges.txt ,另一个是 vocab.json 文件。这两者都代表了标记化过程中的一个步骤。
我们首先采用字符串格式的文本。第一个文件 merges.txt 用于将单词或单词片段翻译成标记:
文件 merges.txt 将我们的纯文本转换成一个令牌列表。
一旦我们有了令牌,我们就通过我们的 vocab.json 文件来处理这些令牌,这只是一个从令牌到令牌 ID 的映射文件:
文件将我们的令牌列表转换成令牌 id 列表。
在推理/训练过程中,这些令牌 ID 由我们各自的转换器模型中的嵌入层读取——它将令牌 ID 映射到该令牌的密集向量表示(想象一下我们单词的表示的数字表示)。
其他输入张量
现在,我们刚刚解释了从人类可读语言到变压器可读令牌 id 的令牌化过程,但这只是变压器模型使用的几个输入张量之一。
所需的输入张量因不同的变压器模型而异,甚至因不同的变压器用例而异,但有几个常见的例子。
令牌 id(input _ IDs,左侧)和注意掩码(右侧),我们已经为字符串**“hello world!”构建了令牌 id 和注意掩码张量** —添加特殊标记 101、102 和 0(填充标记)。
- 注意力屏蔽–注意力屏蔽张量通常是一个包含 1 和 0 的张量,其维数与我们的 token IDs 张量相同。只有当注意屏蔽张量在其各自的位置包含 1 时,我们的转换器模型才会计算记号 IDs 张量中的记号的注意。
- 段 id—通常在我们的令牌 id 张量中有多个“句子/部分”时使用。比如在 Q & A 中我们经常会把 token IDs 张量拆分成问题和上下文——每个段在段 IDs 张量中分别用 0 和 1 表示。
以上介绍了转换器的标记化背后的基本要素——现在让我们看看这些标记化方法的不同之处,以及为什么我们会决定使用其中的一种。
到令牌和 id
我们可以对文本进行标记的第一种方法是对单个字符串应用两种方法。
第一个方法tokenizer.tokenize
将我们的文本字符串转换成一个令牌列表。
构建完令牌列表后,我们可以使用tokenizer.convert_tokens_to_ids
方法将令牌列表转换成转换器可读的令牌 id 列表!
现在,这里没有我们可以使用的特别有用的参数(比如自动填充/截断、添加特殊标记等),所以我们在这里的灵活性受到限制。因此,通过这种方法进行的标记化看起来总是像这样:
尽管值得注意的是,我们的其他张量如attention_mask
和token_type_ids
(段 id)不能使用这种方法自动创建。
编码和编码+
接下来我们有encode
和encode_plus
,它们都为单个字符串执行两个标记化步骤——输出我们的标记 id 张量。
现在,你可能已经猜到了,encode_plus
可以做得更多一点。
其中encode
仅输出表征 id 张量,encode_plus
输出包含表征 id 张量和的字典,附加张量例如注意力屏蔽或片段 id(token_type_ids
)张量。
这两种方法都带有常用的有用参数,如max_length
和return_tensors
。要将encode
与 BERT 一起应用于 PyTorch,我们可以编写如下代码:
但是我们还没有返回我们经常需要的注意力屏蔽或段 id 张量。
因此,为了获得我们的注意力屏蔽和段 id,我们简单地为encode_plus
编写相同的代码:
我们返回我们需要的所有张量——令牌 id、注意力屏蔽和段 id。
对于批次
实际上,我们不会对单个字符串进行标记,而是对大量文本进行标记——为此我们可以使用batch_encode_plus
。
像encode_plus
一样,encode_batch 可以用来构建我们需要的所有张量——令牌 id、注意力屏蔽和段 id。
与encode_plus
不同,我们必须将一个字符串列表传递给batch_encode_plus
,而batch_encode_plus
将在我们之前看到的同一个字典容器中为每个编码张量返回一个列表/批次。
同样,我们也可以使用之前的encode
和encode_plus
方法中使用的所有参数:
标记器
现在我们剩下最后一个方法,tokenizer(args)
—这里我们没有使用任何特定的方法,而是直接调用我们的 tokenizer 类。
让我们看看它会返回什么:
与我们的encode_plus
方法完全相同的输出,如果我们尝试像我们的batch_encode_plus
方法一样使用带有字符串列表的tokenizer(args)
,我们将会看到:
因此,这个最后的方法执行与encode_plus
和batch_encode_plus
方法相同的操作,通过输入数据类型决定使用哪个方法。
当我们不确定是否需要使用encode_plus
或batch_encode_plus
时,我们可以直接使用tokenizer
类——或者如果我们只是喜欢较短的语法。
这就是本文的全部内容,涵盖了高频变压器中可用的不同符号化方法。
在不同的模型记号赋予器之间,我们会看到不同的行为,但是所有这些记号赋予器都从PreTrainedTokenizer
类继承了它们的核心功能——包括了这些方法中的每一个!
因此,尽管许多记号赋予者是不同的——他们通常会分享我们在这里讨论的内容。
我希望你喜欢这篇文章!如果你有任何问题,请通过 Twitter 或在下面的评论中告诉我。如果你想要更多这样的内容,我也会在 YouTube 上发布。
感谢阅读!
*所有图片均由作者提供,除非另有说明
为什么有抱负的数据科学家不应该重视机器学习
以及他们应该做什么。
照片由 Kyran Aldworth 在 Unsplash 上拍摄
机器学习听起来很吸引人,很有魅力。事实上,它在让数据科学家成为 21 世纪最性感的工作中发挥了关键作用。然而,如果你的目标不是创建自己的算法,你就不应该太关注机器学习,尤其是在职业生涯的初期。
我绝对不是在争论机器学习是琐碎的或者不必要的。它在许多领域和任务中至关重要。然而,您可以通过用几行代码实现现成的模型来获得令人满意的结果。
如果你关注 Kaggle 比赛,你会发现 log loss 或任何其他指标的一小部分改善会导致排行榜的大幅上升。嗯,现实生活中可不是这样。
一旦你有了清晰和适当格式的数据,关于所选模型或参数的成本函数的变化通常在可接受的范围内。
换句话说,与数据和特征相比,模型和参数对成本函数的影响很小。因此,数据清理或争论和特征工程比模型选择和参数调整重要得多。
我建议有抱负的数据科学家不要太关注机器学习算法和超参数调整,除非他们想成为机器学习研究员。
在本文的下一部分,我将提供我的建议,告诉有抱负的数据科学家应该关注什么,并花时间去做什么。
照片由哈维尔·阿莱格·巴罗斯在 Unsplash 上拍摄
首先要掌握的技能是 SQL。尽管 NoSQL 数据库越来越受欢迎,但仍有大量公司在使用 SQL,我认为这种情况会持续很长时间。
作为一名数据科学家,您应该能够从关系数据库中检索您需要的数据。您不希望依赖数据工程师或 SQL 专业人员来获取数据。此外,你工作的公司很可能没有专门的人员为你提供数据。
SQL 不仅用于检索数据,也是一种高效的数据分析工具。灵活多样的函数允许编写高级查询来从数据库中检索所需的数据。此外,我们可以在检索数据的同时执行数据转换和分析。因此,掌握高级 SQL 技能将非常有帮助。
另一个非常重要的技能是数据清理、操作和翻译。用于这种操作的更一般的术语是数据争论。你需要能够轻松流畅地处理原始数据。
现实生活中的数据通常是杂乱的,并且不是最适合分析和建模的格式。有许多软件库用于数据角力,比如 Pandas 用于 Python,Tidyverse 用于 r。
你应该掌握至少一种数据辩论工具。你的技能组合中最好有熊猫和 Tidyverse,因为大多数公司都在使用 Python 或 r。
这些库为数据操作和转换提供了许多功能。因此,它们在基于现有特征派生新特征的过程中非常有用。
作为一名数据科学家,你可能会编写生产级代码,或者与软件工程师合作。因此,Git 是数据科学家的必备技能。您至少应该习惯使用基本的 git 命令。
越来越多的公司正在采用基于云的数据存储和处理策略。因此,您也应该熟悉云计算。您不需要具备云架构师的技能。但是,您至少应该能够从云中访问和检索数据。
结论
我想再次强调,我并不是说机器学习是无足轻重的。事实上,它在从数据中创造价值的过程中非常重要。
我想指出的是,现成的机器学习算法和解决方案在大多数情况下都做得很好。除非你想成为一名机器学习研究人员,否则对机器学习算法及其优缺点的基本理解通常就足够了。
你的大部分时间将花在清理、转换、操作和理解数据上。因此,加速和简化这些过程的工具比掌握机器学习算法更重要。
感谢您的阅读。如果您有任何反馈,请告诉我。
为什么自动特征选择有风险
特征的理论相关性不容忽视
来自经济学背景,我对数据建模的第一次介绍是通过计量经济学——它严重依赖线性回归来建立变量之间的关系。
在配置回归模型时,人们总是强调,虽然选择解释结果变量的特征的过程可以在一定程度上自动化,但理论应该总是胜过统计,即相关性并不意味着因果关系。
例如,观察到消费的冰淇淋数量和杀人率之间有很强的统计相关性。然而,很难说食用冰淇淋会直接导致更高的凶杀率。炎热的天气可能会增加人们的攻击性,从而导致更高的杀人率——冰淇淋消费量的增加只是这一现象的副产品。
自动化特征选择的问题
在我们生活的这个数据驱动的世界中,人们经常需要过滤成千上万个不同的特征,以确定影响结果变量的特征。
孤立地手动观察每个特征并确定它是否充分解释了结果变量是不可行的。在这方面,我们必须在一定程度上依赖自动化。
然而,当这些特征选择工具仅仅用于选择应该包括在模型中的特征时,问题就出现了,而没有手动地双重检查所选择的特征以确保它们在理论上有意义。
使用 ExtraTreesClassifier,让我们看一些例子,看看在没有经过训练的眼睛的情况下,特征选择会如何出错。
酒店取消
出于这个目的,让我们考虑将 ExtraTreesClassifier 作为特征选择工具。
树外分类器是一种集成学习方法,它使用随机决策树来选择在解释结果变量的变化时显示出强统计相关性的特征。具体来说,对所有观察值进行随机分割,以确保模型不会过度拟合数据。
现在,想象一下这个场景。您将看到一个酒店取消数据集,如果客户取消,结果为 1 ,如果客户不取消,结果为 0 。
Antonio、Almeida 和 Nunes (2019)在本例中的原始数据可在此处获得。
数据集中包含各种要素,包括客户的原籍国、他们的交付时间(从预订房间到入住的时间)、他们预订的房间类型等等。
来源:Jupyter 笔记本输出
您决定使用树外分类器按重要性对要素进行排序(最低值最不重要,最高值最重要):
来源:Jupyter 笔记本输出
排名最高的三个功能是功能 21(存款类型)、功能 12(来源国)和功能 27(预订状态)。
然而,让我们仔细看看特性 27。这是一个具有类别的分类变量:
- 取消
- 失约
- 退房
在这方面,任何取消预订的客户将被分配到“已取消”类别。在这点上,ReservationStatus 变量将显示与取消的结果变量接近完美的共线性。难怪 ExtraTreesClassifier 为这个特性显示了如此高的值——它有效地描述了与结果变量完全相同的东西!
然而,在现实场景中,在模型中包含这一功能是没有用的——酒店无法知道客户是否会取消预订,直到事后才知道。
在这方面,正确的决定是从最终的模型中去掉这个特性。
如果完全依赖于特征选择的自动化,这个特征将被保留在模型中——极大地扭曲了结果,并且与现实世界的场景没有理论上的相关性。
另一个例子:平均每日利率
使用相同的数据集,现在让我们看看不同的变量:【平均每日房价】。该变量描述了顾客每天在酒店的平均消费。
来源:Jupyter 笔记本输出
第一种倾向可能是使用特征选择工具来确定最能解释(至少在统计上)ADR 波动的特征。
然而,只有当我们仔细查看数据时,我们才注意到取消预订的和客户的 ADR 值都包括在内。
在大多数情况下,ADR 反映了取消的顾客如果留在酒店会花费的价值——但实际上酒店将不再从这些顾客身上赚钱。
在这点上,用 ADR 作为因变量来实现特征选择是错误的。
相反,更合理的方法是假设表明客户是否会取消预订的特征也与确定该客户的 ADR 相关。坚持预订的顾客已经比取消预订的顾客表现出更高的顾客忠诚度。在这方面,即使取消预订的客户最初有较高的 ADR 值,现在这也是多余的,因为预订不会继续进行。
考虑到这一点,建立了一个基于回归的神经网络模型,使用以下特征预测 ADR:
- 取消
- 原产国
- 细分市场
- 存款类型
- 客户类型
- 所需的停车位
- 到达日期:周数
该模型最终证明,相对于整个测试集的平均 ADR 105,平均绝对误差为 28。虽然模型显示的 RMSE 较高,为 43,但 MAE 被认为是衡量整体表现的更好指标,因为 RMSE 因少数客户的 ADR 远高于大多数客户而过度膨胀。
有许多重要因素会影响客户的 ADR,例如他们的年收入、货币波动、竞争链的价格等,这些都没有包括在数据集中。在这方面,包含的特征本身在能够解释 ADR 值的所有变化方面是有限的——但是考虑到这种限制,该模型表现得相当好。
结论
短语“垃圾输入,垃圾输出”也适用于特征选择。如果数据集中的要素是无意义的,那么要素选择工具将无法以有意义的方式解释这些要素。对数据的正确理解是最重要的,并且特征选择的自动化需要与领域知识相平衡,以便能够正确地判断特征是否适合在模型中使用。
在本文中,您已经看到:
- 树外分类器在特征选择中的应用
- 自动化特征选择的缺点
- 手动解释相关特征的重要性
非常感谢您的宝贵时间,非常感谢您的任何问题或反馈。你可以在这里找到这个例子的 GitHub 库。
免责声明:本文是在“原样”的基础上编写的,没有担保。本文旨在提供数据科学概念的概述,不应以任何方式解释为专业建议。
为什么婴儿不能驾驭鳄鱼
用沃尔夫拉姆语讲述的警示故事
很少有父母会愿意把自己的孩子和鳄鱼放在一个房间里。他们知道婴儿和鳄鱼对彼此的看法非常不同。婴儿容易信任他人,并寻求探索和结交新朋友。一只鳄鱼把一个婴儿视为一顿美味的午后点心。对大多数人来说,这是故事的结尾,但对逻辑学家、解谜者和像刘易斯·卡罗尔这样的数学家来说,故事才刚刚开始。
著名的奇怪的“爱丽丝梦游仙境”故事的作者刘易斯·卡罗尔也对逻辑谜题非常感兴趣。他写了下面的“幼鳄难题”,为读者提供了许多逻辑陈述,从中可以得出结论。这个难题有三个条件语句(原文):
- 所有的婴儿都没有逻辑
- 谁能管住鳄鱼,谁就不会被轻视
- 不合逻辑的人受到鄙视
这些陈述被认为是“真实的”陈述,尽管它们在今天看起来可能很奇怪。比如,我们有可能会想象鄙视一个管理鳄鱼的人。不合逻辑的人不会被普遍鄙视。出于这个原因,我将使用“不谨慎”,因为这实际上是一个比“鄙视”更好的选择。
我们可以从标记每条语句的各个部分开始,因此:
- b:代表婴儿
- l:代表逻辑
- I:代表不谨慎(以前被鄙视)
- m:代表“能驾驭鳄鱼”
然后,我们可以将英语语句写成简短的逻辑表达式:
- B → ~L(所有宝宝都不符合逻辑)
- M → ~I(如果你能管住一只鳄鱼,那你就不算不小心)
- ~L → I(如果你不符合逻辑,那么你就是粗心大意)
我们现在想从婴儿到管理鳄鱼,或者:
- B → ~M
结合规则(1)和(3),很容易从幼稚(B)变成粗心(I)
- B → ~L → I
换句话说,我们可以说婴儿是不小心的(根据谜题的规则)。
第二个规则(M → ~I)也可以换成它的反命题:
- 我→ ~M
这让我们完成了这个链条,完成了我们的“证明”:
- B → ~L → I → ~M
导致我们得出结论,确实婴儿(B)是不符合逻辑的,因此他们是不谨慎的,因此他们不能管理鳄鱼(~M)。父母会全心全意地认同这个结论。
汉弗莱·穆莱巴在 Unsplash 上的照片
现在逻辑证明会变得很长很乏味。甚至在上面给出的“证明”中,我们也忽略了很多细节。实际精确的逻辑证明可以通过 Wolfram 语言中的findcequationalproof函数获得,这是一种内置有用函数宝库的计算语言:
函数有两个参数:第一个参数是你试图证明的逻辑陈述,第二个参数是公理列表(假设为真的逻辑陈述)。
在我们的例子中,第一个语句是:不存在婴儿[x]和鳄鱼经理[x]都为真的“x”。接下来,公理列表重复初始问题的公理。
所有的逻辑证明都可以用有向图来表示,从公理和定理开始。在 Wolfram 语言中,您可以绘制这个证明图。在下图中,顶部的绿点是三个公理,左上角的绿色菱形是你要证明为真的定理。图表底部是由最后一个红色方块代表的结论“真”。图中的所有其他步骤都是非常简单的逻辑转换,需要进行 100%可靠的逻辑证明:
(图片由作者提供)
您还可以获得逻辑证明的每个步骤的文本表示,它使用一般的逻辑公理,并将它们应用于证明所需的特定情况。证明的前十步(共 100 步!)如下所示:
(图片由作者提供)
以下是得出最终结论的最后十个步骤:
(图片由作者提供)
逻辑是我们先进文明的核心。有了无可争议的事实和精心构建的论据,我们可以得出明智的结论,帮助我们在生活中前进。错误地提出不正确的论点可能会付出很高的代价,故意提出错误的论点可能会构成犯罪行为。理解是什么让一个论点正确,会让你变得更强大,因为这有助于你发现不好的论点。
要了解更多关于等式证明和如何解决它们的知识,请查看定理证明指南页面:
https://reference.wolfram.com/language/guide/TheoremProving.html
为什么装袋有效
罗斯·斯奈登在 Unsplash 上的照片
在这篇文章中,我深入探讨了打包或自举聚合。重点是建立对底层机制的直觉,以便你更好地理解为什么这项技术如此强大。Bagging 通常与随机森林模型相关联,但其基本思想更为普遍,可以应用于任何模型。
bagging——就像 boosting 一样——与学习者大家庭坐在一起。装袋包括三个关键要素:
- 使学习者适应数据的自举样本
- 对许多学习者和引导样本这样做;
- 从所有学习者中提取预测,并将平均值/模式值作为最终预测。
当每个学习者在输入特征的不同子集上被训练时,这种方法的有效性被进一步增强(尽管对于随机森林来说,这是稍微更细微的)。 但为什么这种做法在实践中如此有效?
什么是自举?
Bootstrapping 是从数据集中抽取替换的随机样本并计算每个样本的统计数据(例如,平均值、中值)的过程。当使用替换数据点执行采样时,原始数据中的数据点将被复制到引导数据集中。另一种方法是粘贴,其中数据被采样而没有替换。基本思想是通过随机生成数据可能是的替代视图来解决采样误差/偏差。该过程将生成感兴趣的统计结果的分布,在此基础上您可以估计标准误差和置信区间。一般来说,引导映射过程创建的基础统计数据的估计偏差较小。
学习拼图的随机部分
在预测建模的背景下,这种想法尤其强大。机器学习的一个基本挑战是过度拟合。当模型记住了它被训练的数据时,就会发生过度拟合。然而,如果一个单一的模型从未被展示完整的数据集,它的记忆能力就会受到极大的限制。从统计角度来看,自举是实现这一目标的便捷方式。当我们在机器学习中使用 bootstrapping 时,我们避免向任何单个模型显示完整的数据集。
为每个模型(或随机森林中的每个分裂)添加随机特征选择进一步防止过度拟合。实际上,bagging 方法的威力在于多个模型可以学习数据集不同组成部分之间的关系——样本和特征的不同组合——而不会过度拟合。
这意味着 bagging 模型中的每个子模型将学习底层数据的不同组成部分。如果每个子模型学习相同的结构或相同的参数估计,则在该过程中没有附加值。因此,当每个子模型不相关时,Bagging 是最有效的。
提取预测区间
bagging 模型的另一个好处是你可以提取预测区间。因为每个模型都适合数据的随机子集(以及潜在的随机特征空间),所以每个学习者都会学到输入和输出之间不同的关系集。这将为数据中的每个样本生成预测分布。
下面的代码将随机森林拟合到房价数据上,从每个子模型中提取预测,计算 95%的预测区间,并绘制每个样本的预测区间图:
图片作者。
上图显示了数据中所有样本的平均预测和 95%预测区间。当您需要识别预测高度不确定的样本时,这非常有用。当你想在预测中加入缓冲时,它也很有用。在这种情况下,您可以对所有样本进行 P95 预测。
我希望这篇短文有助于发展统计学和机器学习中 bagging 方法的直觉。如果你喜欢这个,你可能也会喜欢我在**“为什么助推有效”上的这篇文章。**
感谢阅读!
为什么平衡班级被过度炒作
小窍门
不需要平衡数据集的三个原因
图片由 Loic Leray 在 Unsplash 上拍摄
我上个月上班时掉进了兔子洞。我试图建立一个模型来预测一个罕见的结果,但我的回忆和精度分数仍然很低。鉴于这两个阶层的高度不相称性,我认为这应该归咎于阶层失衡。
平衡类通常被框定为“修复”预测模型的一种方式,在某些方面的确如此。这项技术之所以流行是有原因的——它可以用于提高全局准确性、提供描述性摘要、应用某些统计数据、防止模型惩罚少数样本等。然而,我意识到很容易陷入平衡类的习惯行为中,而没有考虑到这会带来的新问题。在这里,我将回顾你可能而不是想要重新平衡的三个原因:
- 偏差引入
- 训练数据需要反映真实世界
- 少数阶级的数量可能已经足够了
首先,让我们快速回顾一下什么是阶级失衡。
什么是不平衡班?
不平衡的阶层,简单来说就是两个人口比例不对等。各行各业都有例子;例如,在医疗保健行业,良性肿瘤(多数类别)的数量远远超过癌性肿瘤(少数类别),或者在金融行业,正常交易的数量(多数类别)相对于欺诈交易(少数类别)而言相当高。这些比例可从 4:1 到 100:1 不等,极端的不平衡可高达 1000:1 到 10000:1 [1],有时甚至更高。
一般来说,少数民族阶层有一些邪恶或不受欢迎的东西,这有利于我们提前预测。在我的领域,医院向保险公司索赔的相对较小比例(5-15%)被拒绝。理想情况下,我们可以提前预测这些情况,为已经在微薄利润中生存的医院节省数百万美元的收入损失。
但让我们回顾一下重新平衡班级的一些潜在陷阱,并讨论一些更好地预测少数民族结果的替代方法。
原因 1:偏差引入
重新平衡数据集可能会引入偏差。当您重新取样时,除了人为地增加或减少数据点的数量之外,您什么也不做。如果您选择对多数类进行欠采样,如果关键的观察值被移除,则可能会引入偏差。新样本也可能无法准确反映您的真实测试数据。相反,对少数类进行过采样可能会无意中扩大隐藏的数据异常并造成过拟合。SMOTE 是另一种可以改善决策边界的重采样技术[2],但是如果新数据包含与少数类中的标记样本相似的属性,则预测性增强是次要的[3]。SMOTE 在高维数据集中也会受到影响,因为它没有考虑所有相邻的类,并且会导致重要的类区别重叠。
那么,我们为什么如此热衷于重新平衡数据集呢?事实上,这种动力是为了纠正另一个与估计全球精确度有关的问题。以上面我们被拒绝的索赔为例;基本模型可以达到惊人的 95%的准确性,因为多数类代表了整个数据集中的确切比例。简而言之,仅仅是每次预测多数类“非否认”,你就会有平均 95%的准确率。通过重新平衡,准确度分数变得更加真实。
然而,我们陷入了各种各样可以重新平衡的方法中,我们留下了一些更重要的考虑:我们有足够的代表性数据吗?我们的变量真的具有预测性和重要性吗?我们是否为自己的预测设定了合适的阈值?实际上,阈值的设置对于预测任务非常重要,您可以通过精确度和召回率来优化它们。天气预报是一个很好的例子,说明了为什么阈值比二元分类精度更好。例如,天气预报员从不报告“会下雨”或“不会下雨”。它们提供了阈值,比如“有 52%的可能性会下雨”,这为我们提供了更好的洞察力和自主权,让我们在生活中的其他相关因素下做出决定,例如,如果阳光明媚,我整天拿着夹克会有多烦恼?如果我真的讨厌整天带着一件夹克到处跑,而下雨的可能性只有 52%,我会掷骰子,不穿夹克就出门。然而,在我们的医疗保健示例中,这些阈值可能是生死攸关的,而不仅仅是不便之处。
大多数预测模型将自动阈值设置为 50%,尽管选择一个更上下文相关的阈值是重要的,也是可以做到的[4]。尽管如此,如果你过于关注类的再平衡而不是优化这些类型的权衡,你可能会掉进兔子洞试图“解决”错误的问题。
重新平衡阶级在统计学上也有一些历史根源,旧习难改。许多实验设计假设数据平衡,如多因素方差分析[5]。在这种情况下,平衡设计提高了统计功效,降低了同方差[6]。在计算机出现之前,用非常不平衡的数据来估计模型对于人工处理来说尤其具有挑战性。今天,计算机的进步已经使这些问题变得过时了。高级预测模型可以在高维度和稀疏矩阵中进行优化,而且它们肯定可以解决阶级不平衡问题。
原因 2:训练数据需要反映真实世界
不重新平衡数据集的另一个原因是,模型应该在数据集上训练,数据集的分布将反映它们最终应用的未来真实世界的测试案例。如果确定重新平衡是绝对必要的,那么在进行任何重新平衡实践之前,应该拆分训练集和测试集。
在 Harrell 的一篇论文中,根据平衡数据训练的分类器需要根据适当的测试数据重新训练,因为预测和模式可能会发生巨大变化[7]。例如,假设您有两个不平衡的类别:100 万名非癌症患者和 1000 名癌症患者。如果您通过对多数类进行 90%的下采样来训练平衡类的模型,您将训练 1/10 流行率的分类器,而不是自然发生的 1/1000 流行率。正如 Provost 指出的,分类器的假设是它“将对来自与训练数据相同分布的数据进行操作”[4]。对平衡数据的训练可能无法推广到自然不平衡的真实世界数据。
已经设计了几种方法来提高不平衡数据集上的算法性能。我们可以简单地在应用重采样技术之前将类分成测试和训练集*。这防止了在两个集合中出现相似数据的可能性,这种可能性会导致过度拟合和较差的泛化能力。一种更强化的提升方法涉及通过在总数据集的不同样本上使用两个学习者(L1、L2)和一个最终学习者来检测它们之间的差异(L3) [8],使训练模型适应测试分布。其他常见的方法包括分配与训练数据中的类频率成反比的类权重,这也防止了过拟合[9]。基于核的学习方法也被用来改善 SVM 模型中的决策界限[10]。但是,这些解决方案解决了阶级不平衡,就好像它们是一个非常严重的问题,当更紧迫的问题存在时——你的少数阶级代表吗?少数人有噪音吗?你的课程真的重叠了吗?你的特征变量真的重要吗?你所在的多数班和少数班有太多的“脱节”吗?[11–17].*
因此,成本敏感学习的应用不是平衡班级,而是在直接应用于生活中自然发生的不平衡班级时显示出一些有希望的结果[12,18-19]。特别是,对于大型数据集,对自然、不平衡分布的成本敏感学习比过采样或欠采样不平衡类产生更好的结果。作者认为,大量的训练数据允许模型更准确地估计类成员概率[20]。其他实证研究表明,在不平衡分布中,成本学习优于抽样方法[20–22]。
原因 3:少数民族阶级的数量可能已经足够了
如果你的少数类包含足够的相关性和强大的依赖关系来通知你的分类器[23],那么再平衡可能也是不必要的。这最终优先于少数阶级和多数阶级之间可能存在的极端不平衡的比例。在几项带有不平衡数据集的研究中,少数民族的概念被准确地学习,很少受到不平衡的干扰[24–26]。
这么想吧。包含 101 个样本(100 个多数案例和 1 个少数案例)的不平衡数据集将构成一个糟糕的预测模型。但是如果你有 1000 万个多数案件和 10 万个少数案件呢?同样程度的阶级不平衡。但是在第二个例子中,少数类可能足够大以建立质量预测模型。
如果两个类别都来自具有非常明确定义(即不同)的特征变量的非重叠分布,则尤其如此[1]。在我自己预测医疗保健中被拒绝的索赔的工作中,不平衡的类别不是预测不佳的罪魁祸首;我的初始特征对我的结果变量来说只是无信息的(否认与不否认)。如果您也遇到高维度和稀疏的特征空间,这些问题优先于类不平衡问题。
另一方面,如果少数类中的样本数量太少,分类器无法充分学习,那么你真的有一个不完整训练数据的问题,而不是不平衡数据集的问题。当然,你可以称之为阶级失衡,但这实际上只是权力的问题。如果这种情况发生,我真的想知道少数民族阶层是随机缺失还是不成比例的缺失?只要您可以访问更多的数据,前者是可以的,后者可能会出现采样偏差。
少数样本量低,而不是类别不平衡,可能是预测模型的一个特殊障碍。随机森林分类器(RFC)尤其“数据饥渴”,需要大量数据才能得出有意义的结果。例如,范·德·普洛格和他的同事证明了为了让 RFC 像处理训练数据一样处理新数据,总体样本量应该是候选特征数量的 200 倍[27]。因此,具有足够样本的少数类可用于分类模型。什么叫“够了”?没有真正的硬性规定。不断优化精度和召回率,同时确保您的数据不会过度拟合或出现泄漏。
结论
如果你的不平衡类是可分的,有很好的少数类代表性,并对你的结果变量有独特而强大的影响,那么尽管不平衡,数据对构建可靠的预测模型应该不会造成什么问题。诸如精度和召回率之类的条件概率应该在类的自然分布范围内进行评估和优化。
虽然阶级失衡引起了很多关注,但更重要的问题是:
- 您是否优化了正确的分类指标,如精度和召回率,而不是准确性?
- 你的小众阶层代表吗?有足够多的少数民族案例吗?
- 你的少数群体中存在噪音吗?
- 您的模型是否尊重并很好地应用了现实场景中出现的类的自然分布?
- 你的课程有重叠的地方吗?到什么程度?
- 你的特征变量真的重要吗?
乐意在 LinkedIn 上与任何人联系!如果你对数据科学和医疗保健的交叉领域感兴趣,或者你有有趣的挑战要分享,请留下评论或 DM。
查看我的一些其他文章:
引文
[1]巴托什·科劳兹克。"从不平衡数据中学习:公开挑战和未来方向."智力进展(2016 年)5:221–232
[2] Marco Altini,“处理不平衡数据:欠采样、过采样和适当的交叉验证。”博客。2015 年 8 月。https://www . marcoaltini . com/blog/处理不平衡数据-欠采样-过采样-适当交叉验证
[3]杨延平,马广智。"基于集成的主动学习解决类不平衡问题."生物医学科学与工程杂志,第 3 卷第 10 期,2010 年 10 月。
[4]教务长,F…"不平衡数据集的机器学习 101 . "(2000).
[5] R.H. Riffenburgh,第 13 章——多因素 ANOVA 和 ANCOVA,编辑:R.H. Riffenburgh,《医学统计学》(第三版),学术出版社,2012 年,第 275-297 页
[6]斯蒂芬妮·格伦。来自 StatisticsHowTo.comhttps://www.statisticshowto.com/的“平衡与不平衡的设计:定义,例子”:对我们其余人的基本统计!https://www . statistics show to . com/balanced-and-unbalanced-designs/
[7]弗兰克·哈勒尔,“分类与预测。”博客,2020 年 9 月。https://www.fharrell.com/post/classification/
[8] Robert E. Schapire 在“ 弱可学习性的强度”机器学习,5(2):197–227,1990 年发表。http://rob.schapire.net/papers/strengthofweak.pdf
[9] Joshi,m .,Kumar,v .和 Agarwal,R. (2001)评估用于分类稀有类的增强算法:比较和改进。第一届 IEEE 数据挖掘国际会议论文集。华盛顿 DC: IEEE 计算机学会,257–264。
[10] Akbani,r .,Kwek,s .和 Japkowicz,N. (2004)将支持向量机应用于不平衡数据集。第 15 届欧洲机器学习会议记录,意大利比萨,39-50。
[11]何海波,爱德华多·加西亚,“从不平衡数据中学习”,《IEEE 知识与数据工程汇刊》,第 21 卷。,№9,2009 年 9 月。
[12] G.M. Weiss,“稀有矿产:统一框架”,ACM SIGKDD 勘探通讯,第 6 卷,第 1 期,第 7-19 页,2004 年。
[13] N. Japkowicz 和 S. Stephen,“阶层失衡问题:系统研究”,《智能数据分析》,第 6 卷,第 5 期,第 429- 449 页,2002 年。
[14] T. Jo 和 N. Japkowicz,“等级不平衡与小间断”,ACM SIGKDD 探索通讯,第 6 卷,第 1 期,第 40-49 页,2004 年。
[15] N. Japkowicz,“阶级失衡:我们关注的问题是否正确?”继续。国际会议。机器学习,从不平衡数据集中的车间学习 II,2003。
[16] R.C .普拉蒂、G.E.A.P.A .巴蒂斯塔和 M.C .莫纳德,“阶级不平衡与阶级重叠:对学习系统行为的分析”,Proc .墨西哥国际会议。人工智能,第 312–321 页,2004 年。
[17] S.J. Raudys 和 A.K. Jain,“统计模式识别中的小样本效应:对从业者的建议”,IEEE Trans .模式分析和机器智能,第 13 卷,第 3 期,第 252-264 页,1991 年 3 月。
[18] N.V. Chawla、N. Japkowicz 和 A. Kolcz,“社论:关于从不平衡数据集学习的特刊”,ACM SIGKDD 探索通讯,第 6 卷,第 1 期,第 1-6 页,2004 年
[19] M.A. Maloof,“学习何时数据集不平衡,何时成本不相等和未知”,Proc .国际会议。机器学习,从不平衡数据集中的车间学习 II,2003。
[20] K. McCarthy,B. Zabar,和 G.M. Weiss,“在对稀有类进行分类时,对成本敏感的学习胜过抽样吗?”继续。基于效用的数据挖掘,第 69–77 页,2005。
[21]刘晓燕,周志宏,“用处理类不平衡问题的方法训练代价敏感神经网络”,IEEE Trans .知识与数据工程。,第 18 卷,第 1 期,第 63-77 页,2006 年 1 月。
[22]刘小燕、周志宏,“班级失衡对成本敏感学习的影响:一项实证研究”,中国教育出版社,2002 年。国际会议。数据挖掘,第 970–974 页,2006 年。
[23] Stephen Senn,“临床试验中随机化的七个误区。”医学统计,2012 年 12 月。
[24] G.E.A.P.A. Batista、R.C .普拉蒂和 M.C. Monard,“平衡机器学习训练数据的几种方法的行为研究”,ACM SIGKDD 探索通讯,第 6 卷,第 1 期,第 20-29 页,2004 年。
[25] N. Japkowicz 和 S. Stephen,“阶层失衡问题:系统研究”,《智能数据分析》,第 6 卷,第 5 期,第 429- 449 页,2002 年。
[26] G.M. Weiss 和 F. Provost,“当训练数据很昂贵时的学习:类别分布对树归纳的影响”,《人工智能研究杂志》,第 19 卷,第 315-354 页,2003 年。
[27]t .范·德·普洛格,奥斯丁,P.C .和 Steyerberg,E.W,《现代模拟技术对数据的渴求:预测二分终点的模拟研究》。BMC 医学研究方法,第 14 卷,第137 号。(2014).https://doi.org/10.1186/1471-2288-14-137
为什么人工智能不会很快取代银行家
野外的数据科学和机器学习
各种数据专家面临的挑战和职业机会
苏蒂尔塔·布迪曼在 Unsplash 上拍摄的照片
机器人银行家仍然是科幻小说
许多科幻电影描绘了一个人工智能和机器学习系统将取代我们的世界,但在大型银行中,这与现实相去甚远。实际发生的是,ML 革命正在打开十年前没有人会相信的大门。我很幸运能够站在这个领域的最前沿,所以我想让你看看这个行业现在发生了什么。
尽管与金融科技公司相比,大型银行的创新步伐似乎很慢,但我认为,它们面临的挑战更加复杂。精明的商人会意识到哪里有挑战,哪里就有机会……现在大银行里就有很多这样的机会。
金融科技的崛起引发的破坏迫使在职者开始认真对待机器学习,许多人现在专门为人工智能创新提供资金。这对全世界各种类型的数据和 ML 专家来说都是令人兴奋的消息。
大型银行的相对不成熟
任何一个 ML 专家都会告诉你,数据是让它工作的“神奇”成分。大型银行受托管理大量有价值的客户数据,但事实证明利用这些数据很困难。目前,与脸书、谷歌和亚马逊等公司相比,机器学习的数据生态系统还不成熟。我认为主要挑战是基础设施、监管和机器学习专业知识。
云平台和传统基础设施
云平台正迅速成为管理大规模应用机器学习的存储和计算需求的最简单方式。许多现任者明白这一点,正在慢慢过渡到云。现在云已经不是什么新鲜事了,一些科技公司已经在云平台上运营了十年。那么,问题是什么,为什么对大银行来说如此具有挑战性?为了理解这一挑战,我们需要简单回顾一下历史。
大多数现有银行自金融服务中的计算机出现以来就存在了。
1959 年,马丁银行(英国)安装了第一台计算机来复制所有的经常账户操作,与标准操作并行。
从那时起,银行的数据基础设施已经发展成为一个复杂的遗留平台和混乱的网络。很自然,这导致一些业内人士在添加更多层之前要谨慎行事。这里的主要担忧是技术性债务,一些银行目前为此付出了高昂的代价。
机遇:银行希望以一种技术债务最小且可长期持续的方式过渡到云。这里最大的机会是技术专家,他们可以理解遗留数据基础设施的复杂层,以及它如何与云平台交互。如果您能够绘制出数据架构,编写严谨的技术文档,理解您的技能集所需要的系统级别的数据。
职业道路:数据&云架构师、云平台工程师、数据工程师
监管是一件大事
监管往往是房间里的大象,忽视它会让你自担风险。银行业是一个受到严格监管的行业,自 2008 年金融危机以来,其复杂性有所增加。随着 2018 年 GDPR 的推出,所有公司都在加强对他们如何管理数据的审查。2021 年,监管机构对未能遵守规定的公司处以巨额罚款。
亚马逊因通过 cookies*收集和分享个人数据的方式被罚款8.77 亿美元。
WhatsApp 被罚款2.25 亿美元,因为它没有正确解释其数据处理实践*。
Caixabank 因违反 GDPR 透明度要求和未建立使用消费者个人数据*的“法律基础”而被罚款720 万美元。
*来源:https://www.tessian.com/blog/biggest-gdpr-fines-2020/
你可能已经注意到,一些最大的罚款已经被开给了那些已经达到机器学习成熟度的公司(相对而言)。这是大银行即将面临的危险,其中许多银行仍处于 ML 和大数据基础设施的早期采用阶段。随着数据生态系统的成熟,银行面临的监管挑战将变得更加复杂,巨额罚款的风险也将增加。
还有 AI 的公平性问题,这是一个滴答作响的定时炸弹。有许多机器学习模型已经在有偏见的数据集上进行了训练,这些数据集将面临监管打击。
如果你有机会阅读《数学毁灭的武器》(凯茜·奥尼尔),它可以作为一些即将出现的人工智能和公平问题的警告。
机遇:大型银行需要不仅懂数据监管,还懂机器学习的专家。特别是在银行业,可解释的人工智能是关键。大多数模型不会进入生产阶段,因为法规要求决策是可解释的。能够构建高性能、可解释模型的熟练操作员在这里也很关键。
如果你不相信这个机会的规模,那就再看看亚马逊在 2021 年收到的罚款。这里没有说明的是声誉损害,对银行来说,这通常比罚款的直接财务影响更大。
职业道路:法律&合规专员、统计学家和数据科学家
合适的机器学习专业知识很少
我认为这个挑战的两个方面在于原型和扩展机器学习。让我们先来看看原型。事实证明,在野外发现可行的机器学习用例并不容易。在现有银行中,挑战在于组织的规模和所需的领域知识。
第二个标题是关于缩放。大型现有公司服务的客户数量为数千万,客户交易总量数十亿甚至数万亿。交付这种规模的机器学习模型带来了工程挑战。这里的规模超出了数量,因为数据通常是在一个破碎的银行生态系统中生成的。
机遇:对于原型开发阶段,熟练的数据科学家和分析师有着巨大的机遇。你将需要快速“穿过混乱”的能力。你应该有一个制定合适的机器学习问题的框架和快速开发原型的能力。拥有一些银行和金融领域知识的数据科学家将在这里胜出(这就是我如何获得第一份数据科学工作的)。
对于扩展阶段,这更像是一个工程挑战。一名熟练的机器学习工程师将了解如何利用数据科学家构建的原型,并将其开发为规模化运营。
在实践中,原型和缩放之间有重叠。想象一下这个场景:您有数百个模型在运行,现在其中一些模型的性能开始漂移,您打算怎么办?好吧,一个熟练的数据科学家应该理解为什么那些模型会漂移,并适当地指导训练。或者,人们可能会发现这种漂移是由损坏的数据管道引起的,需要工程技术人员来解决。
大规模提供有效的机器学习需要工程和数据科学之间的持续合作,以实现模型交付、性能和监控。这里的重叠是一个现在通常被称为机器学习操作(简称 MLOps)的领域。
职业道路:数据科学家、软件工程师、开发人员、数据工程师、机器学习工程师、商业分析师
最后的想法
ML 革命给银行业带来了新的挑战,也给各种类型的数据专家带来了机遇。虽然现在有很多关于数据科学的宣传,但实际上需要各种类型的数据专家。所以,发挥你的优势,如果你有很强的分析能力,并且理解科学方法,那就追求数据科学。如果你对系统和软件更感兴趣,那就追求工程学。对于人工智能的监管挑战和公平性,选择法律和合规路线。如果你有银行业的专业知识,可以考虑参加机器学习课程来增加你的市场价值。
我想留给你们这个想法,现在机器学习系统需要一个人在循环中。人工智能系统没有取代我们,而是创造了我们必须理解它们的工作岗位。
⭐️ 我喜欢通过分享我在野外的数据科学经验来帮助人们。如果你还不是会员,可以考虑订阅 Medium,从我这里获得更多有用的内容。
https://johnadeojo.medium.com/membership
为什么自助抽样是概率思维的利器
以及你现在如何在实践中运用它
介绍
你尽了最大努力,用电子设备在你的房间里测量了 50 次声速。感到非常自豪和兴奋,你看着你的结果:
好大的耳光!在前 10 次测量后,该设备出现了技术故障。它根本没有测量任何东西。你现在做什么?
你可以取可用数据的平均值,但你有多大把握呢?如果设备工作正常,你计算的平均值可能是其他数字。
事实上,测量 50 次速度的全部原因是,你可以对你的发现充满信心,并对任何环境下的声速做出有效的假设,而不仅仅是在你的房间里。
你必须经历所有的痛苦,并设置一个新的设备来记录更多的测量结果吗?见鬼,不!好吧,至少如果你知道 Python 和一个叫做 Bootstrapping 的神奇方法。
Bootstrapping 允许您模拟任何数据分布。这意味着您避免收集更多的数据。你可以只用一个子集对一个大得多的群体做出相当合理的估计。
使用 bootstrapping 从一个小样本到对整个群体进行预测的概念已经让人们信誓旦旦了很多年。如果在实践中使用,这似乎有点像作弊。但事实上,它只不过是很少的数学和大量计算能力的结合。
尽管这是一个非常简单的方法,但是它的应用远远超出了本文的范围。许多领先的机器学习算法,如随机森林和随机梯度推进也使用它。
在本帖中,我们将了解这种方法的工作原理,以及我们如何使用 Python 实现这种方法来模拟数据分布,这有助于我们对人口进行预测,计算置信区间,并在未来进行假设检验。
https://ibexorigin.medium.com/membership
获得由强大的 AI-Alpha 信号选择和总结的最佳和最新的 ML 和 AI 论文:
https://alphasignal.ai/?referrer=Bex
术语警报
在这篇文章中,我会经常用到人口、样本、统计和参数这些词。因此,在我们继续下一步之前,理解它们是很重要的:
- 人口和样本:在统计学中,人口是指我们感兴趣的整个群体,样本只是人口的一个小的随机子集。例如,“走向数据科学”出版物的所有关注者可以是整个群体,而阅读这篇文章的人只是这个群体中的一小部分。对于我们的情况,我们房间中的 10 个声速测量值可以作为样本,而任何环境中的声速测量值可以作为总体。
- 参数和统计:如果我们为总体计算某个度量,例如平均值或标准差,它被称为总体参数。如果我们对一个样本这样做,它将被称为样本统计。
举个例子,假设你有一万个电子邮件用户。你给所有的订阅者发了一封邮件,询问他们最喜欢的编程语言。只有 2500 人回应,其中 70%的人喜欢 Python。这里:
- 人口 : 1 万电子邮件用户
- 样本 : 2500 人回应
- 统计 : 70%喜欢 Python
- 参数:未知,我们应该只使用样本计算所有喜欢 Python 的订阅者的百分比。
既然我们就术语达成了一致,让我们继续自举。
自举理论
为了在实践中展示自举,我们将从声速的十个测量值开始。首先,让我们绘制数据点:
我们的目标是在任何开放的环境中正确估计声速,而不仅仅是在房间里。因为我们不太可能看到声速的异常值,所以平均值可以是代表速度的一个很好的度量。所以,让我们在图上标注一下意思:
我们得到的平均值是 344.39 米/秒(米每秒)。现在,我们引导样本:
- 首先,我们从速度中随机选择 10 个测量值,允许重复。
- 计算这个随机样本的平均值,并将其存储在一个数组中。
- 重复第一步和第二步很多很多次,最好是 1000 或 10000 次。
因此,让我们从可用数据中随机选择 10 个点,我们可以根据需要多次选择任何数据点:
我使用 Python 随机选择这些点(稍后我将展示如何选择)。正如你所看到的,我们只有 7 个独特的点,这意味着有 3 个点绘制在彼此的顶部,因为我们最终有一些重复。然后,我们测量平均值并绘制出来,这次是 344.396。
以下是从最初的 10 次测量中随机抽取的 10 个点:
>>> list(temp)[345.59, 345.07, 340.4, 349.47, 340.92, 349.47, 340.26, 349.47, 342.91, 340.4]
以上称为单自举样本。它的平均值是 344.396,称为自举复制或度量。
接下来,我们应该重复这两个步骤数千次。例如,下面我将选取 1000 个 bootstrap 样本,并仅在一个图表上绘制它们的平均值:
上图是从最初 10 次声音测量中采样的 1000 个 bootstrap 复本(平均值)的图表。我用较低的透明度绘制线条,以便重叠的线条在实际估计的平均值周围创建一个更密集的背景。如您所见,样本平均值约为 344 m/s,我们可以放心地将其用作任何环境中的一般平均声速。
我们刚刚做的叫做自助抽样与替换。带替换是指从底层样本中随机选择一个数据点并放回原处,这样所有的数据点都有均等的机会再次被选中。
此外,重要的是每个引导样本与基础样本具有相同的长度。在我们的例子中,每个 bootstrap 样本的长度为 10,因为我们一开始只有 10 个速度测量值。
现在,问题是‘为什么我们必须假设我们用 bootstrap 抽样计算的平均值接近实际的总体参数?’。在下一节中,我们将根据一些数学知识来回答这个问题。
为什么自举有效
在概率论中,有一个理论叫做大数定律。它表明,如果同一个实验进行了很多次,随着实验次数的增加,实验的平均结果往往更接近真实的估计值。
例如,掷出一个公平的骰子会有六种结果 1,2,3,4,5,6。你的预期分数是这 6 个数字的平均值,即 3.5。当然,现实中你滚几次骰子也不会有 3.5 的平均分。但是,由于大数定律,随着你掷数的增加,你的平均分越来越接近 3.5。
如果你想一想,这实际上是有道理的。举一个更真实的例子,如果你参加两次 SAT 考试,你可能会得到两个非常不同的结果。然而,越来越多地参加考试会让你越来越接近你在考试上的实际技能衡量标准。
Bootstrapping 在幕后使用了同样的想法。给定一个好的样本(我将在下一节解释什么是好的样本),从这个样本中随机抽取样本实际上会给出非常接近实际总体参数的结果。
对我来说,多次使用少量数据对一大群人进行预测,而不必收集更多的数据,这是非常令人惊讶的。
自举有多有效
一个显而易见的问题是这种方法的效果如何。答案是,大多数时候,你可以期待引导的结果是正确的和可用的。但是,对总体参数进行推断的准确性取决于您收集的样本。
为了使引导正确工作,您使用的样本应该准确地代表感兴趣的总体。例如,如果你想收集人的身高信息,并计算地球上所有人类的平均身高,你必须选择正确的样本。
此外,收集的数据应该是真正随机的,包括来自人口中广泛群体的数据点。只选择运动员这样的特定群体不会是一个足够好的样本。因为运动员往往比较高。
如果您确定您正在使用一个足够好的样本,那么您几乎总是可以确定从引导中获得的结果是可靠的。如果没有,你必须大胆地使用 bootstrapping,因为大多数时候你给的数据都是次要的(别人收集的)。
作为一个额外的好处,自举可以用来测量人口的其他参数的整个范围。很好的例子有中位数、众数、标准差、方差、相关性等等。
什么是抽样分布
术语“自举”和“采样分布”经常一起出现,事实上,采样分布是使用自举获得的。让我们用早期的声速测量来澄清这一点。
回想一下,我们从最初的 10 次测量中提取了 1000 个引导样本,并绘制了每个引导样本的平均值。这一次,我将把所有的方法存储在一个 Python 数组中,而不是绘制:
我正在显示存储在变量means
中的 1000 个平均值中的前 20 个。在概率学中,means
被称为样本均值的抽样分布。相反,我们计算每个引导样本的标准偏差:
它将被称为“样本标准差的抽样分布”。
这种分布实际上是没有用的,除非我们把它画出来。采样分布的常见图形是直方图:
我们可以看到采样分布近似为正态分布。事实上,随着 bootstrap 样本数量的增加,在正确的 bootstrap 条件下获得的每个单个采样分布将遵循近乎完美的正态分布。
最后,在下一节中,我们将看一下生成所有这些引导和示例发行版的代码。
Python 中的引导
Python 中的引导通常从数据帧开始。这项技术本身广泛使用了numpy
,所以我们将把它和pandas
以及两个绘图库一起导入:
我将加载 Seaborn 的内置钻石数据集,我们将使用 bootstrapping 来推断整个钻石群体的平均价格:
下面是钻石价格的核密度估计图,平均值标注为黑线:
平均价格是 3932.8 美元。
现在,我们将把钻石价格提升 10k 倍,这样我们就有了所有可能的钻石数量:
首先,我们创建一个空的numpy
数组来存储平均值。然后,我们用 10k 次迭代初始化一个for
循环。在每次迭代中:
- 我们使用
np.random.choice
进行引导抽样 - 我们使用潜在分布的长度(钻石价格)作为
size
参数 - 我们使用每个样本计算平均值,并将其添加到
means
*np.random.choice*
默认情况下,接受任何值序列并随机选择替换的数据点。
为了绘制样本均值的抽样分布,我们可以使用 Seaborn 的kdeplot
或 Matplotlib 的hist
。虽然选择权在你,但我更喜欢 KDE 的情节,因为它噪音更小,也避免了宁滨偏见:
正如所料,我们看到了一个非常接近正态分布的匹配。现在,问题是‘我们现在如何对人口参数做出假设?’。这将使用置信区间来回答。
置信区间
一般来说,当你看到有人提到某个指标的 k% 置信区间为[m,n]时,这意味着他们有 k%的把握认为总体指标位于 m 和 n 之间。
你看,当你从概率的角度思考时,你永远不能绝对肯定地说总体参数等于某个数字,因为你只用一个小样本来计算你的假设。因此,统计学家计算参数的区间,并声明参数位于某个区间内。
置信区间的常见百分比是 95%或 99%。区间本身基本上是用百分位数来计算的。例如,为了计算抽样分布的 95%置信区间,您将 2.5%作为下限,将 97.5%作为上限。
另外,记住取“中间”区间,而不是另一个像第 0 和第 95 或第 5 和第 100 百分位。实际参数总是位于更居中的区间。
为了在 Python 中实现这一点,我们将使用numpy
的np.percentile
函数,该函数将采样分布和百分点作为参数:
看着上面的数字,我们可以 95%确定世界上所有钻石的平均价格都在 3899 ~ 3968 美元之间。
我们本可以轻松获得 99%的置信区间:
这次我们得到**【3889.45,3977.59】**。
结论
恭喜你!你学到了大量的新知识,这对你的数据科学职业生涯非常有帮助。请记住,自举只是迈向更复杂的推断统计学和概率论的第一步。正如你将在我未来的文章中看到的,我们将使用 bootstrapping 来制定假设检验,这也是数据科学工作流程的一个重要部分。待调好!
为什么自举真的有效
一个简单的门外汉解释为什么这种流行的技术在数据科学中有意义
内森·杜姆劳在 Unsplash 上的照片
我们不总是有丰富的项目数据。通常,由于缺乏资源来进行重复实验(例如 A/B 测试),我们只有一个样本数据集。
幸运的是,我们有重采样方法来充分利用我们拥有的任何数据。 Bootstrapping 是一种重采样技术,如果我们只在原始样本上拟合一次我们的模型,它可以提供否则无法获得的信息。
虽然我们可能熟悉自举背后的’什么’和’如何’,但本文旨在以通俗的方式呈现自举的’ 为什么 '。
快速回顾自举
bootstrap 的目标是基于从原始样本获得的多个数据样本,为总体参数(例如总体均值 θ )创建一个估计值(例如样本均值 x̄ )。
通过重复采样(替换)样本数据集以创建许多模拟样本来完成自举。每个模拟的 bootstrap 样本用于计算参数的估计值,然后将这些估计值组合起来形成采样分布。
然后,bootstrap 抽样分布允许我们进行统计推断,例如估计参数的标准误差。
引导程序|作者图片
自举为什么有效?
你一定想知道,重复采样同一个 样本数据集的行为怎么能让我们对人口统计数据做出推断呢?
理想情况下,我们希望从真实人口中抽取多个独立的真实样本来理解人口统计数据。然而,我们早些时候已经确定这并不总是可能的。
因此,我们必须使用我们的样本数据集,它成为我们所拥有的关于人口的最好的(也是唯一的)信息。
合理的假设是,大多数样本(如果随机抽取的话)看起来非常像它们所来自的人群。考虑到这一点,这意味着我们的样本数据可以被视为一个总体,我们现在假设它代表了真实的总体。
有了这个虚拟群体,我们就可以从中抽取多个(bootstrap)随机样本。这就好像我们现在从真实人群中获得了多个样本。
注:现实中,原始样本只是我们从真实人群中得到的 一个 样本。
因为允许带替换的抽样,所以 bootstrap 样本也可以看作是在不同方法和假设下产生的随机样本。
从这些 bootstrap 样本中收集的样本信息将最终帮助我们获得总体参数(如总体均值)的(相对)精确估计。
图片来自统计学习入门—第二版 |经许可使用
那么 bootstrap 抽样有多有效呢?上图比较了真实人群中 1000 个模拟样本的参数( α ) 估计值与 1000 个 bootstrap 样本的估计值。
我们可以看到箱线图具有相似的分布,表明 bootstrap 方法可以有效地估计与参数估计相关的可变性。
摘要
在本文中,我们探索了引导背后的直觉的简单解释。希望这篇文章能让你更好地理解自举,以及为什么它在理论和实践上都行得通。
关键概念是假设原始样本代表总体。通过对该样本进行多次重采样,我们得到了总体参数样本估计的相对精确的采样分布。
当然,这里有几个注意事项。例如,在从真实人口中抽样的正常情况下,我们绝不会从整个人口中抽取同样大小的样本。但是,在引导中通常使用与原始数据集相同的样本大小。
关于众多警告的更多细节,你可以查看这个 StatsExchange 论坛线程这里。我也期待你对这个话题的反馈。
在你走之前
欢迎您加入**我的数据科学学习之旅!**点击这个媒体页面,查看我的 GitHub ,了解更多令人兴奋的数据科学内容。同时,祝你自举愉快!
为什么构建黑盒模型可能是危险的
可解释性可以拯救生命
机器学习模型以复杂的黑盒而闻名,其输出和预测背后的推理通常是不可解释的。
由 Unsplash 上的 krakenimages 拍摄的照片
我们需要可解释性吗?
然而,当涉及到“高风险”决策时,我们真的想相信一个黑匣子吗?例如,当涉及医疗保健决策时,机器学习模型预测患者是否可以在重症监护中接受监控或需要特殊治疗(例如,不同的药物治疗)。这些决定不应该由训练有素的医生而不是黑盒算法来做吗?在这样的领域,参与这些“高风险”决策的每个人都“参与”决策是非常重要的。
但是模型是高度精确的,那么我们为什么需要可解释性呢?
经常有人认为我们不需要关心可解释性,因为模型的准确性非常高。这就是它变得危险的地方!通常情况下,模型会发现它们不应该发现的东西,并通过混淆变量来提高准确性。
A 混杂变量 是你没有考虑的变量。它们会毁掉模型,给你提供无用的结果。他们可以暗示有关联,但事实上没有。
这么说,鹳生孩子是真的了!
莫里斯·沙尔克在 Unsplash 上拍摄的照片
2000 年,马修斯发表了一篇名为“鹳分娩婴儿”的论文,他声称分娩和某个地区鹳的数量之间有着重要的关系。他发现相关系数 r=0.62,p 值为 0.008,这支持了他的发现。当然,他只是指出,我们应该意识到混淆变量和关联因果关系:
混淆变量-作者图片
即使两个变量可以表现出显著的相关性,但这并不意味着现实世界中存在因果关系。在这篇幽默论文的结尾,马修斯指出,读者应该更深入地研究一个国家(农村)地区的关系,看看是否与分娩有可能的相关性,而这种相关性更有可能与因果关系相关联。
新冠肺炎诊断中的混淆变量
Alex DeGrave 等人的一篇新论文显示,研究人员和放射科医生最近训练了 ML 模型,可以准确地检测胸片中的新冠肺炎。然而,在调查了模型的性能后,论文中的研究人员发现,该模型通过查看 x 光照片上的文本标记(文本片段)来走捷径,并将其预测建立在标记的位置而不是实际的 x 光照片上。
如果这些标记的位置发生变化(例如,由于不同的 x 光机而在不同的医院),模型的准确性将显著下降,并产生错误的预测,这在疾病诊断的情况下可能是危险的或危及生命的!
射线照片上的文本标记通过显示新冠肺炎预测重要性的显著图来突出显示。与交换相同大小的随机补片相比,新冠肺炎阳性和新冠肺炎阴性图像之间标记位置的交换显著改变了预测——改编自 DeGrave,Alex J .,Joseph D. Janizek 和 Su-In Lee。“射线照相新冠肺炎检测的人工智能选择捷径而不是信号.”
如果你的模型有很高的准确性,甚至可能拾取训练有素的专家看不到的东西,问“为什么它表现得这么好”是非常重要的如果你不问这个问题,你的模型可能不能很好地概括,给你带来很多麻烦!辛西娅·鲁丁
可解释性与准确性
“为了可解释性,我们不得不牺牲准确性!”
为了可解释性,我们必须牺牲准确性,因为我们必须使用不太复杂的模型,这是一个有害的神话。由辛西娅·鲁丁(可解释 ML 的倡导者)提出的一个论点是,建立可解释的模型实际上可以提高准确性。当构建一个可解释的模型时,我们开始质疑和研究它,而不是黑盒模型,并提出更多的问题:
- (确定的)因素真的是推动最终决策的最重要因素吗?
- 我的结果没有任何意义,可能是数据集有问题?也许更多地关注数据而不是模型会提高准确性?
- 如果这些变量很重要,也许它们中的一些可以组合成更有意义的东西(“特征工程”)。
通过了解您的模型并能够解释其预测,您可以通过在数据和特征工程上花费更多的时间来迭代地提高模型的准确性,而不是像构建黑盒模型那样将大部分这些部分从您身边带走。
一旦你开始做更多的数据科学,你就开始获得更多的性能!
那为什么我们还有黑盒模型呢?
所以你可能会问,为什么我们需要黑匣子。嗯,根据辛西娅·鲁丁的说法,这其实很简单:
- 人们喜欢黑盒,他们喜欢这种想法,即这些复杂的算法可以揭示数据中没有人能够理解的秘密。
- 黑盒保护商业!公司通常对构建可解释的模型不感兴趣,因为他们更喜欢没有人可以复制/窃取并且难以挑战的黑盒。
- 黑盒模型不需要任何或很少的领域知识,几乎任何具有基本机器学习知识的人都可以实现。
如果一个模型是一个黑盒,那么很难争论它是否有意义,因为没有人能看到里面发生了什么。你经常剩下的唯一衡量标准是准确性——这是非常成问题的!
如果你有一个简单的可解释的模型,那么人们会争论和质疑它!—然而,可悲的是,这通常不是 ML 工程师和公司想要的。
更多材料
**【1】**数据怀疑论播客——不需要黑盒——辛西娅·鲁丁:https://dataskeptic . com/blog/episodes/2020/不需要黑盒
辛西娅·鲁丁——请停止“可解释的”ML:https://www.youtube.com/watch?v=I0yrJz8uc5Q
**【3】**罗伯特·马修斯—“鹳接生(p= 0.008)”:https://online library . Wiley . com/doi/ABS/10.1111/1467-9639.00013
**【4】**Alex de grave 等人,“用于射线照相新冠肺炎检测的人工智能在信号上选择快捷方式。”自然机器智能(2021):https://www.nature.com/articles/s42256-021-00338-7
为什么 C 对于数据科学来说很方便
为什么数据科学家可能会考虑学习 C 编程语言。
(src =https://pixabay.com/images/id-1873831/
介绍
T 数据科学领域的奇妙世界通常存在于高级声明式编程语言中。这种语言的一个主要例子是 Python,但是只要看看最流行的语言列表,就可以很快发现大多数数据科学家更喜欢使用哪种语法。我通常认为数据科学最重要的三种语言是 Python、R 和 Julia。Scala、SAS 和类似的解决方案当然值得注意,尤其是其中一些选项比 Julia 语言更受欢迎。然而,我认为朱莉娅应该得到这个位置,因为它的采用率迅速上升。这里的要点是检查这些语言的属性。
Are 是一种为统计分析而创建的多范例、声明性、解释型编程语言。Python 是一种通用的多范例、声明性解释语言。Julia 也是一种多范例、声明性的编程语言,但它是编译的。这里我们可以考虑的是这些语言之间惊人的相似之处。所有这些语言都有非常简单的语法,很容易学习。由于今天用于数据科学的所有最流行的语言都具有相同的属性,因此可以有把握地认为这是数据科学家的偏好。
然而,尽管有这种偏好,其他编程语言在数据科学中仍然肯定有应用。例如,C++已经非常受机器学习工程师的欢迎。与用于数据科学的典型解释编程语言相比,这些类型的语言有许多优点。虽然经常有人说,如果你想进入数据科学,你应该学习 Python 或 R,这当然是真的,但了解 C 或 C++等语言也有一些好处。
特别是,我发现 C 编程语言对于数据科学工作来说非常方便。今天,我想讨论一下为什么会出现这种情况,简要介绍一下 C 语言的优点,并解释一下为什么我认为数据科学家可能会选择 C 语言。当然,C 语言是否是您的好选择的答案总是取决于您实际想做什么,但我认为在大多数应用程序中,C 语言可能是实现数据科学的宝贵财富。
学习 C 语言的一般原因
在我们进入数据科学家可能想要学习 C 语言的原因之前,让我们先回顾一下不管数据科学属性如何,你可能想要学习 C 语言的原因。数据科学可以转变为通用工程的情况很多,我认为先了解 C 作为通用语言,再了解数据科学语言当然是明智的选择。
多才多艺的
C 语言的第一个优点是它非常通用。大多数库和头文件都是用 C 语言编写的。几乎所有的编程语言都可以解释 C 语言,因为如果不使用 C 语言,这种语言就无法访问为运行整个系统而构建的代码。您正在阅读本文的内核很可能是用 c 语言构建的。
从最低级别的系统输入一直到最高级别的 web 开发,一切都可以用 C 来完成。与此同时,C 是一种使用了很长时间的受人尊敬的语言。C 语言有很多可用的库。
学问
作为一名数据科学家,我的首要任务之一是永远学习,无论我在做什么。学习是数据科学的一个非常重要的方面,因为数据科学涉及许多不同的学科。也就是说,你可以用你的余生来学习这些学科中的一门。如果你想从更底层的角度了解更多关于计算机的知识,它们是如何工作的,以及它们是如何与代码交互的,C 是一个很好的选择。当我学习 C 语言时,我学到了很多关于计算机的知识,这些信息在处理任何问题时都很方便,即使是像 Python 这样的语言。
快的
正如你对 C 语言的期望,它是一种编译速度非常快的语言。与我们通常用于数据科学的选项相比,尤其如此。如果你想让你的代码运行得更快,你可以直接使用 C 语言。此外,C 代码可以得到越来越多的优化,因为它允许您更直接地与计算机上的硬件进行交互。
c 代表数据科学
既然我们更好地理解了为什么 C 语言擅长做它应该做的事情,现在让我们考虑一下为什么它会是一个很好的选择,或者是一个值得学习的数据科学家。我首先要考虑的一件事是,C 编程语言绝对不是一个人进入数据科学领域应该使用的语言。有很多其他选择可以有效地完成工作,同时减少学习的时间。当您考虑到它在一些数据科学工作中的使用是如此之少时,情况就更是如此了。
计算机编程语言
Python 编程语言在数据科学家中变得非常流行。这种语言是用 C 编写的,最终由 C 解释。也就是说,我们可以使用带有 Python.h 头的 C 轻松地与 Python 交互。不用说,当人们想为 Python 编写更优化的代码时,这很有用。Python 中通常用于数据科学的大多数包实际上都利用了这一点。例如,考虑到 Pandas 和 NumPy 都至少有一部分是用 c 编写的。
快速(再次)
机器学习在处理器上可能是密集的。虽然许多解决方案已经转移到并行计算平台,但有时从更多迭代代码开始可能是一个更好的主意。c 是一种非常快速的语言,它可以更容易地优化,这可以导致更快的算法,所以它肯定是实现可能需要大量处理或内存来执行的机器学习算法的一个很好的选择。
C++
一种被证明非常受机器学习爱好者欢迎的语言是 C++。在很多方面,C++中的++只是面向对象的编程,以及一些使编写 C 更容易的有用特性。也就是说,学习 C 可以成为学习 C++非常坚实的敲门砖。这两种编程语言的代码往往非常相似,很容易理解为什么数据科学家会想了解 C++。如果你想成为机器学习专家,并专注于数据科学的这一部分,那么 C++是一个很好的选择。对于找工作来说尤其如此,因为 C++对于低级机器学习工程师来说是相当受欢迎的选择。
结论
对于数据科学,我们已经完全被 Julia 等伟大的语言和 Python 等伟大的生态系统宠坏了。虽然所有的数据科学语言都很好使用,但有时了解一种迭代语言肯定会派上用场。虽然它肯定不是专门为了从事数据科学而应该学习的语言,但它在数据科学领域会派上用场。对于计算机科学学科来说,这种语言也是一种非常有价值的学习经历。
这个领域的一个伟大之处在于,你有不同的选择。如果您热爱数据,那么您可能有几个不同的选择来更深入地研究它。虽然像 C 这样的语言对于那些想进行高级分析和对数据进行统计测试的人来说可能不太方便,但对于像我这样的数据科学家来说,它肯定会很方便。我通常倾向于编程和计算机科学部分,以及数据科学的机器学习部分。我有一篇文章详细讨论了这一点,以及如果您是数据科学领域的新手,可以采取的一些步骤。对于那些团结一致,只想试一试的人来说,这当然值得一读:
[## 2021 年如何闯入数据科学(8 步)
towardsdatascience.com](/how-to-break-into-data-science-in-2021-8-steps-87cb02a4a1f4)
这当然取决于我的偏好,因为这些是我觉得最令人兴奋的事情,但也因为我一生都是软件工程师。话虽如此,我认为对于一些数据科学家来说,C 语言肯定不是教育的下一步。当然,在数据科学应用中,知道 C 将会成为无用的信息,并且最终会浪费掉本可以用来学习其他东西的时间。然而,如果你对计算机科学和机器学习比对数据科学的其他应用更感兴趣,我当然会推荐你学习这门语言来扩展你的知识和进一步提高你的能力。感谢您的阅读,我希望这篇文章有助于确定学习 C 对于您来说是否是朝着正确方向迈出的一步。
为什么聊天机器人不能和 10 岁的孩子聊天?
自然语言处理的复杂性以及在机器开始处理之前进行数据辩论的必要性
如今,自然语言处理应用程序,如聊天机器人、语音识别和文本摘要越来越吸引人。无数公司已经集成或正在寻求集成智能聊天机器人服务,以更好地为客户服务。研究人员正在拓展的边界,提高自然翻译的准确性,希望有一天机器能够达到并超越人类对自然语言的翻译。
" Alexa,披萨计时器还剩多少时间?"
Alexa 回应那样的问题是微不足道的。但是它在和一个 10 岁的孩子交谈时有多擅长呢?
事实证明,自然语言比目前机器编程理解的要复杂一些。在我们深入研究任何花哨的人工智能算法之前,让我们先仔细看看语言中的模糊性。
语言中的歧义
任何学过第二语言的人都知道,直接的单词到单词的翻译并不总是有效的。通常,你需要重新连接你的心理语言模型来流利地交谈。这就是语言中的歧义。
莱昂纳多·大久保俊郎在 Unsplash 上拍摄的照片
迷失在翻译中
谷歌翻译在过去几年已经变得相当不错了,但是任何以前使用过这个工具的人肯定都观察到了一些奇怪的翻译,尤其是在彼此差异很大的语言之间。
法语短语:“我爱你。”大致可以翻译成以下几句话:“外面真美。”,“真的很好看。”,“天气真好。”
如果我们逐字翻译这句话,意思是“他真的很美”,这在英语中毫无意义。人类更善于根据周围的环境选择正确的翻译。
同一语言内的歧义
同一种语言内部也存在歧义。人们喜欢玩模棱两可的句子,但这对于自然语言处理来说可能是一场噩梦。以下面的新闻标题为例:
“老师打游手好闲的孩子。”
这可以从两个方面来解释。
- 教师罢工,孩子们无所事事。
- 也许老师受够了游手好闲的孩子,决定打他们。
根据经验,大多数人会以第一种方式解释它。但是正如你所看到的,从语法的角度来看,这对机器来说是一项具有挑战性的任务。
预处理
要对这些文本执行任何机器学习,我们首先需要将文本转换成可以分析的格式。每种语言都有自己独特的特征,每种语言都可能需要不同的处理步骤。标记化、停用词移除和词条化是一些比较常见的语言预处理技术。
标记化
记号化是将原始文本分解成称为记号的小片段的过程。这些标记将有助于解释测试集背后的含义。
例如,句子“电影很棒”可以标记为[“The”、“movie”、“was”、“great”]
这一步在英语中可能看起来微不足道,一个简单的解析器就可以完美地工作:
str = "The movie was great"
str.split() # returns ["The", "movie", "was", "great"]
然而,当涉及到像日语这样不以空格书写的语言时,标记化就成了一项更复杂的任务。
映画は良かった (The movie was great)
这里有一篇很棒的文章是为日本人做的。
停止字移除
在 NLP 中,对整体解释没有贡献的词或无用的词被称为停用词。这包括像“这个”、“一个”、“是”这样的词。你可以在搜索引擎中看到这一点。试着在谷歌上搜索关键词“伟大的电影”和“伟大的电影”。尽管从语言学上来说,多一个单词“the”会有很大的不同,但搜索引擎会删除停用词,并提供相同的搜索结果。
停用词移除也可以是可选的步骤。
在像英语这样的语言中,句子是由几个单词组成的,这些单词是由一个共同的词根词派生出来的。想想“玩”和“戏”这两个字都是从“戏”衍生出来的。具有这种特性的语言被称为屈折语言。
对于屈折变化的语言,也有一个屈折变化的程度。根据维基百科的说法,一些语言如拉丁语、希腊语、圣经希伯来语和梵语有很高的音调变化,而其他语言如英语、荷兰语、波斯语和汉语则有很低的音调变化。
在执行 NLP 时,我们希望将这个派生形式“规范化”为它的根形式,以便有更好的理解。
“是”、“是”、“是”->“是”
“汽车”,“汽车”,“汽车的”,“汽车”->“汽车”
这个规范化过程也称为词汇化。
基本特征提取
有许多方法可以从句子中提取特征。在本文中,我将重点介绍更直观、简单的提取方法。让我们从一个简单的例子开始,想象我们想要对下面 3 个电影评论执行一个情感分析。在实现任何花哨的人工智能算法(即分类算法)之前,重要的是我们首先要从训练句子中提取出特征。
- “这部电影很棒。”
2.“这部电影太棒了!”
3.“不推荐看这个。”
Unigram
一个简单的想法是将每个唯一的单词标记为一个特征。在上面的培训示例中,我们现在有 10 个功能。(在这个例子中,我们假设唯一的预处理是小写)
[“the”, “movie”, “was”, “great”, “phenomenal”, “would”, “not”, “recommend”, “watching”, “this”]
二元模型
一些研究人员认为,将句子分解成单个单词,我们可能会丢失一些额外的信息,如单词的邻近性和关联性。为了解决这个问题,我们可以将两个单词组合起来,中间加上一个特殊字符,以创建一个新的功能。
["the-movie", "movie-was", "was-great", "was-phenomenal", "would-not", "not-recommend", "recommend-watching", "watching-this"]
N-grams
上述相同的逻辑可以应用于将 n 个单词组合在一起以形成特征。
现在我们有了特征,下一步是将每个测试句子分配到这个特征空间中。这可以通过以下方法实现:
频率计数
顾名思义,我们可以简单地遍历我们的测试示例,并将频率计数分配给每个特性。如果“was-great”出现 2 次,那么我们可以存储键-值对:
{"was-great": 2}
指示灯
一种更简单的方法是根本不计算频率,只使用 1 或 0 来表示该特征是否出现在句子中。
{"was-great": 1, "was-terrible": 0}
结论
人们对自然语言处理中的预处理进行了广泛的研究,上面提到的方法只是皮毛。预处理的类型也根据 NLP 应用而不同,例如情感分析或文本摘要。
NLP 是一个令人兴奋的蓬勃发展的领域,这是一次内部工作的旅行。
感谢阅读。下次见。