组织 Dbt 模型的最有效方式
命名约定、yml 文件和文件夹结构

@shawnanggg 在 Unsplash 上的照片
Dbt 是分析界的热门工具,而且只会越来越受欢迎。分析师和分析工程师都使用它来以更快、更可靠的方式运行模块化代码。
组织是以对团队有效的方式使用 dbt 的关键组成部分。它的用处取决于您的 dbt 项目结构的组织程度。
对于那些从未使用过 dbt 的人来说,这可能是相当吓人的。幸运的是,这个工具背后的团队已经彻底地记录了他们用于个人客户的结构。
虽然我使用他们的结构作为建立我的模型的指南,但是组织的很多部分依赖于你自己的用例以及你所支持的团队。
一种制度不适合所有人。这在很大程度上是一门艺术,要弄清楚什么最适合你的分析团队。
文件夹结构
dbt 的团队建议将你的模型组织到两个不同的文件夹中- staging 和 marts 。
暂存模型是那些从原始数据文件中读取并涉及数据清理的模型。有时需要连接和更复杂的转换。
Dbt 建议在组织您的模型时,将阶段模型和基础模型包含在这个类别中。基本模型也从源数据中读取数据,但要简单得多,包括对列的转换和重命名。
集市模型是包含聚合、连接和复杂逻辑的更高级的模型。这实际上是包含最终产品的文件夹。

作者图片
当我使用这个文件夹结构作为设置模型的指南时,我添加了一些其他的文件夹来帮助保持事情更加有条理。我们的模型非常复杂,所以有许多中间模型组成了每个核心模型。如果没有额外的文件夹,文件会在风暴中丢失。
我为这些中间模型创建了一个单独的文件夹,这样当我需要它们时,我可以很容易地找到最重要的模型。在这个中间文件夹中是每个核心模型的文件夹(那些存在于 marts 文件夹中的),所以我可以跟踪哪些模型与每个核心模型相关。

作者图片
您还可以遵循 dbt 文档中的建议,在 staging 文件夹下包含一个嵌套的中间模型文件夹。
staging/<source>/intermediate/
此外,我们只有一个用于基本模型的文件夹,而不是暂存文件夹。它们都相当简单,只需要转换和重命名,所以不需要阶段模型。
在基本文件夹中,每个数据源都有一个文件夹,其中包含每个数据表的 SQL 文件。这些 SQL 文件中的每一个都从不同的数据源和表中读取。

作者图片
此外,每个文件夹都有自己的 yml 文件,所以没有一个大的 yml 文件用于所有的基础模型。我想让东西尽可能地容易阅读和理解。有时候一个地方的信息太多会让人不知所措。

作者图片
下面是我遵循的结构的快速概述:
- 基础
- 媒介的
- 市场/核心
在基本文件夹中,它看起来像:
- (文件夹)
- (文件)
在中间文件夹中,它看起来像:
- (文件夹)
- (文件)
最后,在 mart 文件夹中,它看起来像:
- (档案)
命名规格
既然我们已经讨论了文件夹结构,让我们深入实际模型的命名约定。
dbt 团队建议在您的模型名称中使用前缀。根据模型的类型,您应该遵循以下格式:
_
暂存/基本型号
Dbt 建议遵循格式 stg_ <源> _ <对象>。用于所有暂存模型的 sql 。就我个人而言,我发现在我们的基本模型中,给每个模型添加一个 base 前缀是非常多余的,并且会使模型名变得很长。
而是按照格式 <来源> _ <对象>。基本模型的 sql 。因为它们都被组织在基本文件夹下,所以从来没有混淆过。
在这种情况下,Source 是数据源,如脸书、Shopify、谷歌广告或 Snapchat。对象是 SQL 文件从中读取的数据表的名称。
中介模式
虽然 dbt 对于中间模型没有任何明确的命名约定,但这是我如何命名我的模型的。我发现这些是最重要的组织模型,因为它们太多了(至少当你有很多数据的时候)。
我有每个核心模型的简短版本,我用它作为中间模型的前缀。然后,按照 dbt 的建议,我将这些模型基于它们的功能。
_ 。结构化查询语言
例如,我的一个核心模型名为 order_details ,因此它的一个中间模型名为order _ margins _ calculated . SQL。 order_details 的简称是 order,模型的功能是计算产品利润。
集市型号
Dbt 对 mart 模型有一些不同的建议。他们建议在这些模型中使用两种前缀选项:
- fct _ <动词>
- dim_ <名词>
dbt 文档将 fct 表定义为“一个又高又窄的表,表示已经发生或正在发生的真实世界的流程。这些模型的核心通常是不可变的事件流:会话、交易、订单、故事、投票”。
相比之下,他们将 dim tables 定义为,“一张又宽又短的桌子,每一行都是一个人、一个地方或一件东西;在识别和描述组织的实体时,这是事实的最终来源。它们是可变的,尽管在慢慢变化:客户、产品、候选人、建筑、员工”。
我们没有太多关于 fct 表格的应用,但是我们确实使用 dim 表格。然而,并非我们所有的型号都属于这一类别。我们只将 dim 表用于将几个不同的表连接在一起的更基本的模型。
例如,我们有一个模型 dim_products ,它将所有与产品相关的表连接在一起。这些类型的模型使我们的分析师的工作变得容易得多,因为他们不必担心每次需要编写分析时将所有的表连接在一起。
我们的其他核心模型是根据它们包含的数据命名的。我发现以它们所提供的功能命名它们,并使用后缀 details 很好地解释了模型*。*但这都是个人喜好!
Yml 源文件
保持 dbt 模型有组织的最后一个关键部分是编写 yml 源文件。这些包含所有与您的模型相关的文档。它们详细描述了模型名称、描述和列。
这些文件中的完整文档是理解您的数据和传达您构建的每个模型的价值的关键。这将成为您所有 dbt 模型的数据字典(字面上的意思)。确保你正确使用它!
使用命令 dbt docs serve 将这些 yml 文件作为 dbt 文档提供。 Dbt 将以创建一个完整网站的方式组织这些文件,您的文档可以在该网站上保存,并且组织中的任何人都可以轻松访问。
我建议用它们所在的文件夹来命名这些 yml 文件。例如,如果文件位于核心文件夹中,它将被命名为 core.yml 。这个 yml 文件将包含核心模型的所有描述和列。
当您在每个 yml 文件中构建模型时,请确保完整地记录您的模型。构建时包含的细节越多,将来就越容易理解模型。
结论
请记住,您的 dbt 项目是按照您制定的约定来组织的。随着您的数据团队的成长以及多人开始访问您的模型,命名约定和文件夹结构变得越来越重要。
我强烈建议整理一份风格指南,详细介绍我们刚刚讨论过的所有信息。这不仅便于你将来参考,也便于你的团队参考。
请记住,如果您发现某些东西不工作,您可以随时更改这些东西。只是要确保在深入构建模型之前尽早这样做。当你认识到问题的时候,在问题开始的时候解决问题要比在问题已经造成太多损害的时候解决问题容易得多。
快乐大厦!
通过订阅我的电子邮件列表,了解更多关于其他流行的现代数据堆栈工具的信息。
机器学习最令人兴奋的方面

JD Mason 在 Unsplash 上的照片
是的,是计算机视觉
这篇文章是对机器学习(ML)这个奇妙领域中的一个特定部分的探索。你应该从这篇文章中获得以下之一:探索对你来说可能是新的机器学习领域的新热情,或者与你有相似兴趣的新朋友。
大约在 5 亿年前,第一个有机体开始通过视觉感知观察它的环境。今天,我们有人造机器和照相机能够从输入到它们的光学或远程传感器的输入数据中获得对风景的理解。可以肯定地说,我们已经走了很长一段路。
尽管智能的定义模糊不清,但智能的一个公认的重要组成部分是智能体创建其环境模型的能力。了解我们的环境和其中的物体(或其他代理)允许进一步的活动,如预测,决策,分类,建议等。

Robina Weermeijer 在 Unsplash 上拍摄的照片
当你阅读这篇文章时,进入你眼睛的光线转化为电信号,被视神经接收并发送到大脑。反过来,大脑提供这些信号的可视化,以模拟其环境。人类生物学令人着迷,极其复杂。
然而,我们已经承担起在几百年内复制自然界花了几十万年才形成的东西。
关心的领域
如果你读过我以前的一些文章,你可能会猜到计算机视觉领域对我来说是目前最令人兴奋的机器学习领域。
计算机视觉(CV)是机器或系统如何通过调用一个或多个作用于所提供信息的算法来生成对视觉信息的理解。这些理解被转化为决策、分类、模式观察等等。


左图:西蒙·贝克在 Unsplash 上拍摄的照片。右图:布拉姆·范·奥斯特在 Unsplash 拍摄的照片
计算机视觉技术是我们日常使用的大多数人工智能应用的背后,从智能手机的面部识别功能到即将到来的无收银零售店,让我们不要忘记每个人最喜欢的汽车品牌的自动驾驶汽车功能。想想在 60 年代,解决计算机视觉曾经是一所大学的学生暑期项目,或者故事是这样的,这几乎是疯狂的。
在 CV 领域内,有许多问题需要解决;常见的有物体检测、物体识别、姿态估计、手势识别、人脸检测、深度估计等。我不会深究常见的简历问题的细节,但你可以看到简历领域有很多事情让你忙碌。
回首往事

计算机视觉和深度学习使得 GPU(图形处理单元)在机器学习中变得司空见惯。
GPU 是机器学习研究人员和工程师的标准硬件,这种硬件使 Nvidia 成为当今最有价值的科技公司之一。
GPU 旨在加速图形渲染和纹理映射等处理任务。GPU 与机器学习应用相关的关键属性是它们同时处理和执行数据计算的能力,以及它们快速的内存变更。
研究人员使用 GPU 来训练和测试机器学习技术,以解决视觉处理和图像识别等计算机视觉任务。2006 年,微软的研究人员发表了一篇论文,介绍了使用 GPU 来训练和测试用于文档处理的卷积神经网络。研究人员受到了 D. Steinkraus 等人的早期工作的启发。
使用卷积神经网络(CNN)解决计算机视觉相关任务也是机器学习领域的一个转折点。CNN 利用数学卷积运算并使用二维滤波器,其中滤波器的值在训练期间通过反向传播进行修改,反向传播是一种能够在神经网络内学习的技术。CNN 非常适合图像识别和分类等计算机视觉任务,但在标准 CPU 上训练起来非常慢。因此,早期的 ML 研究人员开始探索使用 GPU 来训练和测试 CNN。
GPU、深度学习以及高度准确和高性能的模型开始年复一年地出现,特别是在 2012 年推出 Alex net之后。AlexNet 在 NVIDIA GTX 580 3GB GPU 上进行训练,由 8 层组成,包括 5 个 conv 层和 3 个全连接层。当时,它在图像分类方面达到了最先进的水平。
这里的关键要点是,在试图优化神经网络的训练和测试以解决计算机视觉任务时,研究人员探索了 GPU 和不同神经网络架构的使用。
各种应用
我觉得计算机视觉有趣的另一个原因是它对不同问题的广泛适用性。还有大量的工业应用解决方案以某种形式或方式利用了 CV 技术。
我从未想象过在开发 iOS 移动游戏应用的游戏工作室工作,但事实证明,智能手机上的摄像头打开了一个可能性的世界。想象一个增强的虚拟现实。

UNIBOA 在 Unsplash 上拍摄的照片
我使用构建和训练的模型来解决姿势估计、对象检测和手势识别。这些型号为 2–5MB(兆字节);有比这些模型更大的 mp3 歌曲可以实时预测 17 个人体关节的位置。简直惊艳!
你必须承认,机器学习模型的研究和商业应用之间的差距正在缩小,这主要是由于寻找开发和交付机器学习模型的优化方法的持续工作。英特尔(Intel)、苹果(Apple)和英伟达(Nvidia)发布的优化人工智能芯片提供了平台,移动优化的人工智能模型可以在没有计算限制的情况下运行。

就行业相关性而言,如果你有计算机视觉专业知识,你就可以接触到广泛的行业选择。医疗机构需要计算机视觉专家来开发算法,以改善 x 射线图像的图像处理,并简化从分析到诊断的医学成像流程。国防和安全机构需要计算机视觉专家来构建检测和跟踪算法。汽车制造商和科技公司正在招聘 CV 工程师,以帮助实现自动驾驶汽车。
如果你是杰出的,对计算机视觉充满热情,你的技能的未来相关性是无限的(警告 : 只要你保持它们是最新的)。
你可能会发现大多数管理学科在现代公司中都有一席之地,尤其是现在社会依靠技术和数据运作。
未来
令人兴奋的是,看到机器拥有类似的感知能力和对风景的理解能力,而这些能力是大自然花了几百万年才开发出来的。
商业市场和媒体的注意力都集中在引入自动驾驶汽车上。特斯拉是这一领域的领先公司,充分利用摄像头作为其车队中唯一的视觉传感器。

戴维·冯迪马尔在 Unsplash 上拍摄的照片
特斯拉最新的演示展示了他们的进展,例如从视频输入中获取时间数据,并创建一种新的神经网络架构,该架构接受向量空间中的输入数据,而不是标准的 2D 向量表示图像。
大数据和人工智能技术在社会上越来越普遍。同时,消费者已经将隐私作为首要关注的问题,尤其是在使用连接到互联网的应用程序时。在一个个人数据构成个人数字身份的世界里,隐私问题变得至关重要。计算机视觉应用是人工智能监管讨论的前沿。一个例子是在公共场所使用人脸检测和识别系统。
至于我,我目前正在使用计算机视觉解决方案开发一个移动应用程序,该应用程序可以实时监控远程和办公室工作人员的姿势变化并提出建议。我参与的另一个令人兴奋的项目是使用笔记本电脑摄像头跟踪眼睛来检测读者中的读写障碍。毫无疑问,这些都是令人兴奋和有趣的项目。
如果你想了解更多关于计算机视觉和深度学习的知识,你可以在我即将到来的 O’Reilly live 培训课上和我一起学习。
想要更多吗?
- 订阅 在我发布文章时获得通知
- 成为推荐媒介会员,支持我的写作
- 通过 LinkedIn 联系我
- 跟我学学 奥赖利
亚马逊 RDS 让您物超所值
绩效评估和成本节约方案

亚马逊 RDS 最物有所值—通过 Shutterstock 获取图片(标准许可)
Amazon RDS 是一个强大的托管数据库服务,可以根据您的需要轻松创建、扩展和配置。
然而,亚马逊 RDS,像大多数 AWS 服务一样,如果没有正确的设置和监控,会很快产生高额(更重要的是浪费)成本。
作为一名数据库维护人员,这份服务概述将为您提供如何让您的资金发挥最大价值的高级原则和工具。
*在本文中,我将重点介绍 PostgreSQL 数据库类型,但是其他 DB 引擎也有相同或非常相似的配置和指标。只有 Amazon Aurora —无服务器会有很大不同。
亚马逊 RDS 的主要成本来源
在创建或更新 Amazon RDS 实例时,您需要考虑 4 个主要的成本相关配置:实例类、多 AZ 配置、硬盘存储和供应的 IOPS,然后是支持服务:快照和到 S3 的快照导出。让我们深入探讨每一个问题。
实例类 ( 成本影响:高 )

实例类(作者图片)
这是成本的主要驱动因素。它定义了硬件类型用途、vCPU、CPU 信用、内存和网络性能。它是按小时计费的(和/或胸围积分,如果适用的话), RDS 有大量的实例选项供您选择。
实例类型列表及其用途此处和定价此处。
多 AZ 配置(成本影响:高)

多 AZ 配置(图片由作者提供)
它为您的实例增加了冗余,以防出现故障。对于生产数据库来说,这是必须的,但对于开发和试运行来说就不那么重要了。如果主实例出现问题,warm 实例将始终处于备用模式,因此成本几乎会翻倍。确保除非在生产环境中,否则不要使用它。
启用多 AZ 配置还会增加实例类型、硬盘存储和 IOPS 的成本。
硬盘存储(成本影响:中低)

存储自动缩放(图片由作者提供)
它可以是磁性、固态硬盘、+/-调配的 IOPS。这里的选项在成本方面没有太大的问题,即使磁性将比 SSD 便宜。它是按 GB 计费的,而且非常低。当然,如果你在几十万 GB 的数据库中,你可能要多注意这一点。调配的 IOPS 也会变得非常昂贵。
**Pro 提示:**当你设置存储时,选中“存储自动缩放”,它可以自动缩放(使用的额外存储之外),如果数据发生任何重大波动,它将防止你的数据库下降。造成这种情况的原因不仅仅是数据的增长,还可能是因为读取副本滞后、数据未被清空,或者在请求大量涌入时索引未被重构(仅举几个例子)。当然,你不应该依赖于这种长期的和调整“分配的存储”,一旦它被注意到和永久的。
快照(RDS 备份)(成本影响:低)
这是非常低的,对整个账单几乎无足轻重。您可能需要注意的是保留期,因为您需要支付备份、存储和数据传输的费用。对于非生产数据库,您可以将保留期设置为 3 -7 天,以消除长期存储成本。
供应 IOPS(成本影响:中到高)
IOPS 是一种额外的配置,默认情况下不会应用,但如果使用它们,您应该小心,因为它们会显著影响成本。
快照出口到 S3 (成本影响:低)
这不是大多数人使用的常见选项,但尽管如此,还是要意识到与此相关的成本。随着数据库规模的增长,it 成本也会增加。
性能测量&实例调整
既然您已经运行了数据库,那么您需要将重点放在监控和优化上。我已经确定了评估的主要指标:
- 网络流通量
- CPU 利用率和/或 CPU 信用使用
- 可释放内存
- 读 IOPS,写 IOPS
- 突发余额和/或 CPU 信用使用

Amazon RDS–>(特定的)数据库实例–>监控(图片由作者提供)
这不是一个完整的列表,而是几个你应该注意的基本列表。这些特定的指标将决定是否需要改变。当我们在这里讨论节省时,您正在寻找浪费的资源或低于实例类允许的 50%的资源利用率。
理想的规则是,平均来说,您希望利用 75%的允许资源。是的,你甚至可以达到 85%-90%,但这真的会推动极限,如果意外的激增发生,你会走投无路。
让我们深入了解每项指标。
网络吞吐量
这里的用法将指示实例类类型的变化,特别是网络性能规范的变化。
CPU 利用率和/或 CPU 信用使用
评估 CPU 使用情况。如果您使用的太少,您可以缩减到具有不同的内核数量和 vCPU 单元的实例。
可释放内存
评估您使用了多少内存,尤其是在您的高峰期,75%左右的利用率是正常的。如果你用得太少,你可以缩减到一个更低内存容量的实例。
读 IOPS,写 IOPS
它决定了访问你硬盘的速度。此处的任何更改都将决定您的硬盘类型和/或配置/取消配置额外的 IOPS 的更改。
关于 IOPS 的更多信息和确定您的基本上限
突发余额和/或 CPU 信用使用
*仅适用于“可突发的性能实例”
如果您的实例类型属于此类别,请密切注意,因为可突发的实例可能会超出实例容量,这将产生成本。
另一方面,如果您没有使用这个选项,您可能希望获得一个具有较低 CPU 信用/小时的实例。为了评估最适合您的方案,您必须监控两个指标——“突发平衡”和“CPU 信用使用”。
**警告:**这些指标都不是独立工作的,因为实例类不是每个指标都可以配置的,但是它们是一组预定义的配置。您需要确定哪一对最适合您的用例。
**专业提示:**如果不永久投入生产,至少在最初几个月启用性能洞察。使用该工具,您将能够在您的堆栈上或直接在使用数据库的应用程序上微调查询、连接和许多其他事情。
通过这些内部的优化可以导致更广泛的实例优化,并潜在地降低实例类型的规模和更多的节省。
关于性能洞察的更多信息
节约成本的附加方式
保留实例

AWS 控制台- >亚马逊 RDS - >预约实例(图片由作者提供)
如果您打算长时间运行同一个实例,那么保留实例(RI)是一个不错的选择。如果您承诺一年或更长时间,它可以为您节省大约 30%到 50%。
一个有趣的细节是,您正在为一个特定的实例类类型所使用的单元付费。这种承诺允许您通过仍然利用预留来扩大或缩小同一个实例类。
关于保留实例的更多信息
建立账户/服务预算
最后,如果您不确定您需要什么样的配置属性,您至少应该建立一个预算并相应地进行监控。您可以在“我的计费仪表板”->“预算”下完成此操作。这不会直接帮你省钱,但这是监控成本的主动方式。
结论
这是一个非常简短的介绍,介绍了如何在高层次上评估您的 Amazon RDS 实例,但是它应该让您朝着正确的方向开始。如果您需要更深入的研究,您将必须彻底阅读 Amazon RDS 文档,通过 CloudWatch 和 Performance Insights 保持监控,并检查什么最适合您的用例。
另外,阅读
联系人
我是一名软件、数据和机器学习顾问,通过了 AWS 机器学习 & AWS 解决方案架构师认证——专业。如果您的下一个机器学习项目需要帮助,请联系我们。
关注我的最新文章和项目,关注我的媒体。
其他联系人:
亚马逊 S3 最物有所值
在节约的前提下利用云存储的强大功能

亚马逊 S3 的最物有所值——图片来自 Shutterstock(标准许可)
亚马逊 S3 是 AWS 旗下的文件基础云存储。它可以用于任何类型和大小的文件。它具有无限的可扩展性、持久性和行业标准安全性(正确配置时为**)。它可以作为一个网站资产主机,一个实际的网站,或一个数据湖,它的即插即用与任何 AWS 服务。*
对于大多数零件来说,亚马逊 S3 非常便宜。但是,当数据不断堆积时,这可能具有欺骗性,并且没有针对最佳预算进行监控。无论您是数据工程师、数据科学家还是网站管理员,您都可能会陷入不必要成本的陷阱。在这篇概述中,我将向你展示在亚马逊 S3 上超支最常犯的错误,以及如何从一开始就避免它们。
*亚马逊 S3 是一个非常严格的系统,有许多用例。在我的概述中,我将介绍最常见的方法以及在其中需要寻找的内容。
存储类
存储类是 S3 的核心,也是最容易被忽视的选项,因为人们会选择默认的——S3 标准通用类。将数据放入(或移动到)正确的位置将是成本的一个驱动因素。在选择存储类别时,需要考虑的是数据的生命周期和更长时期的访问频率。
存储类别快速概述:
S3 标准—通用 这是最常见的一种,也是您默认启动的一种。它用于经常使用的数据。
S3 智能分层
该层用于未知或不断变化的访问模式。它会自动确定哪些数据不经常被访问,并为您移动这些数据。您可能会为监控支付额外的费用,但是如果您真的不知道您的数据,并且没有设置生命周期规则,这是值得的。您还需要为每 1000 个生命周期事务请求付费,因此,如果您有大量数据,您不希望在存储类别之间来回移动太多,这样可能不是您的最佳选择。
***S3 标准-IA-频繁访问:*用于检索频率较低但需要快速传输的数据。这是一种较低的存储成本,但您需要为数据检索付费。
S3 一区-IA: 数据访问不太频繁的地方。顾名思义,它不是由第二个区域备份的,所以它应该只用于可复制的数据,类似于第二个备份。
***S3 冰川:*不常用的访问层。可以在几分钟到几小时内检索数据。这是存储备份或旧版本的地方。存储很便宜,但是你要为数据传输付费。
***S3 冰川深层档案馆:*专为极不频繁的访问而设计,一年大约 1-2 次。数据检索可能需要几个小时。存储是所有选项中最便宜的,但你要为数据传输付费。
***S3 前哨:*用于本地存储,与 S3 API 交互以获取数据。当您有内部数据存储需求时,这是理想之选。
生命周期规则

“创建生命周期规则”位于“管理”选项卡下(按作者分类的图像)
生命周期规则的主要思想是在存储类之间自动移动数据,删除旧数据或版本。功能非常强大,超级好用。从我的经验来看,它通常根本不被使用。生命周期规则是一劳永逸的,是一种“无服务器”的方式来抽象您的数据管理,并通过设计保持低成本。
版本控制

亚马逊 S3 版本设置(作者图片)
这是一个非常简洁的特性。适合审计需求。如果您需要使用此选项,您在这里可以做的最好的事情是将旧版本过渡到更便宜的长期存储类别,或者通过生命周期规则在几天内删除旧版本。
版本控制的生命周期规则示例
您将为多次存储数据付出代价,这就是为什么我建议以生命周期规则为例:

版本控制的生命周期规则示例(按作者分类的图像)
1.从 S3 标准(假设它是默认的)在 1 天内将旧版本移动到 S3 标准-IA。从 S3 斯坦达尔-IA 在 4 天内将文件转移到 S3 冰川
现在,请注意与转移到 S3 冰川相关的每个文件的转移成本。
加密类型&成本

亚马逊 S3 加密设置(作者图片)
在 S3,您可以选择加密静态数据。您可以加密整个桶或单个文件夹/后缀。您可以选择使用亚马逊 S3 密钥(SS3-S3)或 AWS 密钥管理服务密钥(SSE-LMS)。如果你使用一个自定义的(你自己的)KMS 键,它的工作方式是每次你从 S3 读取一个对象时,它也会调用 KMS API,这会产生成本。例如,如果您使用 S3 作为数据湖,或者使用 Athena,那么每次读取文件都会增加不必要的成本。您确实可以选择 Bucket Key,通过最大限度地减少对 KMS 的 API 调用来降低成本,但您最终还是要支付一笔竞价。
我建议你去 SS3-S3,除非你有其他要求。
*加密可能是一个特定的项目要求,在这种情况下,您需要选择最佳架构,并向利益相关方说明成本。
S3 为数据湖
在 S3 上为数据湖存储数据时,p artitioning 和文件格式是这里的主要关键字。您希望以一种需要对更多文档进行更少扫描的结构来组织文件。会更快更便宜。这也是生命周期规则再次发挥作用的地方,它可以帮助您自动清除任何陈旧数据或将其归档到长期存储中。
此外,确保以尽可能小的格式存储数据。例如, Parquet 或 Orc 将是从 AWS Athena 查询数据和从 AWS Glue 爬行的理想选择。默认情况下,大多数 AWS 服务都支持这两种格式。这不仅是最佳实践,而且可以最小化存储大小。
网络服务的 S3
这里最常见的用例是托管网站图像或其他资产,如 javascript、样式表(CSS)、缩略图等。你甚至可以在 S3 上建立一个静态网站。在所有这些使用案例中,您将为数据传输到互联网付费。如果这是您的预期用例,您肯定应该使用 Amazon CloudFront 来缓存任何长期永久资产,并从那里为它们提供服务。这还将大大提高资产加载的速度,并降低直接从 S3 读取数据的成本。是的,你需要为 CloudFront 付费,但这比直接使用 S3 要少得多。
结论
S3 的大部分零件都非常便宜。前 50 TB 的标准存储仅为每 GB 0.023 美元(*撰写本文时的价格)如果您是一家大型或小型企业,这对您来说可能不是一个大数目。我个人不喜欢口袋漏水,为什么不从我的项目一开始就防止任何损失。对于基于 AWS 的构建,我总是遵循 AWS 良好架构框架的5 Pillers,成本在其中扮演了重要角色。希望我给了你一些好的见解,告诉你如何在亚马逊 S3 上从几块钱到几个猎人。
另外,阅读
亚马逊 RDS 最划算
联系人
我是一名软件、数据和机器学习顾问,通过了 AWS 机器学习 & AWS 解决方案架构师认证——专业。如果您的下一个机器学习项目需要帮助,请联系我们。
关注我的最新文章和项目,关注我的媒体。
你在学校学不到的最重要的数据课程
以及为什么它如此重要
当我回想起我在大学和数据科学训练营做的项目时,我回忆起获得好的、干净的数据是多么容易。只需从 Kaggle 点击“下载”,你就有了可用的数据和一个整洁的小数据字典。或者,也许你收集了你自己的数据,所以你可以完全控制你的样本量,你对数据了如指掌。
啊,那些日子。

我的大部分数据科学课程始于数据科学项目周期的第 2 步,这是我在进入职场后真正学到的。第一步是获取和清理数据。那么我认为关于数据最重要的一课是什么?归结起来就是这句老生常谈:垃圾进,垃圾出。
在开始获得业务洞察力之前,在建立模型之前,在进行探索性数据分析之前,您需要良好、干净的数据。这是一个显而易见的说法,但我认为它在教育中被忽视得太快了。然后,你开始找工作,专业人士会抛出类似“一个数据科学家 80%的时间都花在清理数据上”的统计数据。[ 1
…但那真正的是什么意思呢?
这意味着如果没有高质量的数据,你的分析就没有洞察力。这意味着没有正确格式的数据,您的模型将无法工作。这意味着如果你从错误的数据开始,不解决或者至少不理解数据集中的问题,你的项目从一开始就注定失败。我并不想悲观,只是更现实地看待数据收集和数据清理过程的重要性。
有许多问题会导致数据领域中的“垃圾”项目结果。人们厌倦了清理数据,因为这可能非常乏味。或者可能是因为公司缺乏适当的数据治理,所以进来的数据质量很差。也许分析师有一些数据,但是因为数据收集成本很高,所以没有足够的数据来建立模型。
不管是什么原因,匆忙完成——甚至跳过——数据清理过程可能对您的分析有害。
那么,一个有抱负的数据分析师应该做些什么呢?以下是我的一些建议:
1。为学校(或个人)项目练习使用真实、杂乱的数据。
这可能包括学习更多的技能,比如网络抓取。这将比挑选一个完美整洁的数据集更难,但建立这些批判性思维和编码技能可能对你未来的职业生涯非常有价值。
另外,如果你正在找工作,这是建立你的项目组合的好方法。
2。对如何收集数据以及任何已知或潜在的差距保持透明。
当我开始一个项目时,我发现列出我的假设和数据中的潜在差距很有帮助。透明可能会让同学(或同事)发现盲点或错误的假设,从而使结果无效。此外,明确你的发现的局限性是合乎道德的,尤其是当你在做规定性分析的时候。
3。在进入分析模式之前,请确保您真正理解了数据。
有时候我在项目中最难理解数据。一旦我获得了数据,我必须花一些时间与公司的主题专家或我的好朋友谷歌一起更好地了解数据的背景。
了解源数据有助于您了解如何在数据清理期间处理某些字段。例如,了解数据集中记录的唯一性有助于了解如何将它们连接在一起。了解字段的含义有助于您确定应该将它们更改为什么数据类型。最后,了解您的数据字段如何相互关联可以为您在为建模预处理数据时需要进行的转换提供信息。

数据清理还有许多其他的成功策略,但是这些是我根据自己的经验想到的最好的策略。我希望你能从我所犯的错误中有所收获,不要采用上述三种策略。
简而言之,数据清理很难,但对数据分析师或数据科学家的成功至关重要。虽然学校的课程通常侧重于分析方法,但数据清理总是必须放在第一位。
感谢阅读!如果你想在收件箱里看到我的新故事,你可以订阅我的个人资料。
最重要的编程课
意见
学习编程的趣闻和调试技巧

布雷特·乔丹
2012 年秋天,我走进研究生导师的办公室,问她推荐我报读哪个计算机科学班。我解释说我完全是编程新手。她建议介绍 C 编程。听了几次讲座后,我发现在这个入门课程中,我交谈过的大多数学生都有一些编程的经验。六周 80 小时的工作后,我放弃了这门课程。
进入 2013 年春季学期。我参加了一个更简单的计算机科学课程,通过网络的计算机编程入门。我轻松地通过了课程的前四分之一,轻松地执行 HTML 和 CSS。然后,我们开始了 Javascript (JS)。我之前的计算机科学课程带给我的那种持续的焦虑和压力感又回来了。学期太晚了,不能放弃这门课,所以我向一个朋友求助。
一天下午,他向我介绍了我的 JS 代码,并解释了如何在这里和那里添加一些代码来测试您的函数是否按预期工作。他向我展示的是一种非常基本的调试形式,即识别和消除计算机硬件或软件错误的过程。他和我都不明白这 60 分钟的辅导课可能会对我的职业轨迹产生的影响。回顾过去,毫不夸张地说,这是我在计算机科学和技术方面学到的最重要的一课。
如果你以前从未写过任何代码,想象你的任务是画一只完美的鸟。每次你完成画并把它交给老师,老师会立即决定它是正确的还是不正确的(即二元结果)。每当试卷有瑕疵时,老师就会把它撕掉。如果你问老师出了什么问题,他们会用外语(即计算机错误语言)向你解释这个问题。最终,在老师尝试了几十次后,他们可能会接受你的画,你的分数会从错误变为正确。读完这个故事,你可能不会认为我的下一个声明是如此大胆(双关语)。
在学术界,没有什么比学习写代码更能考验你的耐心和承受不断拒绝的能力了。
在学习编码时,唯一能给你安慰的是你是否理解了调试的基础。现在,当我画一只鸟时,老师会提供反馈,看鸟喙是否好看,颜色是否合适,大小是否合理。有了这些反馈,你的提交就更有可能是正确的,而不会被拒绝。
无论您是否定期编写代码,调试的基础知识在您的生活中都会非常有用。每当你需要使用任何种类的软件应用程序或工具时,它们都适用。根据我个人在技术方面的经验,这里列出了我最喜欢的各种软件应用程序和工具的调试技巧和诀窍。
使用 Web 应用程序
Web 应用程序是用户通过 web 浏览器访问的计算机程序。常见的网络应用程序有脸书、Gmail 和 Salesforce。如果您在使用 web 应用程序时遇到问题,通常可以通过以下方法之一解决问题:
- 尝试不同的浏览器。在某些浏览器中,各种功能可能无法工作
- 关闭插件。插件可以影响浏览器中的 web 应用程序
- 清除 web 浏览器中的缓存
- 重新启动 web 应用程序
- 检查该问题是否特定于您的应用程序版本。
- 确认您拥有哪些安全角色。某些功能可能不可见,因为您没有权限。
- 重新启动计算机
导入数据文件
导入数据文件(如 xls、CSV、pdf 等。)到 web 应用程序或一段代码中是一项常见的任务。常见问题往往与以下内容有关:
- 检查列名引用是否正确。它们可能区分大小写。
- 删除任何无法识别的字符。尝试用 UTF 8、UTF-16 或 ASCII 编码文件。
- 注意前导零和/或前导零被去除。检查数据类型,是字符串、浮点还是整数。
- 从数据中删除前导和尾随空白
- 检查文件是否为正确的文件类型(例如 xls、csv、pdf、jpg)
- 确认列中的所有值都在可接受的规则范围内。有些列需要特定的数据类型(如字符串、整数等)。)和/或它们可能要求该值存在于受控列表中(例如,在颜色列下仅接受“红色”和“蓝色”)
- 导入前删除所有空白行
- 导入后的电子邮件通知可能会发送到您的垃圾邮件文件夹
所有编程语言
- 检查整个脚本中的变量值,查看它们是如何变化的
- 打印出函数中的文本,以测试它们是否以及何时被执行
- 使用集成开发环境
- 在代码中使用大量的注释
- Stackoverflow 和 Google 是你的朋友
- 检查您正在使用的编程语言或库的版本。不同版本之间的事情可能会发生巨大的变化。
- 将冗长的代码片段分解成较短的片段。例如,不要用一个巨大的 JSON 字符串测试代码,试着在一个小的子集上测试它。更好的是,创建自己的 mini-JSON 字符串来进行测试。
- 为每一行代码一步一步写下计算机的动作。 Python Tutor 提供了一个很棒的视觉效果,带你一行一行地执行代码。web 工具适用于 Python、Javascript、Java、C 和 C++。
- 检查是否有人为您的特定用例创建了一个可以让生活变得更简单的包。例如,在 Pandas 中操作数据要比使用原生 Python 容易得多。
Javascript 编程
- 在函数中使用 console.log()打印文本或变量值,以测试它们是否以及何时在脚本中执行
- 经常清理你的浏览器缓存
- 尝试不同的网络浏览器——插件会干扰代码
- 升级您的 web 浏览器—旧版本可能不受支持
Python 编程
- 对象名称区分大小写(例如,“变量名称”与“变量名称”不同)
- 请密切注意错误消息。他们通常会解释问题是从哪一行开始的。
- 检查这是否是 Python v2 相对于 Python v3 的变化
- Python 有很棒的文档
SQL 编程
- 测试脚本时,利用限制来提高性能
- 检查是否由于您使用的 SQL 数据库而存在特殊的语法规则或限制。例如,MySQL 使用#作为注释行的开头,而 PostgreSQL 使用–作为注释
- 不要用保留字来命名表格或变量
- 通过在 Excel 中复制对数据子集的预期操作,确认输出表是正确的。
最重要的调试建议
说到学习计算机科学和编程,我希望我的教授们强调学习调试代码的重要性。希望我的提示和技巧能减少你写代码时的焦虑和挫败感。哦,我把最好的建议留到了最后。
如果你不能解决一个问题,先睡一觉,稍后再回来。
-
说真的。带着更少的压力和全新的视角来帮助你在几分钟内找到解决方案,而不是前一天花几个小时。这个建议一次又一次给我带来了好处。前几天,我花了 5 个小时写一个 JS 脚本,但毫无进展。几天后我又回到了这个问题,当我重新打开浏览器时,我很快发现这是一个缓存问题。这个建议唯一不起作用的时候是没有时间的时候。小心点,拖延者们!
- 数据通才
数据工程师最重要的工具
与 Python 或 SQL 无关

解决错误问题的最好的技术专家注定会沮丧和失败。然而,我们经常看到伟大的 Python 开发人员和 SQL 专家开发出不可思议的技术,却没有给企业增加多少价值。在某些情况下,情况更糟。这些解决方案消耗了资源,扰乱了业务流程,而不是有争议的价值。作为数据工程师,我们有责任充分理解我们的解决方案所支持的业务流程。
作为高级数据工程师,我们应该非常了解业务,我们建议提高工作效率和改进工作方式。一个大胆的声明,但我会舒服地死在这把剑上,和任何不同意的人战斗。当然是象征性的,因为我没有剑,我更像一个情人而不是战士。关键是,我们需要了解业务,有一个重要的工具可以帮助我们实现这一目标。
在我们开始之前,请阅读 Julien Kervizic 的精彩语录,它简洁地指出了问题所在:
“如今,通过了解底层数据和随之而来的业务流程来塑造数据,似乎没有移动数据的能力那么重要。”
他在这里说的是,我们如此专注于将数据从那里移动到这里,以及我们可以用来做这件事的所有酷工具,我们已经忘记了我们最初做这些事情的原因。数据工程师从多个来源收集原始数据,并创建可消费的包,使人类和机器能够有效地使用。对于我们的消费者来说,介于两者之间的一切都是一个黑匣子。为什么我们把大部分时间和精力花在黑盒上,而不是耗材包上?
愤世嫉俗的观点会说这是因为黑盒是有趣的部分。虽然这可能是等式中的一个因素,但我相信我们中的许多人只是没有足够好地理解业务流程,以有效地将时间花在改进可消费包上。让我说清楚。更好地理解业务是你的工作和责任。不容易。在一个完美的世界里,我们有很好的文档可以依赖,但是…嗯…你知道。这是我们数据工程工具箱中最重要的工具。
这是什么必备工具?
问题。就在那里。问题。很多人。好的。不好的。尴尬的。所有的问题!这对你来说足够重要了吗?你想从优秀走向伟大吗?提出问题,充分理解你所支持的业务流程。与一个只关心技术的数据工程师交谈是多么令人沮丧,我怎么强调都不为过,而我就是一名数据工程师。想象自己是一名财务分析师、人力资源主管或销售人员。他们需要可消费的数据包,但可能不懂技术术语。除了他们使用的特定工具之外,他们可能对技术知之甚少。
所以,仅仅提问是不够好的。相反,我们需要用企业理解的语言提出正确的问题。忘记表、数据源和主键。这些事情随后发生,并且通常由更多人的更多问题来决定。相反,问问人们在日常工作中做些什么。询问业务目标是什么。工作如何在不同的系统中流动。问,直到你完全理解该公司使用的业务流程。然后记录下来。
撰写业务文档。当然,这是他们的工作,但你是需要它的人。创建流程图,包括企业使用的任何工具。包括人们与过程交互的地方。然后和业务一起回顾,多问问题。您可能会发现没有一个人了解所有的事情,所以您会与几个人交谈,最终统一业务流程。您编写的文档将成为企业的一个有价值的工件。嘭!你刚刚成为公司的无价之宝。我敢说,你刚刚成为一名高级数据工程师?
已经包好了
作为数据工程师,理解我们的解决方案所支持的业务流程是我们的责任。如果不完全理解这些过程,我们注定会沮丧和失败。我们生活的这个不完美的世界通常没有得到很好的记录,而我们这些数据工程师就是需要弄清楚这一切的人。通过问很多很多问题,我们更好地了解了我们的解决方案所支持的业务流程,这使我们能够不断提高我们工作的影响力。所以,开始吧。质疑一切!
要了解这些问题如何导致商业文件,请阅读苏在 Krispy Krabcakes 的冒险经历。她非常有趣,并为商业分析和架构提供了很好的基础。
伟大的数据工程师最重要的特质
你很想知道吗?

马尔科·布拉泽维奇在 Unsplash 上的照片
我接触过或读到过的所有伟大的数据工程师都有一个共同的特点。相反,所有不太好的数据工程师都缺少这一关键要素。不是某种特定工具的技能或知识,而是一种内在的固有品质。数据工程师每天都在解决新的问题,如果没有这个最重要的特征,我们可能无法交付任何有价值的东西。
现在,我们已经谈到了对数据工程师来说最重要的技能,这个特质是相关的。如果没有这个关键因素,你可能会在学习新工具和流程时遇到困难。先说个例子。我需要将文件从 FTP 服务器转移到 Snowflake。这些文件是 zip 格式的,有些文件的大小约为 1G。雪花不支持 zip 格式,喜欢 100m 或更小的文件。这创造了一个有趣的小挑战。

FTP 到雪花工作流的数据流
我需要从 FTP 下载 zip 文件,解压,分割成更小的文件,然后上传到雪花阶段。每天都有新文件创建,所以这需要自动化。由于我们没有使用气流,我不能使用现有的运营商和 Fivetran 似乎是一个小问题的昂贵解决方案。对于我的首选脚本语言 Python 来说,这似乎是一项伟大的任务。但是我的经理向我挑战。
思维不同
不写新的应用程序能做到吗?嗯,我不这么认为。对于脚本来说,这似乎是一个简单的例子。这让我很好奇。这不是一个简单的 Python 脚本。我必须查询 FTP 服务器,看看有什么文件存在。下载它们,解压,然后分割成更小的文件。考虑到过程中可能出现的所有问题,这似乎是相当多的编码。也许有更好的方法。我的好奇心被激起了。
一定有人已经解决了我面临的许多问题。我发现 LFTP 有一个镜像命令,可以从 FTP 服务器下载任何新文件。Linux 有一个为将文本文件分割成更小的块而定制的 split 命令。也许 Python 不是正确的解决方案。最重要的是,我们已经在 Kubernetes 集群中配置了 ARGO,因此工作流管理已经存在。长话短说,我把自己换成了一个很小的 shell 脚本。实际上,有几个。那么,这和数据工程师最重要的特质有什么关系呢?
已经是什么了!
我想你知道我们在说什么。是好奇。你天生好奇吗?你喜欢弄清楚事物是如何工作的吗?想出巧妙的方法来解决难题?什么事?太好了,你会成为一名优秀的数据工程师,因为好奇心是所有伟大的数据工程师的基本特质。我们不能依靠现有的模式来解决每个问题,所以我们必须拿出自己的模式。要做到这一点,我们需要好奇。我们需要不断地接触新的工具和流程。做事的新方法。
数据工程师每天都在解决新问题,如果没有好奇心,我们可能无法交付任何有价值的东西。好奇的数据工程师阅读了博客,观看了视频,并使用了新工具。他们重新评估了旧技术,并找到了利用它们的新方法。当挑战出现时,他们会研究并利用现有的知识来寻找聪明的解决方案。这就是为什么我认识的所有伟大的数据工程师都天生好奇。但是,他们不杀猫。
2021 年数据科学家最需要的技能
来自 15,000 多个数据科学家职位发布的网络搜索结果

作者创建的图像
对 15,000 多个数据科学家职位发布的最受欢迎技能的深入分析。
简介
我只想说,这在很大程度上受到了杰夫·黑尔在 2018/2019 年写的文章的启发。我写这篇文章只是因为我想获得对当今需求技能的最新分析,我分享这篇文章是因为我假设有人也希望看到 2021 年数据科学家最需要的技能的更新版本。
从这个分析中得到你想要的-很明显,从网络搜集的招聘信息中收集的见解与实际上最需要的数据科学技能并不完全相关。然而,我认为这给了你一个很好的提示,告诉你应该更关注什么样的一般技能,同样的,也应该远离这些技能。
也就是说,我希望你喜欢这个,让我们开始吧!
方法论
为了这个分析,我从 Indeed、Monster 和 SimplyHired 网站搜集并积累了超过 15000 条招聘信息。我没有抓取 LinkedIn,因为我在抓取时遇到了验证码问题。
然后,我查看有多少招聘信息包含了我正在搜索的每个词。我搜索的术语列表如下( )如果你想看其他技能,请在评论中提出,这样我可以添加到明年的分析中! ):
- Python,SQL,R,Java,Git,C,MATLAB,Excel,C++,JavaScript,C#,Julia,Scala,SAS
- scikit-学习,熊猫,NumPy,SciPy
- Matplotlib,Looker,Tableau
- TensorFlow,PyTorch,Keras
- Spark,Hadoop,AWS,GCP,Hive,Azure,Google Cloud,MongoDB,BigQuery
- Docker,Kubernetes,气流
- NoSQL、MySQL、PostgreSQL
- Caffe,Alteryx,Perl,Cassandra,Linux
从每个来源获得计数后,我将它们相加,然后除以数据科学家职位发布的总数,得到一个百分比。例如,Python 的值 0.77 意味着 77%的职位发布中包含 Python。
最后,我将结果与杰夫·黑尔在 2019 年所做的分析进行了比较,以获得 2019 年至 2021 年的百分比变化。
结果
顶级技能
以下是 2021 年最受欢迎的 25 项数据科学技能,从高到低排列如下:

作者创建的图像
顶级编程语言
为了获得更详细的信息,下面的图表显示了供数据科学家使用的顶级编程语言:

作者创建的图像
Python、SQL 和 R 是排名前三的编程语言并不奇怪。
就我个人而言,我也袖手旁观这样的事实,你应该知道 Python 或 R 以及 SQL。我是从 Python 开始的,我可能会一辈子都坚持使用 Python。就开源贡献而言,它遥遥领先,而且学习起来很简单。SQL 可以说是任何与数据相关的职业类型中最重要的技能,无论你是数据科学家、数据工程师、数据分析师还是业务分析师,这个清单还可以继续列下去。
顶级 Python 库
同样,下图显示了数据科学家的顶级 Python 库:

作者创建的图像
TensorFlow 排名第一,因为它是最受欢迎的深度学习 Python 库之一。PyTorch 是一个强有力的选择,因此它的排名不会落后太多。
Scikit-learn 可以说是 Python 中最重要的机器学习库。在使用 Pandas 和/或 NumPy 清理和处理您的数据后,scikit-learn 用于构建机器学习模型,因为它有大量用于预测建模和分析的工具。
在我看来,熊猫、NumPy 和 SciPy 对数据科学家来说也是必不可少的,尽管它们有上述的表现。
增长最快和下降最快的技能
下面的图表显示了从 2019 年到 2021 年增长和下降最快的技能:

作者创建的图像

作者创建的图像
以下是上面两张图表中的一些要点:
- 与云相关的技能有了巨大的增长,比如 AWS 和 GCP。
- 类似地,与深度学习相关的技能也有很大增长,如 PyTorch 和 TensorFlow。
- SQL 和 Python 的重要性持续增长,而 R 仍然停滞不前。
- Apache 产品,如 Hadoop、Hive 和 Spark,重要性继续下降。
感谢阅读!
我希望这个分析对你有用。我不会完全证明仅仅基于这种资源选择学习一种技能而不是另一种技能的决定是正确的,但是正如我之前所说的,我认为这给出了一个很好的主意,关于什么在重要性上增加和减少。
如果你喜欢这个,请一定要关注我的 Medium,一如既往,我祝你在学习中一切顺利!
不确定接下来要读什么?我为你挑选了另一篇文章:
又一个!
特伦斯·申
罗马到整数问题的最现成的代码
学习机
这绝对是我遇到的最聪明的解决方案之一

Erda Estremera 在 Unsplash 上拍摄的照片
你是软件工程师还是数据科学家?你为编码面试做好准备了吗?如果你对这两个问题的回答都是肯定的,那么你很可能听说过 LeetCode 。
对于那些不熟悉 LeetCode 的人来说,这是一个充满了数千个编码问题的网站,人们可以用它来训练自己的编码技能。在撰写本文时,它有 1835 个问题,并且还在增加。
我强烈建议大家不管你的专业是什么,都要坚持练习自己的解题技巧。以我的经验,几乎所有职位,从后端、前端、机器学习工程师,到数据科学家,通常在面试过程中都有一轮或更多的编码。
如果你进入问题页面,你会看到问题列在一个表格里,就像这样。

作者 LeetCode 问题截图
大多数问题都有 LeetCode 提供的解决方案,但其中一些需要您以每月 35 美元或每年 159 美元的价格订阅 LeetCode。我只是说,人们几乎总是会在讨论页面上发布他们自己的解决方案,所以你可以利用这些信息做你想做的事情。
不过说真的,我经常在讨论页面而不是解决方案页面找到最佳解决方案。
这是我在 LeetCode 中遇到的最喜欢的解决方案之一。
罗马到整数问题
第一页列出的一个问题是罗马数字到整数的问题,任务是将罗马数字转换成整数。比如“VIII”变成 8,“MCMXCVII”变成 1997。
幸运的是,罗马数字被限制在 1-3999 的范围内,所以我们将使用的最大数字是代表 1000 的 M。
问题最难的是处理像“IV”、“IX”、“XL”等案件。其中较小的数在较大的数之前,并导致该数被减去而不是相加。
所以我在那里,在让解决方案工作并通过所有测试用例之前,尝试编码 10 分钟。
和往常一样,我查看了讨论页面,了解其他人对这个问题的看法。然后,我遇到了这个解决方案,声称它比 99.78%的要好。当然,我很好奇,不得不点击它。这是解决方案。
通过 hgrsd 解决
罗马人很可能会被它如何屠杀他们的数字系统所激怒。抱歉,伙计们。- hgrsd
我完全同意他的观点。
该解决方案没有为“IV”、“IX”等创建特殊的逻辑,而是用更容易处理的“IIII”、“VIIII”等形式来替换它们。
这将使问题更简单,因为代码只需要在罗马数字中添加每个字符。
这个解决方案是多么巧妙,我大吃一惊。的确,它违反了正确罗马数字的规则,但考虑到问题的限制,它可以给出正确的答案。
这是我比较后想出的解决方案。
原则上,它检查下一个罗马字符是否比当前字符大。如果答案是肯定的,那么它会减去这个数字,而不是相加。
考虑到问题的局限性,两种解决方案都会很有效。然而,第一个解决方案让我开怀大笑,而相比之下,我的解决方案有点无聊。
结论
当我面对同样的问题时,看到别人的方法和我的有多么不同,这让我着迷。我想感谢 LeetCode 为每个问题提供了解决方案和讨论页面。
我总是在讨论页面中找到最好和最有创意的解决方案。
我记不清有多少次我对自己说,“为什么我没有早点想到这个?”在看到像这样的现成解决方案后。
许多其他问题的解决方案也同样非常规,但这一个很容易就能解决问题。
即使您没有准备面试,我也强烈建议您偶尔练习一下 LeetCode。它将帮助你保持你的编码技能,并保持在你的游戏的顶端。
谁知道您可能会在问题中想到或发现什么?
学习机是一系列关于我所学的东西的故事,我认为很有趣,可以分享。有时也是关于机器学习的基础。 定期更新 新故事,并 成为 中级会员,阅读无限故事。
https://chandraseta.medium.com/membership
分析约 100 万条评论后,Reddit 上最受欢迎的语言
Reddit 上最流行的语言(除了英语)会让你大吃一惊。为了构建这个图表,我用雪花和 Java UDTF 分析了将近一百万条 Reddit 评论(不到两分钟)。
Reddit 上最受欢迎的语言,分析了 1M 评论后:英语,德语(!),西班牙语,葡萄牙语,法语,意大利语,罗马尼亚语(!),荷兰语(!)…
与母语为英语的人数相比,结果令人惊讶:

Reddit 上的热门语言— 全图 + 更新 Tableau 互动(作者)
德语是 Reddit 上第二受欢迎的语言——这可能是本周 Reddit 在柏林开设办事处的一大原因:
每天都有数百万德国用户涌向 Reddit,与那些有相似兴趣的人一起寻找社区和归属感,随着 47%的用户年增长率,德国现在是我们第五大用户群的所在地。今天,我们正式向我们在欧洲中心的朋友们问好,并通过地面上的专门团队打开我们在柏林的大门。
在本帖中,我们将在 Snowflake 中用 Java UDF 分析近百万条 reddit 评论的结果——不到两分钟。还有哪些语言、地区、话题在 Reddit 上有很高的代表性?
分析
我从前 40 个子编辑之外的将近一百万条 Reddit 评论开始(在下面找到构建这个样本的确切规则)。一旦分析完成,就会发现只有约 3%的评论是用英语以外的语言写的:

约 97%的 Reddit 分析评论是英文的
最受欢迎语言的排名令人惊讶:Reddit 上第二受欢迎的语言是德语。第三个是西班牙语(没那么令人惊讶),接下来是葡萄牙语、法语、意大利语、罗马尼亚语和荷兰语:

Reddit 上除英语之外最受欢迎的语言(图片由作者提供)
这些结果令人惊讶,因为德语是世界上第 12 大流行语言。作为一种语言,法语甚至比德语更受欢迎,但德语社区在 Reddit 上发现了更多的吸引力。
根据维基百科,这些是世界上使用最多的语言——这个列表与 Reddit 在其用户中看到的完全不同:

维基百科:按使用者总数排列的语言列表
一种语言,许多子编辑
德语 subreddits: 大多数德语注释位于/r/de 中,即德国的 subreddit,其次是/r/Austria,然后是/r/Finanzen 中的金融对话。其次是德语版的/r/me_irl: /r/ich_iel/ 。

(图片由作者提供)
**西班牙语 subreddit:**西班牙语中最大的 subred dit 是/r/argentina。这很令人惊讶,因为墨西哥的人口是他们的 3 倍,但是/r/mexico 只有他们评论的 1/3。

(图片由作者提供)
**葡萄牙语 subreddit:**葡萄牙语中最大的 subred dit 是/r/brasil,其次是/r/portugal。这很令人惊讶,因为巴西的人口是他们的 20 倍,但/r/brasil 的评论只有他们的 1.5 倍。他们最受欢迎的话题是告白、未经审查的内容、足球、投资和性。

(图片由作者提供)
法语 subreddits: 令人惊讶的是/r/Quebec 是仅次于/r/france 的第二大法语 sub。

(图片由作者提供)
以此类推:列表继续

代表多种语言的子编辑(图片由作者提供)
一个子编辑,多种语言
一些子编辑处理多种语言的内容。常见的组合是英语加上另一种语言,然后是/r/塞尔维亚,它将其注释分为波斯尼亚语、克罗地亚语和塞尔维亚语:

带有多语言注释的子编辑(图片由作者提供)
操作方法
获取 100 万条 reddit 评论并在 Snowflake 中用 Java UDF 分析他们的语言并不困难,之前的帖子解释了这一点:
https://medium.com/snowflake/loading-reddit-comments-into-snowflake-44b9f2072a84 https://medium.com/snowflake/new-in-snowflake-java-udfs-with-a-kotlin-nlp-example-e52d94d33468
疑问和注释
用 Java UDTF 检测语言
由于雪花最近宣布支持 Java 表 UDF,我决定尝试一下。令人惊讶的是,表格 UDF 比我以前的 Java UDF 表现得更好。在下面的部分中可以找到关于这个的细节。
https://www.snowflake.com/blog/bringing-more-to-the-table-azure-and-udtf-support-with-snowpark/
UDTFs 能够读取表并将表输出回来。这是产生本文结果的 UDTF 实现:
create or replace function detect_lang_udtf(v varchar)
returns table(output_value varchar)
language java
imports = ('@~/lingua-1.1.0-with-dependencies.jar')
handler='MyClass'
target_path='@~/202110xx3.jar'
as
$$
import java.util.stream.Stream;
import com.github.pemistahl.lingua.api.*;
import static com.github.pemistahl.lingua.api.Language.*;class OutputRow {
public String output_value; public OutputRow(String output_value) {
this.output_value = output_value;
}
}class MyClass { static LanguageDetector detector = LanguageDetectorBuilder.fromAllLanguages().withPreloadedLanguageModels().build(); public MyClass() {
} public static Class getOutputClass() {
return OutputRow.class;
} public Stream<OutputRow> process(String input_value) {
String x = detector.detectLanguageOf(input_value).toString();
return Stream.of(new OutputRow(x));
} public Stream<OutputRow> endPartition() {
return Stream.empty();
}
}$$;
~百万条评论样本
规则:
- 从 2020 年 12 月 1 日至 2021 年 12 月 14 日之间的 14 天 reddit 评论开始(参见如何在雪花上加载 reddit 评论)。
- 丢弃前 40 个子编辑中的评论(不需要分析每个语言,主要是英语)。
- 从评论中删除特殊字符、URL 和链接。
- 只允许超过 200 个字符的评论。
- 丢弃 90%的剩余评论,保留 10%的随机样本。
- 应用前面的规则后,只保留子编辑中超过 50 条注释的注释(采样前为 500 条)。
- 有待分析的评论总数:3,860 个子评论中的 938,131 条。
create or replace temp table reddit_sample as
with top_subs as (
select count(*), v:subreddit subreddit
from reddit_comments_sample
group by 2
order by 1 desc
limit 40
)
select *
from (
select *, v:subreddit subreddit
, regexp_replace(v:body, 'http[^ ]*', '') body_clean1
, regexp_replace(body_clean1, '&[a-z][a-z]+;', '') body_clean2
, regexp_replace(body_clean2, '\\[[^\\]]*\\]', '') body_clean
, count(*) over(partition by subreddit) c_sub
from reddit_comments_sample
where v:author not in ('[deleted]', 'AutoModerator')
and subreddit not in (select subreddit from top_subs)
and length(body_clean) > 200
and uniform(0::float, 1::float, random()) < 0.1
)
where c_sub > 50
;
用 UDTF 分析每个评论的语言
为了优化,我们只给函数一个清理过的注释的前 200 个字符进行分析:
create table reddit_sample_languages_udtf
as
select *, output_value lang
from reddit_sample a, table(detect_lang_udtf(substr(body_clean, 0, 200))) x
;
算英语 vs 不算

97%经过分析的 reddit 评论是英文的
select count(*) comments
, ratio_to_report(comments) over() percent
, iff(lang='ENGLISH', 'English', 'Not English') language
from reddit_sample_languages_udtf
group by 3
order by 1 desc
UDF 对 UDTF 的表演
我以前的 UDF 用 XL 雪花仓库花了 4 分钟分析了 100 万条评论,而新的 UDTF 用了不到一半的时间就能做到。
当查看细节时,发现 UDF 和 UDTF 消耗的资源量相似——UDTF 更快,因为雪花并行化更好地执行了这些调用。
不要对此过于担心,因为雪花工程师目前正在努力改进这些情况。Java UDFs 和 UDTFs 目前在 Snowflake 中处于预览模式,您很快就能体验到这些改进。

XL warehouse 上 Java UDF 与 UDTF 的性能对比——UDTF 在当前实现下执行了更好的并行化(改进正在进行中)
select lang, count(*)
from (
select *, detect_langs(substr(body_clean, 0, 200)) lang
from reddit_sample a
)
group by 1
order by 2 desc
--4:06 UDF xl
;select lang, count(*)
from (
select *, output_value lang
from reddit_sample a
, table(detect_lang_udtf(substr(body_clean, 0, 200))) x
)
group by 1
order by 2 desc- 1m58s UDTF xl
;
过滤和格式化结果
此查询查看以前的结果,格式化标签,查看子编辑中检测到的语言之间的比率,并排除每个子编辑中表示少于 2%的语言:
select 'r/'||subreddit sub
, initcap(lang) language
, count(*) c
, ratio_to_report(c) over(partition by sub) ratio
, sum(iff(language!='English', c, 0)) over(partition by sub) total_not_english
, sum(c) over(partition by sub) total
from reddit_sample_languages_udtf
group by 1, 2
qualify ratio > .02
order by total_not_english desc, c desc, 1, ratio desc
信用
- 杰森·鲍姆加特纳负责收集和分享 Reddit 的评论。
- Peter M. Stahl 为 Lingua 项目检测 Java 中的语言。
- 雪花使在 UDF 中运行 Java 代码变得容易。
更新和评论
- 查看 reddit 上的评论,即:/r/dataisbeautiful/[…]/the _ most _ popular _ languages _ on _ Reddit
- 更新了 Tableau 上的交互式仪表盘。
想要更多吗?
- 用一个雪花免费试用账户试试吧——你只需要一个电子邮件地址就可以开始了。
我是 Felipe Hoffa,雪花的数据云倡导者。谢谢你和我一起冒险。可以在 Twitter 和 LinkedIn 关注我。查看reddit.com/r/snowflake最有趣的雪花新闻。
数据科学和 Python 的 GitHub Repos
发现许多数据专业人员和 Python 程序员正在关注的非常受欢迎的回购

GitHub 库的星★ 和叉ψ是项目受欢迎程度和质量的一个很好的指示器。
主演一个回购除了作为书签功能,相当于在社交媒体上点击‘喜欢’按钮。
分叉回购创建内容的副本,表明某人对试验或贡献项目的兴趣。
在本文中,我们来看看 GitHub 上最流行的基于 Python 的数据相关repos。
[10] 牛逼的机器学习
★50757
ψ12575
令人敬畏的机器学习 repo 提供了一个针对 Python 和其他编程语言的机器学习框架、库和软件的精选列表。
如果你正在寻找 Python 和机器学习的交叉点,你应该看看这个。
[9] keras
★51954
ψ18752
Keras是一个基于 Python 的深度学习 API ,运行在高度流行的开源机器学习平台 Tensorflow 之上。
Keras 专注于快速实验,允许用户尽可能快地从想法到结果。

截图来自 Keras GitHub 页面|图片在 Apache 许可下使用
烧瓶
★56095
ψ14461
Flask 也是最流行的 Python web 应用程序框架之一(也是我个人最喜欢的),这是由于它在定制方面的易用性和灵活性。
Flask 也常用于在数据科学项目中部署机器学习(ML)模型。这一点很重要,因为 ML 车型的值只有在投入生产时才能实现。
姜戈
★58644
ψ25067
Django 是一个流行的高级 Python Web 框架,它鼓励快速开发以及干净、实用的设计。
Django 以其速度、安全性和可伸缩性而闻名,是 web 开发的一个流行的开源框架选项,也可以用于机器学习模型的部署。
型号
★70683
ψ44539
车型 回购是 Tensorflow 车型园的所在地。它包括最新模型和建模解决方案的不同实现。
它旨在展示建模的最佳实践,以便用户可以充分利用 TensorFlow 进行研究和产品开发。

截图来自模型 GitHub 页面|图片在 Apache 许可下使用
【5】YouTube-dl
★97905
ψ5514
youtube-dl 项目(顾名思义)是一个命令行程序,供用户从 YouTube 下载视频。如果你想为视频分析检索数据,这个回购无疑会很有帮助。

诺德伍德主题公司在 Unsplash 上拍摄的照片
[4] 牛逼——巨蟒
★101024
ψ19535
awesome-pythonrepo 提供了一个 Python 框架、库、软件和资源的精选列表。
它整理了广泛主题的广泛列表,如数据可视化、数据库驱动、网络爬行和深度学习。
[3] Python-100 天
★106206
ψ42079
Python-100 天 回购因为内容是用普通话写的,所以迎合了华语观众。它包括一个在 100 天内学习 Python 的结构化课程。
如果你懂普通话,并且热衷于开始 Python 学习之旅,这个回购当然适合你。
Python
★113189
ψ30836
这个 Python repo 包含大量示例代码,用于众多算法的 Python 实现。
它包括像计算机视觉和神经网络这样的热门主题,一直到像区块链和动态编程这样的专业主题。

马里乌斯·马萨拉尔在 Unsplash 上的照片
[1] 公共-API
***★(星星)😗*141984
**ψ(叉子)😗16596
这是基于受欢迎程度的顶级回购。public-APIrepo 提供了一个用于软件和 web 开发以及数据科学的免费 API的合并列表。
我发现与数据专业人员高度相关的几类 API 包括开放数据、数据验证、测试数据和机器学习。

在麻省理工学院许可下使用的开放数据类别|图像中可用的 API 示例
结论
GitHub 拥有丰富的令人惊叹的开源内容,所以我希望这给了你一些灵感,让你知道应该关注哪些 repos。
以上列表是基于 EvanLi 的 Github 排名回购 参考的,我强烈推荐你也去看看。
欢迎您加入我的数据科学学习之旅!关注此媒体页面以了解更多数据科学内容,或者在 LinkedIn 上联系我。尽情探索流行的 GitHub repos 吧!
* *
Spark 中最有用的数据操作函数
用清晰的例子深入探究最有趣的日期函数

Pyspark 和 Spark SQL 提供了许多内置函数。当使用存储日期和时间类型值的 DataFrame 时,日期和时间函数等函数非常有用。有时,您可能想写一个 UDF(用户定义的函数),但后来意识到最好还是查看一下文档,因为它已经存在了。在本文中,我们将通过一些例子来检查哪些是最重要的 Spark SQL 日期函数。
Spark SQL 日期函数
Spark SQL 内置日期函数对用户和性能都很友好。Spark SQL 支持 Apache Hive 中支持的几乎所有日期函数。下表列出了 Spark SQL 日期函数,这些函数可用于操作包含数据类型值的数据框列。这个列表包含了 Apache Spark 支持的几乎所有日期函数。

日期函数及其描述的摘要(图片由作者提供)
对于本教程,我使用的是机场数据集,该数据集是开源的,可以在 Kaggle 上找到。
**Reading CSV File**
>>> df = spark.read.csv("Airports2.csv", header=True, inferSchema=True)***Visualizing the first 5 rows of the dataset***
>>> df.show(5)

(图片由作者提供)
**Checking the Schema**
>>> df.printSchema()

(图片由作者提供)
如你所见,上面包含日期的“Fly_Date”列是字符串类型。
- To_date(col) → 将包含日期值的字符串类型转换为日期格式
**Example:*****Converting the string type "Fly_date" column containing dates value to date type/format.***>>> df = df.withColumn(‘Fly_date’, **to_date**("Fly_date"))
>>> df.printSchema()

(图片由作者提供)
2。Date_format(date,format) → 将日期/时间戳/字符串转换为由第二个参数给出的日期格式指定的格式的字符串值。
**Example:*****Format "Fly_date" column with the "dd/MM/yyyy" format*** >>> df.select("Fly_date", **date_format**("Fly_date", "dd/MM/yyyy").alias("Formatted_date")).show(3)

(图片由作者提供)
3)日期 _ 添加(开始,天数) →向日期添加天数
**Example:*****Adding two days to the Fly_date columns***>>> df.select("Fly_date", **date_add**("Fly_date",2).alias("date_added")).show(5)

(图片由作者提供)
**4)添加月数(开始,月数)**→添加月数
**Example:*****Adding two months to the date columns and saving into a new dataframe***>>> test_df=df.select('Fly_date', **add_months**(df.Fly_date,2).alias("months_added"))>>> test_df.show(5)

(图片由作者提供)
5) Datediff(end,start) →返回两个日期之间的天数差。
**Example:*****Returns the difference between two dates in days***>>> test_df.select("Fly_date","months_added", **datediff**("months_added", "Fly_date").alias("date_diff")).show(3)

(图片由作者提供)
6)提取单个“日期”元素
- Year(Col) →提取给定日期对应的年份为整数。
- Quarter(Col) →提取给定日期对应的季度为整数。
- Month(Col) →提取给定日期对应的月份为整数。
- Dayofmonth(Col) →提取给定日期的月份中相应的一天作为整数。
- Weekofyear(Col) →提取给定日期对应的周数为整数。
- Hour(Col) →提取给定日期对应的小时数为整数。
- 分钟(Col) →提取给定日期对应的分钟数为整数。
**Examples:** **# Year**
>>> test_df.select("date_days", **year**( "date_days").alias("year")).show(3)**# Month**
>>> test_df.select("date_days", **Month**( "date_days").alias("Month")).show(3)**# Dayofmonth**
>>> test_df.select("date_days", **Dayofmonth**( "date_days").alias("Day of the Month")).show(3)**# Weekoftheyear** >>> test_df.select("date_days", **Weekofyear**( "date_days").alias("Week of the year")).show(3)

提取年、月、日和周(图片由作者提供)
7) Date_sub(开始,天数)→ 从日期字段中减去天数。
**Example:*****Subtract three days to the current date***>>> df.select('Fly_date', **date_sub**(df.Fly_date,3).alias("date_sub")).show(3)

日期子结果(作者图片)
8) Last_day(date) → 返回给定日期所属月份的最后一天。
**Example:*****Get the last day of the month using "last_day" function***>>> df.select("Fly_date", **last_day**( "Fly_date").alias("last_date")).show(4)

(图片由作者提供)
9) Months_between(date 1,date 2) → 得出两个日期之间的月数。
**Example:*****Identify the months between "Month Added" and "Fly date" using months_between function***>>> new_df=test_df.select("Fly_date","month_added", **months_between**("month_added", "Fly_date").alias("months")).show(3)

(图片由作者提供)
10) Next_day(date,dayOfWeek) → 返回晚于日期列值的第一个日期。
**Example:*****Getting next Tuesday date using the "next_day" function***>>> df.select("Fly_date", **next_day**("Fly_date", "tue").alias("Next_Tuesday")).show(3)

(图片由作者提供)
11)按‘日期’排序→ 按日期排序数据帧
**Example:*****Sorting the selected columns by "Fly date" column in descending order***>>> df.select("Passengers","Fly_date")./
**sort**(df.Fly_date.desc()).show(3)

(图片由作者提供)
12)当前时间戳→ 返回当前时间戳作为时间戳列
**Example:*****Returns the current timestamp as a timestamp column***>>> df.select(**current_timestamp()**.alias( "current_timestamp")).show(1)

(图片由作者提供)
当前日期→ 以日期列的形式返回当前日期。
**Example:
**
***Returns the current date as a date column***>>> df.select(**current_date**().alias(“current_date”)).show(1)

(图片由作者提供)
结束注释
在这篇文章中,我试图用一个相关的例子来展示不同的日期函数。这些函数在日期类型列的操作以及为机器学习提供有趣的功能和从数据中创建有趣的见解方面提供了很大的灵活性。尽可能使用这些函数,而不是 Spark SQL 用户定义的函数。感谢您的阅读:)
更多阅读:
特征缩放的秘密终于被解开了

照片由 Danist Soh 在 Unsplash 上拍摄
思想与理论
首席研究员:Dave Guggenheim /合作研究员:Utsav Vachhani
摘要
对于一些机器学习模型,特征缩放是数据预处理的重要步骤。正则化算法(例如,lasso 和 ridge 惩罚)、基于距离的模型(例如,k-最近邻、聚类、支持向量机等)。),以及人工神经网络在预测器处于相同尺度或相同边界内时都表现得更好。但是特征缩放不仅仅是诱导一致性;它可以成为您预测建模工具箱的强大补充。
我们通过对 60 个分类数据集进行 800 多次实验来研究特征缩放,我们所了解到的将会是惊喜的。一方面,你看到的关于选择缩放方法的规则对于预测模型是没有意义的。另一方面,曾经被认为是数据预处理的一个卑微的方面,一种新的特征缩放方法可以从我们的模型中释放出更高的性能。
本文假设您熟悉分类模型、特性缩放原因和方法、支持向量机以及偏差和方差。
简介
你可能会问什么时候应该使用规范化,什么时候应该使用标准化。这个问题没有确定的答案”(Burkov,2019,pg。46).
距离 k-最近邻算法的发明已经过去了 50 年,这可能是第一个需要预测器一致性的监督模型,而特征缩放仍然是一个谜。尽管缺乏一个明确的答案,但关于何时应该使用标准化或规范化,有几个规则在广泛和重复的分布中。一些规则以数据为中心,而另一些则侧重于选择特征缩放方法的学习模型。我们将测试这些规则,努力强化或改进它们的用法,也许会开发出一个更确定的特性缩放答案。
以数据为中心的启发式包括以下:
1.如果您的数据有异常值,请使用标准化或稳健缩放。
2.如果您的数据具有高斯分布,请使用标准化。
3.如果您的数据具有非正态分布,请使用归一化。
以模型为中心的规则包括这些:
1.如果您的建模算法假设(但不要求)残差为正态分布(即正则化线性回归、正则化逻辑回归或线性判别分析),请使用标准化。
2.如果您的建模算法对数据的分布没有任何假设(例如,k-最近邻、支持向量机和人工神经网络),则使用归一化。
在每个用例中,规则都提出了与数据或学习模型的数学拟合。我们的目标是测试这些规则,以发现它们的有用性,并确定是否可以开发一个更全面的集合来指示特征缩放方法的完美选择。
模型定义
由于其对缩放数据的要求,我们选择了支持向量分类器,因为除了以数据为中心的规则之外,它还可以帮助确认那些不假设数据或残差正态分布的算法的以模型为中心的规则。
本研究中的所有模型都是使用 sci-kit 学习库中的支持向量分类器(SVC)包进行的。每个模型通过分层抽样进行 10 倍交叉验证,所有模型都使用以下超参数值:
a.kernel = 'rbf ',
b.gamma = ‘自动’,
c.随机状态= 1
所有其他超参数保留各自的默认值。所有模型都是使用这些缩放算法(sci-kit 学习包在括号中命名)用特征缩放数据构建的:
a.标准化(标准缩放器)
b.L2 归一化(归一化器;norm='l2 ')
c.鲁棒(RobustScalerquantile_range=(25.0,75.0),with_centering=True,with_scaling=True)
d.规范化(最小最大缩放器;feature_range =多个值(见下文))
d1。特征 _ 范围= (-1,1)
d2。特征 _ 范围= (0,1)
d3。feature_range = (0,2)
d4。feature_range = (0,3)
d5。feature_range = (0,4)
d6。feature_range = (0,5)
d7。feature_range = (0,6)
d8。feature_range = (0,7)
d9。feature_range = (0,8)
d10。特征 _ 范围= (0,9)
应该注意的是,根据“支持向量分类实用指南”(Hsu,Chang,Lin 等人,2003),应该使用范数(-1,1)或范数(0,1)来获得最佳结果。这与以下观点一致:因为径向基核函数在其数学中使用特征向量之间的平方欧几里得距离,所以 SVC 模型在归一化时应该表现得更好,因为它为距离度量保留了更准确的信息。sci-kit learn 中的 SVC 文档将标准化作为另一个选项(Scikit-learn_developers,未注明)。
在每个预测因子少于 12 个样本的情况下,我们将测试分区限制为不少于总体的 10%。如果有足够的样本达到合理的预测精度(由样本复杂性泛化误差确定),我们使用统一的 50%测试分区大小。在这两个界限之间,我们调整了测试规模,以限制泛化测试误差,与训练样本规模进行权衡(Abu-Mostafa,Magdon-Ismail,& Lin,2012,第。57).
任何缺失值都使用 MissForest 算法进行估算,因为该算法在多重共线性、异常值和噪声面前具有很强的鲁棒性。分类预测因子是使用 pandas get_dummies 函数一次性编码的,没有丢弃的子类型(drop_first=False)。低信息变量(如身份证号码等。)在训练/测试分区之前被丢弃。
构建这些模型的目的是比较特征缩放算法,而不是调整模型以获得最佳结果。出于这个原因,我们在模型中引入了尽可能多的默认值,为上述比较创造了一个平台。此外,伽马值可以通过交叉验证进行调整,因此该模型不会像之前的研究(Pandey & Jain,2017 年)所证明的那样,偏爱一种缩放方法。所有性能指标都是作为对测试数据的预测的总体准确性来计算的,并且通过两个阈值来检查该指标:1)作为概化的度量,在最佳性能的 3%以内,以及 2)作为预测准确性的度量,在最佳性能的 0.5%以内。
本分析中使用的 60 个数据集如表 1 所示,具有广泛的预测器类型和类(二元和多元类)。大多数数据集可以在 UCI 索引( UCI 机器学习库:数据集)找到。不在 UCI 索引中的数据集都是开源的,可以在 Kaggle:
波士顿房屋:波士顿房屋| Kaggle;HR 员工流失:员工流失| Kaggle;借贷俱乐部:借贷俱乐部| Kaggle;电信客户流失:电信客户流失| Kaggle;丰田卡罗拉:丰田卡罗拉| Kaggle
38 个数据集是二项式的,22 个是多项式分类模型。所有模型都是根据所有数据集创建和检查的。表中列出的预测数是未编码的(分类的)和所有原始变量,包括排除前的非信息变量。

表 1:数据集(按作者分类的图片)
尝试开发启发式数据中心
异常值分析—异常分值
我们检查的第一个以数据为中心的规则涉及数据范围内异常值的存在,并建议了两种不同的方法:1)标准化,和 2)稳健缩放。为了测试这一规则,我们构建了一个隔离森林模型,专门用于根据整个数据集中的异常值密度生成异常值。然后,我们将原始得分转换为调整后的平均绝对异常得分(MAAS ),以便在数据集的交叉样本之间进行比较。图 1 显示了数据的子集,包括准确度、最佳特征缩放方法和 MAAS 评分(星号表示相对于预测值计数样本数量较少的数据)。

图 1: MAAS(异常密度)对比图(图片由作者提供)
标准化或稳健缩放与较高的异常值密度之间没有一致的关系。这可能很难检测到,因为当以数据为中心的规则与以模型为中心的规则冲突时,结果是未知的,例如当数据要求标准化而模型寻求规范化时。规则的第一个严重缺陷…
统一与定制特征缩放
我们在数据集的一个子集上检查了单独缩放与统一缩放,测试了以数据为中心的规则是否通过预测器离散地应用。用于此分析的数据集包括:
澳大利亚信贷,银行,波士顿住房,国会,圆筒乐队,生育,德国信贷,哈伯曼生存,肝炎,希格斯,希尔 _ 山谷(无噪音),希尔 _ 山谷(噪音),和马绞痛。
个体或“自定义”特征缩放对所有数值变量使用标准化,对所有明显的分类变量使用默认标准化(feature_range = (0,1))。这种方法在任何时候都不会超过最佳单一特征缩放方法在任何数据集上的精度,这可能是因为变量不再按照学习模型的要求进行统一缩放。
分布分析
测试以数据为中心的规则还需要创建一个单一的“超级”预测器,该预测器只包含重要的信息,以便进行分布分析。
这个过程从使用超参数的默认值构建一个简单的随机森林模型开始,以揭示由信息增益确定的可变重要性。从中,我们选择了总计超过 50%的信息增益的预测因子;这个限制对于图形显示的简约性至关重要。如果没有对预测因子的这种限制,检测模式可能会困难得多。这些变量被命名为“Top50”,它们被连接成一个单独的列,一个超级预测值,可以检查其分布特征和描述性统计数据(有关更多信息,请参考图 2 和图 3)。

图 2:波士顿住房 50 强直方图(图片由作者提供)

图 3:波士顿住房 50 强描述性统计(图片由作者提供)
使用前 50 个直方图,我们测试了关于高斯和非高斯分布的以数据为中心的规则。标准化在 60 个测试数据集的 30 个数据集上表现最佳,但在其中只有 4 个案例中,Top50 的双尾分布符合最广泛的“正常”定义(参见图 2 中的示例)。因此,关于高斯分布和标准化的规则在各种数据集之间缺乏一致性。让事情变得更加混乱的是那些标准化和默认规范化表现同样出色的例子。有关这些匹配的更多信息,请参考图 4 和图 5。

图 4:肝炎 50 强直方图(图片由作者提供)
图 4 是肝炎数据集,标准化和规范化的总体准确率达到 81.25%。

图 5:生育率前 50 名直方图(图片由作者提供)
图 5 是生育力数据集,标准化和规范化的总体准确率达到 90.00%。
两个非常不同的发行版,但具有相同的功能扩展性能!但是我们还没有完成发行。使用前 50 个预测值,我们进行了一个分布分析,看看是否有任何超级预测值符合 89 个分布模式中的一个,从中可以得出更好的启发(见图 6)。

图 6:分布模式列表(图片由作者提供)
在我们的分布分析中找不到快乐。唯一匹配任何数据集的模式是 Von Mises,它只在两种情况下匹配——这对于开发新规则来说是不够的。在特征尺度选择方面,分布和分布模式显得很弱。
有一条以数据为中心的“规则”似乎是常识。国会投票数据由只有 0 和 1 两个值的预测值组成。在这种情况下,特征范围从 0 到 1 的归一化应该是最好的特征缩放方法(参见图 7)。是的,但是除此之外,标准化、稳健缩放、norm(0,2)、norm(0,3)和 norm(-1,1)在顶级性能方面都是相同的。其余的标准化方法在测试准确性方面落后超过 7%。这提出了一个有趣的问题,“为什么 Norm(0,3)的精确度最高,而 Norm(0,4)的精确度最低?”答案可能会让你大吃一惊。

图 7:国会投票 50 强直方图(图片由作者提供)
经过这一级别的调查,我们可以断言,以数据为中心的规则充其量是有缺陷和令人困惑的,它们应该被避免。
试图开发一种启发式模型中心性
以模型为中心的规则只在对数据分布不做任何假设的算法方面进行了测试,如 k-最近邻、支持向量机和人工神经网络。因为具有径向基核的支持向量机使用欧几里德距离,所以我们的测试被限制在这个区域。需要做进一步的测试来扩展它,以包括人工神经网络和那些假设残差为正态分布的建模算法。
在对照 60 个数据集检查了列出的特征缩放方法后,我们发现标准化比任何版本的归一化更好地概括和预测,这与距离测量和归一化之间的数学对齐相反。图 8 显示了数据集的数量以及每种要素缩放方法达到最佳精度性能 3%以内的数据集占总数的百分比,以表示概化;图 9 显示了数据集的数量以及这些方法达到接近最佳或最佳性能(最佳精度 0.5%以内)的数据集占总数的百分比,以表示预测精度。以强度显示的条形展示了两种最常见的支持向量特征缩放方法和最佳表现方法标准化之间的差异。

图 8:功能将性能调整到最佳情况的 3.0%以内(图片由作者提供)

图 9:功能将性能调整到最佳情况的 0.5%以内(图片由作者提供)
偏差-方差障碍
基于从以数据为中心和以模型为中心的结果中收集的证据,**我们假设与数据或模型一致的特征缩放可能是过度拟合的原因,就像超参数一样,需要对其进行“去谐”以获得最佳性能。**这就是 Z 分数标准化(一种扭曲距离测量的缩放方法)在距离敏感学习模型中表现最佳的原因,它抑制了对训练数据的过度拟合。以及为什么 Norm3 和 Norm4 在国会投票数据集上如此不同;预测误差曲面中的各种极小值。
这些规则寻求与数据或模型的匹配,但对齐会导致低偏差和差的预测性能。简而言之,这些规则似乎与其预期效果背道而驰。
因为一旦数据被划分为训练集和测试集,我们就面临方差的影响,方差是一种随机函数,它将创建精确选择启发式算法的过程变成了 NP-hard 问题。在 Python 语言中,从“fit_transform”到“transform”的看似简单的转换不仅仅是列度量中的不匹配。它嵌入了额外的方差复杂性。在对训练数据应用 fit_transform 时,会产生密切相关的偏差。这是机器学习的新观点,在为需要规模数据的学习算法建模之前,先接受偏差和方差。
为了测试特征缩放和偏差-方差权衡之间的关系,我们构建了相同的归一化模型,从 feature_range = (0,1)到 feature_range = (0,9)依次循环。每个阶段的训练和测试集精度被捕获并标绘,训练用蓝色,测试用橙色。**当我们在不改变数据或模型的任何其他方面的情况下增加特征范围时,结果是更低的偏差。**在大多数情况下,较低的偏差伴随着较高的方差和较差的测试结果。参考图 10-12,了解六十个数据集中三个数据集的详细情况。

图 10:澳大利亚信贷标准化图(图片由作者提供)

图 11:电离层归一化图(图片由作者提供)

图 12: Pima 印度标准化图(图片由作者提供)
偏倚、方差和特征缩放之间的关系得到了明确的证实。当然,这只是六十个数据集中的三个,所以这里是我们提供的一些额外的图表作为证据(按字母顺序,不多不少):

这种偏差-方差性能可能是特定于支持向量分类器的;需要做更多的工作来确定情况是否如此。无论如何,在训练数据上在 Norm(0,9)处达到的最大准确度值进一步证实了归一化更适合于距离度量,并且因此产生较差的预测性能。
但是那些没有查看偏差和方差范围的缩放方法呢?关于点值,如标准化,方差本身可被视为“学习模型中的不稳定性”(Abu-Mostafa 等人,2012),我们通过创建 200 个不同的训练/测试分裂来诱导这种不稳定性,如通过从 1 到 200 按一个单位顺序递增 random_state 值所定义的。这些点表示测试与训练准确性的比率,该图通过数据的随机划分显示了这两个指标之间的波动性。
使用具有相同 SVC 模型的波士顿住房数据集,图 13 显示了使用标准化的随机方差分布,而图 14 显示了相同的输出,但具有稳健的缩放。这些图中的每个数据点(即,底部的刻度指示分区的随机状态值)使用相同的分区数据进行训练和测试。

图 13:波士顿住宅的 200 个 SVC 模型与 StandardScaler 的差异(图片由作者提供)

图 14:波士顿住宅的 200 个 SVC 模型与 RobustScaler 的差异(图片由作者提供)
注:方差均值几乎相同(0.892 对 0.907),但考虑到 StandardScaler 和 RobustScaler 是本研究中仅有的两种缩放算法,意味着将变量集中在零。在鲁棒定标器的情况下,中值也是以零为中心的。
每个图展示了其各自的缩放方法和学习算法的不稳定性或方差函数,正如预期的那样,当使用相同的数据和相同的模型时,它们提供了明显不同的分布。
方差和特征缩放相互作用,方差是一个随机函数。考虑到随机性如何混淆特征缩放的正确选择,我们提出了以下推测:
猜想 1:由于方差,无法开发出以数据为中心或以模型为中心的规则来指导预测模型中特征缩放的完美选择。
布尔科夫的断言(2019)得到了对其机制的理解的充分支持。我们没有制定规则,而是选择了一条“模糊”的前进道路。
分类模型的广义特征缩放算法
考虑到随机函数是不可预测的,而是广义的,我们的下一个方法是建立一个集成特征缩放算法,以提高 3%阈值的泛化能力和 0.5%阈值的预测精度。
由于共享的零均值和适用性的潜在收益,我们建立了两个集成特征缩放算法,结合标准化和鲁棒缩放,并针对 60 个数据集测试它们。这与图 8(概化)和图 9(预测准确性)中描述的前两种缩放方法相一致。
图 15 显示了两种集成算法,第一种使用堆叠分类器,第二种使用软阈值(概率而不是类成员)实现投票分类器。这两个集合都是使用 Python 中 sci-kit learn 库的标准包实现的。

图 15:集合特征缩放过程流程(图片由作者提供)
在图 16 中可以找到比较结果,该结果对照最佳 solo 方法(标准化)检查了这些集合的性能。

图 16:与最佳 Solo 算法的集合特征缩放比较(图片由作者提供)
在图 14 中,堆叠分类器似乎并没有改进标准化,但这并不是全部。在 STACK 获得最佳准确度的 30 个案例中,17 个模型创造了新的记录(即超级表现者)。STACK 的概括能力比标准化稍差,但准确性更高。详情参见图 17。
就投票而言,在达到最佳准确率的 31 个案例中,有 14 个创造了新的记录。投票集合在普遍性和准确性方面都优于标准化。

图 17:集合特征缩放性能(图片由作者提供)
为了进一步改善结果,在参考图 8 及其概化描述后,我们构建了一个三管道模型,除了标准化和稳健缩放之外,还增加了归一化(0,6)。详情参见图 18。

图 18:三重管道特征缩放集合(图片由作者提供)
这种集成在六个数据集上进行测试,对于这六个数据集,稳健缩放和标准化都表现不佳,但 Norm(0,6)表现优异,并且在每种情况下,测试精度都因为较低的偏差而受到影响。这让我们想到了另一个猜想:
猜想 2:预测模型的特征尺度集成的可推广性受到减少偏差的限制。
结论
如果你必须有规则,那么作为一个粗略的猜测,选择与学习模型的拟合相反的特征缩放方法。首先,与分布无关或对距离敏感的模型应该使用标准化。进一步的工作是必要的,以确认归一化是否是与分布相关的模型的最佳拟合。
我们通过一类新的模型——特征尺度集成,实现了更高的泛化能力和准确性。但是这种性能的提高是以计算成本为代价的。使用 SVC 模型生成类别概率而不是类别成员资格(软阈值对硬阈值)需要额外的 5 重交叉验证,并且需要更多的时间和计算资源。
如果您有这些资源,那么不管未来数据引起的扰动如何,投票集合作为一种通用算法应该工作得很好。如果时间和计算过程不可用,标准化本身就可以很好地处理这些基于距离的模型。但是,如果您需要最高的精度,可能需要采用试错法来找到“完美”的缩放算法。
参考文献
Abu-Mostafa,Y. S .、Magdon-Ismail,m .、和 Lin,H.-T. (2012 年)。从数据中学习(第四卷)。美国纽约 AMLBook:
布尔科夫,A. (2019)。一百页的机器学习书。
许春伟,张春春,林春军,等。(2003).支持向量分类实用指南。台北。
Mohamad,I. Bin 和 Usman,D. (2013 年)。标准化及其对 K 均值聚类算法的影响。应用科学、工程与技术研究杂志, 6 (17),3299–3303。https://doi.org/10.19026/rjaset.6.3638
潘迪和贾恩(2017 年)。使用不同归一化技术的 KNN 算法的比较分析。国际计算机网络与信息安全杂志, 11 (11),36。
Scikit-learn_developers。(未注明)。sklearn.svm.SVC 文档。检索自https://sci kit-learn . org/stable/modules/generated/sk learn . SVM . SVC . html?highlight = SVC # sk learn . SVM . SVC
联系方式:
戴夫·古根汉姆:参见作者简介和简历,dguggen@gmail.com
乌特萨维·瓦赫哈尼:领英简历,uk.vachhani@gmail.com
关于数据科学的神话,不那么神话,和真理

照片由 Dollar Gill @ Unsplash 拍摄
在您的数据科学学习之旅中,应该置身事外并注意什么
作为一名学生,当我开始认真考虑将数据科学(DS)作为职业选择时,我首先想到的是我应该从哪里开始,甚至在此之前,我应该首先学习什么!像许多其他人一样,我也是从约翰·霍普斯金大学的在线课程开始的。这门课程让我第一次接触到 R。然后,我开始学习大学开设的分析课程。最终,我的学习路径包括面对面的、在线的大学课程,以及一大堆个人项目。此外,我还涉足了一段时间 Kaggle。为什么我没有做得更多,这可能是另一天的讨论,但简而言之,我发现很难从 Kaggle 身上获得任何切实的好处。渐渐地,我对制作对用户有用的预测模型产生了兴趣。我接触到了 web 应用程序的世界!
现在回顾我的 DS 学习历程,我看到我对 DS 的理解是如何随着时间的推移而形成的。在这篇文章中,我将带你了解我在旅程不同阶段的想法,并分享我现在对它们的看法。
放弃
在继续之前,我认为有必要澄清一个重要的假设。在我看来,大体上有三种数据科学家角色:
研究:发明新算法并打包,
已申请:
- 主要从事可视化、统计和预测建模的数据科学家,
- 主要专注于深度学习、构建人工智能系统等的数据科学家。
这些角色绝不是相互排斥的,意味着一个人做一套工作并不意味着他/她不能执行另一套。这主要是基于他们作为数据科学家的大部分时间花在哪里。
在本文中,我将讨论的内容与第一种类型的应用数据科学家角色密切相关。此外,和其他观点一样,这些大多来自我的个人经历,所以不应该被认为是的真理。
免责声明说够了现在让我们一起走一走我的过去吧!
数据科学=编码
在我学习 DS 的早期,我认为 DS 就是学习一个编程工具。你学会了编程,你就成为了数据科学家!这有多真实?
不完全正确。
作为一名数据科学家,知道如何编码是一件幸事,但当谈到“多少”这个问题时那就要讨论了。如果你被聘用,作为真正的数据科学家,而不是软件工程师兼数据科学家,你将被期望成为数据分析和洞察力提取方面的专家。这样做的话,像 R/Python 这样的编码语言是你最好的朋友。所以要学会编码!
但是当你学习的时候,你必须记住你的目标;也就是用工具分析数据而不是学习工具,然后用它做 DS 。
例如,Python 是一种通用编程语言,恰好拥有非常丰富的 ML 和 DL 库。如果你的 Python 学习之旅以学习 Python A-Z 为目标,那么用它来解决 DS 问题,我会说这不是最聪明的想法。与其获取数据集,不如开始使用 Python 来探索和分析它。在这个过程中,学习你需要学习的东西探索数据**,建立模型,而探索并呈现结果。**
数据科学=研究
当我开始学习那些大学分析课程时,我逐渐开始看到定量社会科学研究和我们所知的数据科学之间的重叠。我开始越来越相信,数据科学只是研究和统计的一个花哨的重新命名。
差不多是真的。
作为一名数据科学家,当你致力于测试假设时,你应用你的统计和研究知识来设计实验和运行分析。理解统计概念会让你从痴迷代码的数据科学家中脱颖而出。但是,这里有一点需要注意的是,你经常会被限制在可用数据的范围内。所以实验的范围并不像你作为社会科学研究者所期望的那样广泛。此外,一旦你的项目是预测建模,你就不能从传统的统计学或计量经济学课程中学到很多东西,因为它们通常不会让你为预测建模做好准备。
那怎么办呢?
尽可能彻底地学习统计概念,但不要从应用程序和解释部分转移注意力。
为了学习应用,当你学习任何统计学/计量经济学课程时,确保你使用 R/Python 做项目。为了解释,考虑如何用外行人的术语交流统计术语,并将你的因果推理理解与预测性能联系起来。这里有一个我经常看到的令人困惑的话题供你思考:“较低的 p 值是否意味着变量也具有预测能力?”。想想你会如何用你的统计学知识向没有多少统计学知识的人解释这一点。答案对你来说可能是显而易见的,但对那些不太关心统计学的人来说很可能不是。
数据科学=从头开始编写算法的能力
这个阶段非常有趣。随着我开始深入挖掘数据科学,我开始觉得我需要能够自己编写 ML 算法来作为一名数据科学家工作!
****不真实;除非你的目标是研究岗位或者限制高的专门行业。
在应用数据科学领域,不期望数据科学候选人知道如何编写他/她的 ML 算法包。老实说,即使你可以,除非你在 ML 和编码方面有多年的专业知识,否则使用已经建立和验证的包可能是一个更好的主意,因为它们会给你一个更快和更有效的算法实现。但是如果你真的对编码感兴趣,无论如何,为一个算法写你的包,这样做会教你很多关于算法的内部功能,但是作为一个新手,把它作为一个优先事项可能不是一个好主意。
DS 项目从数据开始
从我参加的所有课程中,我看到一个数据科学项目的最终成果是一份报告。我们获取/收集数据,探索数据,训练模型,调整模型,验证它们,测试模型,预测,然后通过记录它来结束我们的项目。但是真正的数据科学项目是这样的吗?
不完全是。
这个项目在你得到数据之前很久就开始了。
它通常从了解业务用户的需求开始。与 Kaggle 问题或班级项目不同,现实生活中的数据科学问题是一个业务问题。业务用户不知道如何将业务问题转化为数据科学问题。例如,如果你幸运的话,你可能会与他们进行简单的讨论,他们可能会告诉你,他们正在试图了解为什么一些客户没有回来,或者他们应该期待谁是潜在客户。然后你的工作就是把这个问题转化成一个测试假设或者建立一个预测模型项目。然而,更棘手的部分通常是决定哪些数据已经可用,可以用来解决问题,或者如果不可用,如何获得解决方案所需的数据。令人惊讶的是,您经常会发现自己试图找到多个 SQL 表的数据定义,然后试图找出如何连接它们,或者调用 API 并努力分析数据,或者浏览网站以获得必要的数据。在拥有成熟数据科学团队的大型公司中,这些是数据工程师工作职责的一部分。但是在较小的组织和项目中,您应该能够执行这些功能。在这种情况下,您的编码技能将会拯救您!
那么,除非你有专门针对数据库查询或数据工程的课程,否则如何学习这些技能呢?尝试个人项目,在这些项目中,您需要浏览网站或调用 API 和解析来获取您需要的数据。如果没有对已建立的数据库的一些访问权限,学习超过一些基础水平的 SQL 是很困难的。但是首先要尝试像 T2 W3 学校 T3 这样的网站。
DS 项目以报告/预测结束
在教育机构中,DS 项目以最终报告或预测结束。现实世界也是这样吗?
非常非常不太可能。
在大多数情况下,一旦你完成了一个项目,你就必须以一种将来可以重复的方式记录你的发现。这些报告和分析通常不是一次性的。
你将不得不在将来重新浏览和复制你创建的分析和报告。这使得使用像 R/Python 这样的脚本语言成了救命稻草。
一旦你有了一个脚本,你就能更好地复制你的结果。这使得像 Jupter Notebook 和 RMarkdown 这样的笔记本成为 DS 中最常用的报告工具。
此外,越来越需要将预测模型“生产化”。这里,我们所说的“生产化”是指通过将模型作为 REST API 或 web 应用程序,或者作为简单模型的简单脚本,来制作适合某种自动化的预测模型。
数据科学家≠故事讲述者
我一直认为数据科学家是告诉你数据揭示的事实的人。她/她不需要讲故事。通常,在我们培养学生的素质时,数据科学的这一面也完全被忽略了。
如果你是一个讲故事的人,培养它;如果没有,有意识地努力成为一个。
事实上,数据科学家是一个从数据中发现故事的讲故事者。这听起来可能有点戏剧性,但不管你作为一名数据科学家在技术上有多好,最终你如何叙述你的发现可能会成就或毁掉你的声誉。如果你想看看一个高度技术化的人如何成为一个讲故事的人,我建议跟随凯西·科济尔科夫。
这些都是今天关于 DS 的神话,但不是那么神话。数据科学对我来说是一个迷人的旅程,我希望它也能成为你的旅程!希望,我已经揭穿了一些神话,并使它变得更加清晰,当你开始成为一名数据科学家的旅程时,你应该期待什么而不是什么。
感谢阅读!
不确定如何开始你的 DS 之旅?试试这个教程:
**
阿拉法特·侯赛因
建模的神话:证伪

我们不会通过反复尝试去证伪来验证模型,也不应该去尝试;有了因果关系和贝叶斯概率,我们可以做得更好。
神话
伪造的神话有两个版本
- 科学通过反复尝试去证伪理论、推测或假设而进步。这是描述性的神话。
- 科学应该通过反复尝试去证伪理论、推测或假设而进步。这就是规范的神话。
证伪的规范性神话是广泛宣扬的科学实践学说的一半,还有数据的首要性和客观性的实证主义神话——数据是所有分析的起点,我们通过公正地收集数据并“让数据说话”来确保模型的客观性。
根据这种双重学说,一旦数据“说话”,我们就通过一个反复尝试证明这些假设错误的过程来检验它们预言的假设。只有这样,我们才能渐进地迭代到客观真理。
这种信念非常普遍,考虑到实证主义作为一种哲学运动在 60 年代几乎已经死亡,而证伪主义,正如我们将看到的,在它被引入之前 20 年就被有效地驳斥了。但是后现代的过度,社会建构主义似乎已经把科学实践吓回到一个狭窄的归纳盒子里。
这篇文章和我之前关于实证主义的文章认为,这种学说往好里说是被误导了,往坏里说是直接造成了损害。当然,在它的影响下,现代统计学在某些领域的实践已经萎缩了,这种实践带有一种对假设检验的强迫性先入为主和对解释性因果模型的歇斯底里的反感。但是,通过揭穿这些神话,让因果关系和概率论在科学实践中占据自然、正当的位置,确保数据分析和机器学习在这些领域的实践不会遭受同样的命运可能还不算太晚。
伪造的起源

卡尔·波普尔(LSE 图书馆—https://www . Flickr . com/photos/LSE Library/3833724834/in/set-72157623156680255/)
这两个神话是不可能的合作者,因为证伪的伟大普及者不是别人,正是实证主义的复仇女神卡尔·波普尔。
波普尔提出证伪作为休谟归纳问题的解决方案。休谟关于归纳法的问题是,我们认为重复观察证实了我们的信念的唯一依据是,我们被证实的信念被重复观察了。也就是说,归纳法的问题在于,我们对归纳法的信仰是归纳法。
波普尔认为,虽然我们不能归纳地证实我们的信念,但我们可以通过简单地观察它们与预测结果的偏差,来推断地证明它们是错误的。
然后他建议科学应该进行一个他称之为推测和反驳的过程。
知识进步的方式,尤其是我们的科学知识,是通过不合理的(和不合理的)预期,猜测,对我们的问题的尝试性解决方案,推测。这些猜想被批评所控制;也就是说,试图反驳,其中包括严重的关键测试。他们可能经受住这些考验;但是它们永远不能被肯定地证明是正当的:它们既不能被确定为真实的,也不能被确定为“可能的”(在概率演算的意义上)
对波普尔来说,正是在理论之间的裁决中,我们力求客观和公正,他的目标是通过这些理论的主角之间的对抗过程来实现。
大胆的想法、不合理的预期和思辨的思想是我们解释自然的唯一手段:我们唯一的工具,我们抓住自然的唯一工具。我们必须冒险让他们赢得我们的奖品。我们当中那些不愿意让自己的观点面临被反驳的危险的人,是不会参与科学游戏的。
为什么我们继续坚持这个神话
波普尔与其说是把归纳的铁罐扔进垃圾箱,不如说是把它踢到街上更远的地方,暂时把归纳的怀疑换成演绎的偶然性。此外,正如我们将看到的,事实证明,反驳假说或设计批判性测试毕竟不是那么容易。
但是猜想和反驳的过程有着巨大的实际的,坦率地说是道德的吸引力。通过抛弃数据“说话”的概念——它们自己产生意义或提供理论——并通过将客观性的审查从数据转移到对立理论之间的竞争,波普尔的方案解放了我们的想象力,并将假设放回其应有的位置,与数据对话,而不是屈从于数据。数据暗示假设,但假设引导我们回到数据,更好的是,在试图反驳我们的假设时,暗示我们寻找新的数据。
为什么证伪是一个神话
不幸的是,科学通过演绎证伪并不比通过天真的归纳发展得更快,也不可能,因为我们永远无法脱离大量额外的辅助假设来检验一个假设,这些额外的辅助假设解释了要检验的假设是如何与应该反驳它的观察联系在一起的。这个反对波普尔“严格批判检验”的可能性的论点,是皮埃尔·迪昂在他的《物理理论的目的和结构》(1906 年,当时波普尔四岁)中非常优雅地提出的。
在他的许多例子中,迪昂讨论了在 19 世纪中期观察到的天王星轨道的偏差。这些偏差绝不会以任何方式破坏牛顿的万有引力定律,而预测的轨道就是从万有引力定律中推导出来的,这些偏差只是被假设为挑战一个辅助假设——即天王星没有受到任何其他大质量附近物体的影响。这一点,以及西方数学史上一些最英勇的手工计算,最终导致了海王星的发现。科学的进步归功于证伪的失败。
迪昂的例子尤其令人心酸,因为水星轨道的偏离在当时促使人们试图发现一颗行星,这颗行星的存在是如此确定,以至于它已经有了一个名字:瓦肯。在《目标与结构》出版十多年后,爱因斯坦证明了在水星的情况下,问题确实出在牛顿的理论上。但是牛顿的理论从未受到任何失败的严重挑战,直到水星轨道的偏差被广义相对论解释——一个源于灵感猜想的理论,如果曾经有过的话。
迪昂反对科学实践中证伪的现实性或可能性的论点,在奎因对大约半个世纪后的讨论做出贡献后,被称为迪昂-奎因问题。但是奎因的主张更为有力。
奎因认为,任何理论都可以适应经验观察,这更多的是一种诗意的灵感,而不是来自任何特别详细记录的理性过程。这是一个更加可疑和危险的说法,因为如果理论总是可以调整以适应观察,那么理论的构建就真的没有限制。这就是疯狂,或者至少是社会建构主义。我们不会去那里。迪昂会为我们做的。
为什么这是个问题
除了宣扬一种既未实践也不可能实践的实践的认知失调之外,唯一真正的缺点是,有了我们现在所拥有的工具,我们可以做得更好,而不是在竞争对手的猜测之间的竞争中约束自己进行证伪。
我们应该做什么?
因果关系和概率是波普尔难题中缺失的部分,因为它们共同为解释性猜想提供了一种自然语言,并为广泛使用数据(证实性的和矛盾的)提供了一个内置框架,以告知公开竞赛中猜想的可能性。
受到休谟的困扰,波普尔对因果关系很冷静,他在假设性猜想的熔炉中评估因果模型所需的概率框架还处于萌芽状态。此外,流行的频率主义概率框架已经是归纳主义的好朋友(因此不是波普尔的朋友)。
后来对休谟的解读表明,休谟认为缺乏相信因果关系的逻辑基础是逻辑的问题,而不是因果关系的问题,他愿意接受自然界中存在真正的原因,但我们对它们的认识必然是偶然的和假设的。
本着这种精神,鉴于波普尔方案中知识的内在偶然性,坚持反驳的演绎确定性似乎是不可支持的。摆脱了这种约束,我们就可以利用推理机器的全部武器,在我们必须解决的问题的因果解释模型和我们必须指导我们这样做的数据之间进行激烈的竞争。
朴素贝叶斯分类器
通过简单的例子解释了朴素贝叶斯算法。

作者图片
内容:
简介
1。贝叶斯定理
2。朴素贝叶斯分类器
3。一个简单的二元分类问题
3.1 先验概率计算
3.2 类条件概率计算
3.3 预测后验概率
3.4 用连续数据处理特征
3.5 处理不完整数据集
4。使用 Scikit Learn 的朴素贝叶斯
4.1 处理混合特征
5。结论
6。参考文献
简介:
分类算法试图预测分类目标变量的类别或标签。分类变量通常代表具有离散值的定性数据,如通过/失败或低/中/高等。在许多分类算法中,朴素贝叶斯分类器是最简单的分类算法之一。在其他应用程序中,朴素贝叶斯分类器通常用于大型文本数据集。本文的目的是解释朴素贝叶斯算法是如何工作的。朴素贝叶斯分类器基于贝叶斯定理,这将在下面讨论。
1.0 贝叶斯定理:
假设进行了一项关于购买超高清电视的客户调查。调查结果以列联表的形式呈现如下:

表 1:列联表
为简单起见,列联表中的类别用字母表示如下:
答:计划购买
b:实际购买
答`:不打算购买
b `:实际上没有购买
基于上述符号,列联表中的信息也可以用文氏图的形式表示。

作者图片
P(A)计划购买的概率= 350/1100。
P(B)实际购买的概率= 450/1100
P(A∩B)计划购买和实际购买的概率= 300/1100
请注意,在计算 P(B)时,我们没有考虑客户是否打算购买。顾客计划购买的先验知识改变了顾客实际购买的可能性。这也被称为假设顾客计划购买的实际购买的条件概率。它被表示为 P(B|A)。
P(B|A) = 𝑃(𝐴∩𝐵)/𝑃(𝐴) = 300/350,即在计划购买的总实例中,实际购买了多少。
这个等式可以改写为
𝑃(𝐴 ∩ 𝐵) = 𝑃(𝐵|𝐴)∗𝑃(𝐴)
我们也可以写出假设客户实际购买了 P(A|B) = 𝑃(𝐵∩𝐴)/ 𝑃(𝐵)= 300/450 的计划购买的条件概率。
我们可以将此改写为:
𝑃(𝐵 ∩ 𝐴) = P(A|B)*P(B)
由于 P(A∩B) = P(B∩A ),我们可以使上述两个方程的右边相等,从而得到:
𝑃(𝐵|𝐴)∗𝑃(𝐴)=𝑃(A|B)∗𝑃(B)
这个等式可以改写成贝叶斯定理:

如果 a 和 b 是独立事件,那么𝑃(𝐴∩𝐵)=𝑃(𝐴)÷𝑃(𝐵).
因此,当 A 和 B 是独立事件时,P(A|B) = P(A)
2.0 朴素贝叶斯分类器:
让我们数据集中的特征向量由𝑨 = (𝐴₁,𝐴₂,…,𝐴ₙ).目标向量是具有值𝐵ᵢ,i= 1,2,…k 的分类向量,其中 k 是目标向量的类别/标签总数。
给定一个新的特征向量𝐴₁,𝐴₂,…,𝐴ₙ,朴素贝叶斯分类器预测概率 P(𝐵ᵢ| (𝐴₁,𝐴₂,…,𝐴ₙ),i=1,2,…。k,即给定特征向量的目标向量的每个类别/标签的条件概率。这种条件概率也称为后验概率,可以用简洁的形式写成𝑃(𝐵ᵢ| 𝑨,i=1,2,…k。然后,朴素贝叶斯分类器将后验概率最高的类/标签 I 选为最可能的结果。
使用贝叶斯定理计算类别的后验概率:

在上面的等式中,分母 P(𝐴₁,𝐴₂,…,𝐴ₙ)对于所有类别𝐵ᵢ都是相同的,i= 1,2,…k。因此,为了计算类别的后验概率,我们可以忽略它,只需计算分子 P( A | 𝐵ᵢ)和 p(𝐵ᵢ)I = 1,2…k 中的各项。下面将解释这些项的计算方法。
术语 P(𝐵ᵢ)也称为类别 I 的先验概率。设 m 是数据集中数据点的总数,𝑁Bⱼ是数据集中类别𝐵ⱼ的实例数,则对于第 j 个类别:

因此,为了计算先验概率,我们需要计算数据集中每个类的实例数,并将其除以数据集中的数据点总数。
为了计算项 P( A | 𝐵ⱼ),朴素贝叶斯分类器假设特征彼此独立,即特征𝐴ₛ的出现不受特征𝐴ᵣ.的出现的影响这个假设并不适用于所有情况,因此这个分类器被命名为朴素贝叶斯分类器。
特征独立性的假设产生:

P(𝐴ₛ|𝐵ᵢ)也称为类条件概率。计算和存储类别条件概率是任何朴素贝叶斯分类器执行的关键任务之一。
假设在一个数据集中有三个分类特征𝐴₁,𝐴₂和 A₃。𝐴₁要素有 2 个等级/标签,𝐴₂要素有 3 个等级/标签,A₃要素也有 2 个等级/标签。总的特征标号是 2+3+2=7。数据集中的目标变量是一个二元分类变量,即只有 2 个类别。对于这样的数据集,我们需要计算和存储 7*2=14 个类别条件概率。在预测阶段查找这些概率。在下一节中,将使用一个简单的示例来解释先验和类别条件概率以及后验概率的计算。
3.0 一个简单的二元分类问题:
这个虚构的示例数据集包含与事故相关的不同情况的示例。目标变量 accident 是一个带有是/否值的二元分类变量。有 4 个分类特征:天气状况、道路状况、交通状况和发动机问题。
下面列出了与每个功能相关的类别/标签:

表 2:要素类

表 3:示例数据
3.1 先验概率计算:
有 10 个数据点(m = 10)。有 5 个分类/标签“是”(𝑁Accidentᵧₑₛ = 5),5 个分类/标签“否”(𝑁Accidentₙₒ = 5)。可以使用第 2.0 节中的先验概率公式计算先验概率:
𝑃(Accidentᵧₑₛ) = 5/10
𝑃(Accidentₙₒ) = 5/10
3.2 类条件概率计算:
首先根据目标标签(是/否)分割数据集。因为目标变量有 2 个类,所以我们得到 2 个子表。如果目标变量有 3 个类,我们将得到 3 个子表,每个类一个。
以下两个表分别显示了目标类/标签“否”和“是”的数据集:

表 4:目标标签“否”的子表

表 5:目标标签“是”的子表
类别条件概率𝑃(𝑨 |𝐵ₙₒ和𝑃(𝑨 |𝐵ᵧₑₛ可以使用如下所示的表 4 和表 5 来计算:

表 6:天气条件的分类条件概率

表 7:路况的等级条件概率

表 8:交通状况的类别条件概率

表 9:引擎问题的类条件概率
虽然类条件概率的计算很简单,但是条件概率应该被系统地组织,因为在预测阶段需要查找这些概率。
3.3 预测后验概率:
假设我们现在有了一个新的特征向量:
天气状况:下雨
路况:良好
交通状况:正常
发动机问题:没有
任务是预测事故是否会发生?
使用第 2.0 节中的后验概率公式计算每个目标类别的后验概率。

注意,如第 2.0 节所述,分母的计算被省略。代入上表 6、7、8 和 9 中的先验概率和类别条件概率的值,我们得到:

自𝑃(accidentₙₒ|𝐴ₙₑ𝓌)> 𝑃(accidentᵧₑₛ|𝐴ₙₑ𝓌)的预言是偶然的= ‘不’。
概率可以通过归一化后验概率来获得:

3.4 用连续数据处理特征:
这个玩具示例中的数据集只有分类变量。如果数据集具有不断变化的要素会怎样?例如,假设我们有一个记录事故发生时温度的特征温度。这种特征的类条件概率的计算不能再基于上面解释的计数方法来计算。通常假设连续特征变量是正态分布的。对于正态分布,随机变量(x)在 x 和 x+dx 之间的概率由下式给出:

上式中的𝜇和𝜎是给定正态分布的均值和标准差。
基于目标变量类的子表的创建类似于上面所解释的。计算子表(表 4 和表 5)后,我们计算并存储平均温度𝜇ₜₑₘₚₑᵣₐₜᵤᵣₑ|Accidentₙₒ、𝜇ₜₑₘₚₑᵣₐₜᵤᵣₑ|Accidentᵧₑₛ,以及来自 2 个子表的温度特征变量的标准偏差𝜎ₜₑₘₚₑᵣₐₜᵤᵣₑ|Accidentₙₒ和𝜎ₜₑₘₚₑᵣₐₜᵤᵣₑ|Accidentᵧₑₛ。
在预测阶段,给定一个新的温度值,使用如上所示的正态分布曲线的分析形式计算类别条件概率:

3.5 处理不完整数据集:
在上述示例数据集中,存在足够的数据来计算所有类别条件概率。如果训练数据集中的目标类缺少特定的要素标注,该怎么办?例如,在我们的例子中,𝑃(𝑊eatherconditionᵣₐᵢₙ|accidentᵧₑₛ= 0。这将导致后验概率𝑃(accidentᵧₑₛ|𝐴ₙₑ𝓌= 0,即使其他类别的条件概率不为零。拉普拉斯校正用于处理这种情况。具有拉普拉斯校正的类条件概率的一般形式是:

对于第 3.0 节中讨论的示例,n = 1 是事故=是时的要素类计数(即雨)。𝑁Accidentᵧₑₛ= 5 号。
NFeature = 4(数据集中有 4 个要素)。
α是拉普拉斯校正因子。
拉普拉斯校正应用于所有类别的条件概率计算。从上式可以看出,对于特定的特征类,如果 n = 0,则类条件概率非零。
对先验概率的拉普拉斯校正的形式是

同样对于 3.0 节中讨论的例子
m = 10(数据点的总数)。
k = 2(目标变量类数量)。
为了理解校正因子α的影响,考虑一种假设情况,其中:n = 1,NFeature = 4,𝑁Accidentᵧₑₛ= 60,m = 100,k = 2。

图 1

图 2
图 1 和图 2 分别显示了上述假设情况下类别条件概率和先验概率的变化。从图 1 中,我们可以看到,随着α的增加,类别条件概率趋向于 1/4 = 0.25。同样,从图 2 中,我们可以看到,随着α的增加,先验概率趋于 1/2 = 0.5。
通过让α趋于无穷大,这些极限值也可以从拉普拉斯校正方程中看出:

因此,随着校正因子的值增加,类别条件概率趋向于均匀的概率分布,每个特征具有相同的类别条件概率 1/NFeature。
类似地,每个目标类别的先验概率趋向于均匀概率,每个类别具有相同的 1/k 的先验概率。对于大多数问题,值α通常选择为 1。
4.0 使用 Scikit 学习的朴素贝叶斯:
sklearn 中的 nave _ Bayes 模块支持不同版本的 nave Bayes 分类,例如高斯 nave Bayes(在 3.4 节中讨论)、用于分类特征的多项式 nave Bayes 以及其他版本。
本节使用 iris 数据集来说明 Scikit learn 中可用的高斯朴素贝叶斯分类器的用法。数据集可以在这里找到:【https://www.kaggle.com/uciml/iris?select=Iris.csv】
虹膜数据集是一个微小的数据集,由 4 个连续的特征向量组成,描述了鸢尾花家族的不同特征。有 3 个目标类别涉及三种鸢尾花。目的是为一组新的特征向量正确地预测花卉种类。

对于这个简单的数据集,高斯朴素贝叶斯分类器在预测花卉种类时达到了 0.96 的准确度分数。
4.1 处理混合功能:
如果数据集同时具有连续和分类特征。sklearn 的一个简单方法是使用宁滨将连续变量转换为分类变量。例如,通过定义冷、温和、热温度类别的温度范围,可以将温度等特征转换为分类变量。将所有要素转换为分类要素后,可以使用 sklearn 中 nave _ Bayes 模块中的多项式算法进行拟合和预测。
5.0 结论:
朴素贝叶斯分类器是一个简单而通用的分类器。由于计算成本低,朴素贝叶斯分类器对于大型数据集非常有效。在性能方面,朴素贝叶斯分类器比许多其他分类器具有更好的性能。朴素贝叶斯分类器的一个主要缺点是固有的特征独立性假设。实际上,真实数据集中的要素很少是独立的。尽管有这个缺点,朴素贝叶斯分类器在初步理解数据时非常有用。
6.0 参考文献:
- 基本商业统计概念和应用,M.L. Berenson,D.M. Levine,T.C. Krehbiel。
- https://scikit-learn.org/stable/modules/naive_bayes.html
受审的 Ndrangheta
利用 NetworkX 分析欧洲最强大的黑手党

Ndrangheta 的嫌疑成员(来源:意大利宪兵)
意大利自 20 世纪 80 年代以来最大的黑手党审判刚刚开始。900 多名证人将在卡拉布里亚一个特别建造的高安全性法院里为 350 名被告作证。被告席上的男子被指控是世界上最危险的犯罪组织之一 Ndrangheta 的成员。几十年来,它一直是西西里的科萨·诺斯特拉和那不勒斯的卡莫拉的穷亲戚。被好莱坞忽视的 Ndrangheta 在它的家乡——位于意大利“靴子”的“脚趾”处的卡拉布里亚偏远崎岖的山坡上——之外鲜为人知。其核心业务是勒索和绑架。它的结构是一个松散的家庭或宗族联盟,他们的血缘关系使他们几乎不可能渗透。
随着 Ndrangheta 近年来的发展,这种结构似乎已经发生了变化。当该组织与南美卡特尔建立联系并控制了欧洲可卡因市场后,其收入迅速增长。2013 年,Demoskopia 研究所的一份报告称,Ndrangheta 的营业额为 440 亿英镑,超过德意志银行和麦当劳的总和。CNN 估计,它控制了进入欧洲的高达 80%的可卡因。随着这种增长,Ndrangheta 也扩大了它的势力范围,开始统治意大利北部伦巴第区的地下世界。这种扩张伴随着更集中的控制和更高的公众形象。
Ndrangheta 的传播在 2007 年变得清晰,当时两个家族之间的世仇导致六名成员在德国西部小镇杜伊斯堡的一家披萨店外被枪杀。第二年,伦巴第区 Ndrangheta 的首领 Carmelo Novella 在米兰外的一个小镇 San Vittore Olona 的一家酒吧被谋杀。他对更多自治权的要求激怒了卡拉布里亚的老板们。
这个项目的数据集来自这段动荡时期。为了应对不利的头条新闻,伦巴第当局发起了 Infinito 行动,在两年的时间里跟踪 100 多个黑手党成员的行动和互动。2009 年 10 月录制了《达格纳诺峰会》( Summit di Paderno Dugnano ),高级黑帮成员在会上选举了卡梅洛·诺维拉(Carmelo Novella)的继任者。2010 年,在 Infinito 行动中收集的证据构成了几十项起诉的基础,大多数指控是参加黑手党类型的组织——定义为沉默的 omerta 和作为一个团体进行恐吓的权力。
这些案件结案后,当局公布了在 Infinito 行动中收集的信息。十年后,当 Ndrangheta 再次发现自己站在被告席上时,这种监视可能提供了对其领导层结构的最佳洞察。那么,关于欧洲最强大的黑手党,数据科学能告诉我们什么呢?
数据可以在这里下载。
Infinito 数据集引用了两年期间发生的 48 次会议。超过 150 名黑手党成员参与其中,但通常只有少数人参加任何特定的会议,每个黑手党成员通常只参加一两次。结果是一个相当稀疏的矩阵。NetworkX 库允许我们通过创建一个“二分”网络来可视化这一点——在下图中,每个蓝色节点代表一个黑手党,链接到特定的红色节点或会议。少数蓝色节点与多个红色节点相连,但大多数网络并不密集。

(图片由作者提供)
下一步是通过创建一个无向图来了解黑手党之间的关系。要做到这一点,Itertools 的 Combinations 类可以用于每个会议的出席者名单,以产生一个“边缘”列表,将构成新网络节点的黑手党分子联系起来。该网络包含 151 个节点或黑手党,1619 条边(黑手党之间的联系),每个黑手党平均与 21 个其他黑手党相连。那么这个网络告诉了我们什么关于 Ndrangheta 的结构,以及它最重要的成员是谁?
显而易见的起点是看每个黑手党组织的联系有多紧密,或者每个节点有多少“度”。这揭示了整个网络中的显著不平等。六个黑手党有超过五十个联系人,是网络平均人数的两倍多。

另一个要考虑的指标是聚类系数,它衡量节点倾向于聚集在一起的程度——如果一个黑手党的亲密同伙都有联系,那么他将具有高聚类系数。连接较好的节点很可能具有较低的聚类系数,因为连接越多,所有连接相互链接的可能性就越小。我们可以看到大多数节点的系数都很高,但也有少数节点的系数不高。聚类系数最低的六个人也是拥有最多联系的人。看起来这六个人都与许多其他黑手党有联系,而这些黑手党又彼此之间没有联系——这六个人是这个网络的主要枢纽

(图片由作者提供)
第三个要考虑的指标是“中间中心性”。这是根据其他节点之间有多少条“最短路径”通过它来考察每个节点的中心位置。大多数黑手党在这个指标上得分很低,但前七名包括我们在其他两个指标上看到的六个名字,外加一个人。那这七个人是谁?
- 亚历山德罗·曼诺是米兰皮奥特洛区 Ndrangheta 的老板。在 Infinito 行动之后,他将被判 16 年徒刑。
- Cosimo Barranca 是米兰市中心 Ndrangheta 的老板,在 Infinito 行动后被判 14 年徒刑。
- 安东尼诺·拉马尔莫是米兰林比亚区的老大。
- Pietro Francesco Panetta 是 Cormano 区的老板,也是 Provincia 执政委员会的成员。
- 科西莫·拉斐尔·马格诺里是帕内塔在科曼诺的副手。
- Francesco Muia 是爱奥尼亚海岸的老板,于 2016 年被判 24 年。
- Francesco Cristello 因参与 2010 年谋杀一名叫 Rocco Stagno 的罪犯而于 2019 年被判终身监禁。
当我们把这个网络想象成一个整体时,弗朗西斯科·克里斯特罗似乎是个异类。其他六个都有大量的连接,低聚类系数,和高介数中心性。Cristello 纯粹基于中间中心性列出了这个名单,这本身可能夸大了他的重要性。当然,从表面上看,他在网络中似乎远没有那么突出,也没有公开的信息表明他是一个重要人物。

(图片由作者提供)
那么 NetworkX 对理解 Ndgrangheta 的结构有多大帮助呢?学位、聚类系数和中间中心性的组合似乎已经确定了六个老板,但是还有多少,在挑选他们方面它能做得多好?
在 Infinito 行动之后,米兰的检察官评估了几十名黑手党成员的身份,并将其中一些人归类为老大,但是他们的报告似乎从来没有用英语发表过。但要判断网络分析的效果如何,我们需要给每个黑手党分配阶级标签(即‘boss’或‘not _ boss’)。幸运的是,即使没有来自检察官的明确名单,也可能有一个解决办法。
事实证明,并非所有的 Ndrangheta 会议都同样重要。最后一次被称为帕德诺·达格纳诺峰会,在米兰郊外一个小镇的会议厅举行。该大厅位于 Piazza Falcone Borsellino,讽刺的是,该大厅是以两名反黑手党法官的名字命名的,他们因参与 1986 年至 1987 年的“大审判”而在 20 世纪 90 年代被谋杀。

Paderno Dugnano Ndrangheta 会议的监控录像(来源:米兰检察官办公室)
峰会于 2009 年 10 月 31 日举行,标志着帕斯夸莱·萨皮亚当选为新的 Mastro Generale,负责维护伦巴第的 Ndrangheta 人和他们在卡拉布里亚的家乡之间的关系。在没有一份确定的老板名单的情况下,我们大概可以假设这次峰会的与会者是伦巴第的 Ndrangheta 的最高级成员。
这不是一个完美的解决方案,因为有几个与会者身份不明。然而,这似乎是一个合理的假设,即这些身份不明的男子不来自监控数据集内(或者可能不会有识别他们的麻烦)——他们很可能不是来自伦巴第的本地 Ndrangheta,而是来自卡拉布里亚的游客。
当我们查看参加峰会的已确认姓名时,他们肯定是网络中的重要人物。他们似乎是中央集权结构的一部分,而不是像恩格兰赫塔那样的松散的家族或宗族联盟。网络分析似乎证实了意大利首席反黑手党检察官皮埃特罗·格拉索的评估,即 Ndrangheta 已经变得“分等级、联合和金字塔式”。

峰会与会者以红色显示(图片由作者提供)
接下来的问题是,我们是否可以在会议召开之前预测到谁会被邀请参加会议——以及 NetworkX 在多大程度上增强了我们的这种能力?在我们回答这个问题之前,我们首先需要创建一个新的网络图,它不包含来自峰会的数据(或者目标变量将帮助预测它自己)。网络中的边数从 1619 条下降到 1443 条,平均度数从 21 度下降到 19 度。
检查调整后的新网络,我们的基线为 85.9%。这是由多数阶级(非老板)组成的比例,因此如果一个模型可以说有任何预测价值,它就需要比这个得分更高。
为了理解 NetworkX 分析增加了什么价值,我们首先需要看看没有它我们能做得多好。仅在出勤数据上训练逻辑回归模型(没有 NetworkX 特征,如度、聚类系数和中间中心性),我们得到交叉验证的准确度分数为 0.866,略高于基线。测试集上的准确度分数是相同的,但该模型在测试集上的回忆和 f1 分数为 0,这表明它很难挑出少数类的成员——当存在类不平衡时,分类问题中的一个常见问题。
当我们允许模型与来自 NetworkX 的数据一起工作时,情况会显著改善。交叉验证的训练分数上升到 0.891,并且测试集的回忆和 F1 分数都上升到 0.500。通过调整模型的阈值,我们可以得到进一步的改进,在 0.900 的准确率、0.750 的召回率和 0.667 的 f1 测试集上的性能最好。使用 SMOTE 对 minority 类进行过采样不会提供任何额外的改进,尽管相对于使用模型的默认阈值来说,它确实有所帮助。

(图片由作者提供)
在各种其他模型(RandomForest、KNN、GradientBoostingClassifier、SVC)中,最佳性能来自支持向量分类器——交叉验证的训练集精度为 0.891,测试集精度为 0.933,测试集召回率为 0.750,测试集 f1 为 0.750。

最成功的 SVC 模型的混淆矩阵(图片由作者提供)
当类别不平衡时,分类问题总是具有挑战性,NetworkX 分析生成的特征对允许模型得分显著高于基线有很大帮助。
这个项目的代码可以在这里查看。
Jupyter 小工具的新时代
如果您可以使用 NPM 的好东西用 Python 来构建 Jupyter 小部件会怎么样?

米利安·耶西耶在 Unsplash 上拍摄的照片
笔记本一直是软件思想增量开发的工具。数据科学家使用 Jupyter 来记录他们的工作,探索和实验新的算法,快速勾画新的方法,并立即观察结果。
这种互动性是 Jupyter 如此吸引人的原因。为了更进一步,数据科学家使用 Jupyter 小工具来可视化他们的结果或创建迷你网络应用程序,以方便浏览内容或鼓励用户互动。
然而, IPyWidgets 并不总是容易共事。它们不遵循前端开发人员开创的声明式设计原则,并且生成的组件不能像在浏览器环境中那样进行传输。此外,开发人员创建这些库主要是为了满足数据科学家的可视化需求。因此,它们缺少像 React 和 Vue 这样的流行前端框架带来的特性。
是时候迈出下一步了;这个故事介绍了 IDOM:一套用于定义和控制交互式网页或创建可视化 Jupyter 组件的库。我们将讨论后者。
Learning Rate 是为那些对 AI 和 MLOps 的世界感到好奇的人准备的时事通讯。你会在每周五收到我关于最新人工智能新闻和文章的更新和想法。订阅这里!
IDOM:用 Python 反应设计模式
那么,让我们从 IDOM 开始。对于那些熟悉 React 的人来说,你会发现 IDOM 做事的方式有很多相似之处。
我们将在 Jupyter 中创建一个简单的 TODO 应用程序。是的,我不知道这对数据科学家有什么帮助,但我想做的是展示 IDOM 的能力。如果你发现任何数据科学用例,请在评论中留下!
首先是代码。然后,我们将一次浏览一行,了解它是如何工作的。
idom.component装饰器创建一个组件构造器。该组件使用其下方的函数(如todo())呈现在屏幕上。然后,为了显示它,我们需要调用这个函数并在最后创建这个组件的一个实例。
现在,让我们来看看这个函数是做什么的。首先,[use_state()](https://idom-docs.herokuapp.com/docs/package-api.html#idom.core.hooks.use_state)功能是一个挂钩。调用这个方法返回两件事:一个当前状态值和一个我们可以用来更新这个状态的函数。在我们的例子中,当前状态只是一个空列表。
然后,我们可以在一个add_new_task()方法中使用 update 函数来做我们想做的任何事情。该函数获取一个事件,并检查该事件是否是由敲击键盘的Enter键产生的。如果是这样,它将检索事件的值,并将其附加到任务列表中。
为了存储用户创建的任务,我们将它们的名称附加到一个单独的tasks Python 列表中,旁边是一个简单的删除按钮。当按下 delete 按钮时,调用remove_task()函数,该函数像add_new_task()函数一样更新状态。但是,它不是向当前状态添加新项目,而是删除选定的项目。
最后,我们创建一个 input 元素来创建 TODO 任务,并创建一个 HTML table 元素来保存它们。在最后一步,我们使用一个div HTML 标签来呈现它们。
越来越好了
到目前为止,一切顺利。然而,IDOM 给我们的力量不仅限于显示 HTML 元素。IDOM 的真正力量来自它无缝安装和使用任何 React 生态系统组件的能力。
在这个例子中,让我们使用[victory](https://www.npmjs.com/package/victory),这是一组用于模块化图表和数据可视化的 React 组件。要安装 victory,我们可以使用 IDOM 命令行界面:
!idom install victory
然后,让我们在代码中使用它:
恭喜你。您刚刚在 Jupyter 笔记本中创建了一个带有victory的饼图!当然,导入和使用现有的 JavaScript 模块也很简单。参见文档。
结论
数据科学家使用 Jupyter 小工具来可视化他们的结果或创建迷你网络应用程序,以方便浏览内容或鼓励用户互动。
然而, IPyWidgets 并不总是容易共事。它们也有一些缺点:它们不遵循声明式设计原则,并且产生的组件不能像在浏览器环境中那样被转移。
是时候迈出下一步了;这个故事研究了 IDOM:一组用于定义和控制交互式网页或创建可视 Jupyter 组件的库。
IDOM API 在文档中有更详尽的描述。此外,在安装前,您可以在活页夹上玩idom-jupyter。
关于作者
我叫 Dimitris Poulopoulos ,我是为 Arrikto 工作的机器学习工程师。我曾为欧洲委员会、欧盟统计局、国际货币基金组织、欧洲央行、经合组织和宜家等主要客户设计和实施过人工智能和软件解决方案。
如果你有兴趣阅读更多关于机器学习、深度学习、数据科学和数据操作的帖子,请关注我的 Medium 、 LinkedIn 或 Twitter 上的 @james2pl 。此外,请访问我网站上的资源页面,那里有很多好书和顶级课程,开始构建您自己的数据科学课程吧!
新数据经济学

作者图片
如今,大多数组织都认识到数据是他们最有价值的资产。跨数据管理和分析所有领域的数据解决方案市场是巨大的,推动数据公司激增的大量风险投资资金并不令人惊讶。然而,令人惊讶的是,我们整个行业并没有整体地看待数据管理和分析问题;从数据生产到分发,再到导致洞察的消费。换句话说,我认为今天的数据经济学是有缺陷的。
与经济学处理商品生产、分配和消费的方式类似,数据经济学处理数据的生产、分配和消费。数据生产是指生成数据的格式、数据的来源和存储位置。数据分发的重点是谁可以访问数据,如何将数据货币化,以及如何进行访问。数据消费涉及数据处理、分析和可视化的方式,以获得进一步的见解。
看看大多数数据公司,从数据库、数据仓库、数据湖、湖屋,到所有众多不同的机器学习和特定于数据的领域解决方案。他们中的大多数都专注于数据消费,并且主要围绕如何使 SQL 查询运行得更快更便宜,如何训练和服务 ML 模型,或者如何执行特定领域的计算和可视化。一些公司已经做了一些初步的尝试,使数据能够在单个组织之外分发,但是有很多限制。绝对没有一家公司解决了生产方面的问题。整个行业理所当然地认为数据会以特定的格式出现,并且花费在 ETL 和数据争论上的时间是不可避免的。不应该。事实上,我认为倾向于以原始的低效格式保存数据的非 ETL 趋势正在使我们的行业倒退——而不是前进。
数据经济学的这三个方面的分割和隔离导致了人力时间和资源的巨大浪费,因此对组织来说成本非常高。但最重要的是,这完全是一种干扰;企业和科研机构将资源和时间投入到非核心产品或科研工作上。因此,商业受到阻碍,技术和科学进步不必要地减缓。
在这篇博文中,我详细阐述了数据经济学各个方面的问题和后果,从生产、分配到消费。然后,我概述了一个基本方法,它可以作为“解决方案模板”,任何设想构建数据系统和塑造数据经济学未来的人都可以遵循。最后,我将展示我们使用 TileDB 按照建议的方法构建的解决方案,以证明有可能彻底转变数据空间并显著加快业务、科学和技术的发展。
这篇博文是我最近在 PyData Global 2021 上演讲的扩展版,下面是那次演讲的视频记录:
数据生产问题
我以一个大胆而明显的声明开始:所有应用程序中的数据都以错误的格式生成。以下是一些例子:
- **历史财务数据:**数据存储在效率低下的文本文件中(最好的情况下是 CSV,最坏的情况下是一些晦涩的规范),缺少压缩和快速访问。
- 人口基因组学:数据存储在复杂的 VCF 文件中,只有少数工具可以读取。
- **激光雷达:**数据存储在 LAS 文件中,需要进一步的索引和元数据处理。
- **卫星成像:**数据存储在 COG 文件中,需要进一步的索引和元数据处理。
- 海上交通(AIS): 数据存储在效率低下的 CSV 文件中,无法压缩和快速访问。
- **通用表:**数据存储在 CSV 或 Parquet 文件中,缺少索引、元数据和版本控制等重要功能,留给了更高级别的应用程序。
我可以继续下去。明显的问题当然是性能。这些数据不是以一种分析就绪的方式存储的,可以被使用它们的工具有效地使用。因此,消费者求助于非常昂贵的争论和 ETL 过程。此外,每个消费者都必须构建自己的基础架构来分析大规模数据,这通常会与其他组织出于相同目的构建的基础架构类型重叠。最终结果是大量的重复劳动,次优的实现,以及人力时间和金钱的完全浪费。
这个问题当然始于这些数据的来源,它们根本没有与分发和分析这些数据的组织进行沟通。我们已经到达了这样一个点,数据消费者认为争论和 ETL 是必要的罪恶,因此,他们没有足够地推动数据生产者改变他们的方法。另一方面,数据消费者没有为数据生产者提出令人信服的替代方案,因此,后者对改变现状没有什么兴趣。这是一个僵局。
数据分布问题
传统的数据库和特定领域的解决方案长期以来忽略了将它们管理的数据分布扩大到组织之外的可能性。那是旧时代单一方法的残余。最近,组织开始意识到在全球范围内与外部方共享数据是有价值的。但是目前的方法在许多方面都存在不足。在这一节中,我将谈到三种这样的方法。
第一种方法相当幼稚,但也是最常见的一种:将数据以平面文件的形式转储到某个云存储桶中,并通过管理云提供商的文件策略或委托某种第三方“市场”解决方案来授予对文件的访问权限。无论哪种方式,消费者都被授予对文件的访问权限。下载数据、以更好的数据格式保存数据副本,以及构建庞大的基础设施来管理和分析大规模数据,这些任务完全落在了消费者的肩上。这个过程是由所有相同数据的消费者遵循的。1000 个相同数据的消费者?1000 次下载、复制和基础架构变化实际上做着同样的事情:以某种合理的方式管理、分析和可视化数据。
第二种方式在数据生产者方面更慷慨一些:建立基础设施,并以更好的方式向消费者提供数据。在这种情况下,建造和维护基础设施的成本由生产商承担。然而,与我们交谈过的大多数数据生产者都不希望花费资源来构建和维护这样的基础设施。那完全超出了他们的业务范围。
第三种解决方案是利用现成的数据库解决方案,并使用它们的数据共享功能(例如,参见雪花和红移)。在这种情况下,访问数据的成本转移到消费者身上,这是正确的方向。然而,有一些重要的限制。例如,不支持写访问,日志和审计很棘手,访问驻留在不同云区域或不同云提供商的生产者数据会变得非常复杂。对于跨区域访问,消费者可能被迫以额外的麻烦和成本在多个区域加速运行数据库集群,或者承受额外的出口成本。另一方面,跨云数据共享对于现有的解决方案来说是不可能的。但最重要的是,房间里的大象:所有这些数据库解决方案只处理表格数据。剩下的大量数据类型(图像、视频、基因组学、激光雷达等)以及简单的平面文件(如 pdf)又如何呢?您需要非常有创意地将所有这些数据放入关系数据库中,或者仅仅求助于上面提到的另外两种方法。
数据消费问题
有人可能会说,这是当前市场表现良好的方面。有许多数据解决方案,具有出色的性能和各种有用的功能。如果您的应用程序需要单一的数据解决方案(例如,事务数据库或数据仓库),那么您可能已经准备好了。
然而,在我们处理的大多数用例中,这远不是标准。在大多数情况下,一个组织除了表之外,还有各种各样的数据类型和平面文件。此外,组织中不同的个人和小组运行着用不同语言编写的不同工作负载,使用不同的工具,这些工具远远超出了 SQL 的范围。
通常发生的事情令人难以置信。例如,一些大型表格数据存储在一个强大的仓库中,但是一个组需要运行仓库不支持的大规模 ML 或定制操作。该小组创建了一个庞大的 SQL 查询来导出仓库中的数据,并将其导入 Spark 或 Dask 等工具中。身份验证、访问控制和日志记录在仓库内正常进行,但一旦数据流出,就成了西部荒野。没有控制,没有记录,没有责任。我还可以提供许多其他例子,涉及多种不同的数据类型、多种语言和工具以及大量争论。
消费问题的根源实际上是生产和分配问题,这些问题被忽视或被当作事后的想法。数据是以低效、不可互操作的方式产生或争论的。还没有适当地解决数据分发,以考虑任何类型的数据,以及来自产生数据的组织内部或外部的任何一方的数据。
基本方法
总结到目前为止,数据经济学是有缺陷的,因为没有人从整体上解决数据问题,因为每个人似乎都被困在高效和有效的数据消费的回音室中。我们对这个问题有了更全面的了解,以下是我们认为可行的解决方案,涵盖了数据经济学的所有方面。
生产
需要一种通用的格式,它可以与任何语言和工具以及任何存储后端进行互操作(自然地使它也是“云优化的”)。历史表明,不灵活的格式规范在所有领域都一再失败。此外,特定于领域的格式通常只能由特定于领域的工具解析和读取,这极大地限制了快速增长的数据科学和分析工具生态系统的使用。
格式应该是开放规范的,应该有一个快速的开源存储库可以读取和发展它。这个库应该用一种快速的、可互操作的语言(比如 C/C++)来构建,使众多的语言 API 包装器和工具集成能够在其上构建。重点不应该放在格式上,而应该放在存储库及其 API 上。这种形式不应缺乏灵活性,也不应经历“委员会批准”的大循环;相反,它应该能够快速发展,同时努力保持 API 的稳定性和向后兼容性。
通用性和互操作性将为合理的、规范化的、受控制的数据分发以及越来越多的工具的轻松使用打开大门。
分配
分配问题有四个方面:
**存储:**无论谁在访问数据,如何访问,数据都需要存储在某个地方。由于我们大部分时间都在谈论大量的数据,存储必须尽可能便宜。此外,数据是一种非常有价值的资产,因此生产商应该可以选择拥有数据,这意味着一种自带存储的能力。最后,存储必须与计算分开,以将总运营成本保持在合理的范围内,尤其是在计算需求波动且与存储容量不对称的情况下。所有这些考虑都指向将数据存储在某种符合上述所有条件的云对象存储解决方案中。
**访问:**这又回到了生产方面。如果数据格式是通用的和可互操作的,那么任何工具都应该能够直接从存储中访问它,而不需要局限于 SQL 或某个特定领域的库,也不需要任何繁琐和昂贵的下载。此外,如果数据在通用格式下被标准化,那么可以建立单一的认证、访问控制和记录机制来安全地管理各方的访问。通用性和互操作性是你的朋友。
**计算:**一旦解决了基本的存储和访问考虑事项,最关键的方面就变成了计算,或者更准确地说,是如何以及在哪里进行访问。这一点至关重要,因为它将决定谁来买单。这就是事情变得混乱的原因。
数据生产者应该拥有数据,并可以选择将数据存储在任何云对象存储中,甚至跨不同的地区和云提供商。此外,生产者不应该为消费者的任何访问支付一分钱。最后,消费者不应该被迫在生产者的云提供商或选择的区域建立基础设施,因为这永远不会随着生产者的数量而扩展,并且消费者总是不愿意维护多个集群。
那么我们如何解决这个问题呢?无服务器是你的朋友。应该有第三方为生产者和消费者管理基础设施。生产者应该将他们的数据存储在云对象存储中(在任何地区和云提供商上),并且只收取存储费用。消费者应该维护零基础设施。第三方应负责管理每个云提供商和每个地区的计算集群。消费者应该只从任何工具发出查询,第三方应该自动将计算发送到数据所在的位置,以提高性能并消除不必要的出口成本。消费者应该只为他们使用的资源付费,第三方应该负责监控这些成本。这是个三赢的局面。
**货币化:**这是指从分享数据(甚至代码)中获利的能力。根据上面的讨论,管理基础设施的第三方拥有促进从生产者到消费者的数据(甚至代码)分发的所有手段,包括关于使用的所有指标(因为遵循了随用随付模型)。因此,可以轻松构建市场功能来支持货币化,消除了生产者和消费者与两个不同供应商签约的需要(一个用于市场,另一个用于分析)。此外(也许也是最重要的),这消除了对数据移动的需求,而数据移动既麻烦又昂贵。第三方真正需要的是与 Stripe 之类的服务集成。然后每个人都得到分发、分析和货币化数据(甚至代码)的最终解决方案。
消费
与主要关注数据消费的整个市场相反,找到一种健壮的方法来解决数据生产和分发问题使我能够在这里花最少的时间来描述消费解决方案。这是因为,一旦您以通用和可互操作的格式获得数据(使用存储引擎来高效地存储和访问数据,并与所有工具集成),那么您几乎可以使用您已经在使用的任何工具,只需对您的日常实践进行很小的修改。例如,您将能够在相同的数据上使用 SQL、Python pandas、R data.table 或其他任何东西,而无需下载和争论,并且在我在发行版一节中描述的基础设施中以无服务器的方式进行。此外,您将能够在任何应用程序域(甚至跨应用程序域)中安全轻松地与任何人协作,因为分发基础结构支持开箱即用的数据共享等功能。换句话说,一旦您仔细解决了数据生产和分发方面的问题,消费方面也就自然而然了。
但最重要的是,单个通用格式和管理平台允许您在单个解决方案中存储和管理所有不同的数据类型和文件(以及统一的身份验证、访问控制和日志记录机制),而不是必须处理大量解决方案、数据移动和转换,以及在不必要的数据工程中浪费大量时间。
可行的解决方案
还有一个问题:*上述通用方法可行吗?*我们有证据证明确实如此。下面是我们如何在 TileDB 解决这个问题的。
我们发明了一种通用的数据格式和一个强大的开源存储引擎来支持它,叫做 TileDB Embedded 。这种格式基于多维数组,它足够通用,可以存储我们遇到的任何数据类型,从表格、基因组、图像、ML 模型,甚至平面文件。我们在最近的网上研讨会中详细解释了它的内部机制。
为了解决分发问题,我们构建了 TileDB Cloud ,这是一个基于通用 TileDB 格式的平台,因此允许存储、共享、货币化和记录一切:表格、平面文件、仪表板、Jupyter 笔记本、用户定义函数和 ML 模型。TileDB 云是完全无服务器,允许访问与任何云区域的任何提供商共享的数据,并对其进行大规模分析。它会自动将每个查询分派到数据所在的提供者和区域内的集群。最后,TileDB 云与 Stripe 集成,不仅可以轻松实现数据货币化,还可以轻松实现代码货币化(例如,UDF、笔记本、ML 模型和仪表盘)。欲了解更多信息,您可以观看本次网络研讨会。
最后,在消费方面,由于 TileDB 格式和存储引擎是通用的和可互操作的,人们可以从任何语言 API 和工具访问数据,同时继承 TileDB 云的所有访问控制、货币化和日志记录功能。
结论
数据经济学需要彻底重塑。数据管理和分析领域一如既往地炙手可热,但组织仍在基础数据管理方面苦苦挣扎。在这篇博文中,我证明了作为一个数据社区,我们可以做得更好。我解释说,有一个新的框架从整体上考虑数据问题,从数据生产、分配到消费,对数据经济学有一个全景的看法。我认为有证据表明这样的框架是可行的。今天的证据是我们在 TileDB 所做的,但我希望我们能激励其他人去构建类似的解决方案。市场上的风险远不止数据炒作和风险投资消防水管。严肃的组织和科学机构正在依靠我们加速商业、科学和技术,为了每个人!
演讲幻灯片
这是我在演讲中使用的幻灯片。
作者在甲板上的图像
最后说几句:
最后但同样重要的是,非常感谢整个团队所做的出色工作。我只是一个纯粹的代表和投诉的唯一接受者。所有的荣誉总是归于我们令人敬畏的团队!

907

被折叠的 条评论
为什么被折叠?



