数据科学在抽象梯子上

数据科学正在Swift成为各行各业的开发人员和管理人员的一项关键技能,而且看起来也很有趣。 但这非常复杂-有很多工程和分析选项可导航,而且很难知道您做对了还是熊陷阱在哪里。 在本系列中,我们探索了了解数据科学的方式-从曾经去过那里的人那里了解需要什么,不需要什么,以及如何使它成为您的资产。

InfoQ的这篇文章是“掌握数据科学 ”系列文章的一部分。 您可以订阅通过RSS接收通知。

重要要点

作为主要使用Clojure编程语言工作的数据科学家,经常有人问我为什么不使用更流行的替代方法之一。 在本文中,我想阐述采用Clojure的原因,包括:

  • 用于REPL驱动的开发和笔记本的出色工具,用于探索性分析和实时图表。
  • 适用于使用Facebook的React等现代UI框架创建可共享的基于浏览器的可视化效果和交互式模拟。
  • 与Java,JavaScript和Scala的互操作性,以利用已建立并积极开发的数值优化,分布式计算和机器学习库。
  • 面向数据的功能核心,着重于可组合的序列处理接口,这些接口随您拥有的数据量而扩展。
  • 干净明确的语法,甚至有助于我理解转录算法。
  • 宏系统,可在语言级别实现自定义算法抽象和更简洁代码的可扩展性。

尽管Clojure缺少广泛使用的工具箱和最流行的数据科学语言,R和Python的分析社区,但它为发展统计思维和实践有效的数据科学提供了强大的环境。

如果您已经是一名数据科学家,我希望展示Clojure的学习将为您的工具链带来什么。 但是,如果您是一位希望首次学习数据科学原理的程序员,那么我希望您将Clojure视为探索这一激动人心的分析世界的语言。

通往危险区的高速公路

与许多其他人一样,我自己的数据科学之旅来自软件工程。 2015年,《 数据科学状况调查》发现,LinkedIn上数据科学家最受欢迎的专业是计算机科学,并且大多数人在过去四年中都增加了自己的技能。 因此,当Packt Publishing邀请我为Clojure程序员写一本介绍数据科学的书时 ,我很高兴地同意了。 除了意识到这本书的必要性之外,我还认为这是巩固我在自己的数据分析公司担任首席技术专家的四年中学到的很多知识的机会。

如果您正在考虑发展自己的数据科学技能,那么您可能已经考虑过使用Python或R。对于那些来自编程背景的人来说,Python是一个特别受欢迎的选择,因为它是一种很好的通用脚本语言,它还提供了对出色的统计和机器学习库。 当我刚开始从事数据科学时,我使用Python和scikit-learn处理集群项目。 我从社交媒体上收集了一些有关用户兴趣的数据,并试图确定整体上是否有用户群体。 我之所以选择频谱聚类,是因为它可以识别非球形聚类(我认为必须更好),并且第一个结果令人鼓舞。 重新运行群集时,我的信心Swift消失,并获得了不同的结果。 在后台,该库利用了随机算法k-means ,而我正在寻找新的局部最小值。 由于显然缺乏客观真理而感到沮丧,但是需要显示一些结果,我只是选择了看起来最符合我期望的结果并继续前进。

我当时在未经许可的情况下使用机器学习,并使用一个我不太理解的黑匣子来证明我期望的结果是正确的。 那时我还不了解聚类评估指标和量化和控制方差的方法。 更不用说交叉验证,高偏见或维度诅咒了。 我正好坐在著名的“危险区”德鲁·康威(Drew Conway)中 。

早在1711年,亚历山大·波普(Alexander Pope)就在他的第一本主要诗歌《批评论文》中写道

有点学习是一件危险的事情

他的建议是针对学生文学评论家的,但也可以很容易地应用于学徒数据科学家。

我们如何使人们了解数据科学?

对于成为一名成功的数据科学家的先决条件有很多建议:列表通常包含听起来很吓人的数学技术,例如多变量微积分和线性代数或概率论。 尽管这些建议是经过精心设计的,但对于大多数有抱负的数据科学家而言,这并不是有用的建议。 提出回顾性建议的高级从业者会忘记开始时会产生压倒性的感觉。

Bret Victor的出色文章“ 可学习编程”强调了学习编程时遵循流程的重要性。 由于它也是一项高技术技能,因此他提出的指导原则可以很容易地解释为数据科学:

  • 数据科学是一种思考方式,而非死记硬背。 学习聚类算法并不比学习铅笔要学习绘画要学习数据科学。
  • 人们了解他们所看到的。 如果数据科学家看不到算法在做什么,那么她将无法理解它。

我认为,与编程一样,入门数据科学的最佳方法是与实时反馈交互地探索问题领域。 这可能涉及编写一些小的程序,这些程序利用提供算法的库,或者通过自己从教程和书籍中实现算法来实现。

REPL是用于试验代码的工具,它使您可以与正在运行的程序进行交互并快速尝试想法。 它通过向您提示可以输入代码的方式来完成此操作。 然后,它将读取您的输入,对其进行评估,打印结果,然后进行循环,再次向您显示提示。 REPL环境无法达到Bret Victor理想的编程环境(通过要求程序员一次编写一个完整的表达式),但是设置良好的REPL环境比处理脚本(可能是编译脚本)的工作流程要近得多。然后作为离散操作运行它。

Python的交互式解释器和R提示也允许按表达式探索代码。 但是REPL驱动的开发已嵌入Clojure文化中,流行的Clojure开发环境(例如Emacs和Cursive)使REPL占有重要地位。 Cider等出色的工具使交互式REPL开发,调试和重构成为真正的乐趣。

按照流程

理查德·汉明(Richard Hamming)的断言描述了程序员在学习数据科学时必须发展的基本思维方式:

在科学中,如果您知道自己在做什么,就不应该这样做。 在工程学中,如果您不知道自己在做什么,那么就不应该这样做。

这只是一个略微的简化。 根据定义,进行数据科学将涉及开放式探索。 对我来说,当我开始理解描述性和推论性统计以及共同分布之间如何相互联系时,就发展了处理和控制这种不确定性的技能。 除数据清理外,它们是我所参与的数据科学项目的大部分内容,我将Clojure的前两章专门用于数据科学,旨在为它们建立牢固的基础。 不幸的是,它们常常被程序员所忽视,因为仅靠查看代码是无法理解它们的,而且很少有资源将它们介绍给编程人员。

data-scorcery.org (尤其是概率和统计部分)上的Incanter代码示例提供了有用的起点。 Incanter本身提供Clojure的最完整的统计计算库集,并包含通用统计功能,通用分布和制图功能的实现。 遵循REPL中的示例并查看每个阶段的输出是学习的绝佳方法。

为了巩固这一新知识,我阅读了很棒的免费书《 Think Stats》 。 改编本书的许多练习并在Clojure中解决它们有助于同时建立我的Clojure和统计知识。 在网络上搜索“思考Clojure中的统计数据”将抛出许多其他做过同样事情的例子。

科学界听到的最令人兴奋的短语,即预示着新发现的那个短语,不是“尤里卡!”。 但是'真有趣...'

-艾萨克·阿西莫夫(Isaac Asimov)

顺便说一句,我在研究本书时学到的一些最违反直觉和有趣的东西根本不涉及任何代码。 辛普森悖论就是一个很好的例子,其中相同的趋势出现在不同的数据组中,但是当这些组组合在一起时,趋势甚至消失甚至逆转。 维基百科的文章很有帮助地包含了可视化效果,这些可视化效果很好地说明了这种明显的矛盾并弄清了其原因。

可视化

可视化提供了有用的见解,可让您仅查看摘要统计信息就可以了解丢失的数据,而Incanter为最常见的图表提供了支持。 但是不幸的是,很难忽略Incanter的图表并不特别吸引人的事实。 此外,在REPL内生成视觉效果时,Incanter的图表将在后台打开一个单独的窗口。

笔记本格式(在浏览器窗口中自由混合交互式代码和图表的格式)已成为进行数据科学的一种流行方法。 Jupyter是生产笔记本电脑最流行的框架,并且,由于使用clojupyter内核,Jupyter笔记本电脑也可以运行Clojure代码。 为了更紧密地集成Clojure和图表, Gorilla REPL提供了另一种完全用Clojure编写的笔记本堆栈。 尽管它附带了一组有吸引力的默认图表,但它也以可扩展的方式实现其渲染器 。 例如,gg4clj库扩展了Gorilla REPL以使用R的强大ggplot2图表库显示可视化效果 。 大猩猩REPL的修改版本由Huri使用 ,该图书馆提供“为惰性数据科学家提供的工具”。

最灵活的图表库是一种允许访问低级绘图API的图表库。 thi.ng/geom-viz提供了这种抽象级别。 它包含用于绘制轴,图表和数据比例之间的映射的实用程序功能,以及用于快速将数据呈现为常见图表类型的功能,但是它提供了空白画布和一组图元以SVG图形格式呈现图表。 由于SVG可以在Web浏览器中本地呈现,因此thi.ng/geom-viz可以创建复杂的基于Web的定制可视化。 使用与核心分析相同的语言进行可视化处理可以减轻由不了解数据的人在绘图程序中完成可视化处理时出现的各种问题。

互动性

像许多Clojure库一样,thi.ng/geom-viz不依赖于任何Java主机功能,可以同时编译为JVM字节码和JavaScript。 即使是低级Clojure矩阵操作库(例如core.matrix)也可以轻松地编译为JavaScript。 这意味着不仅可以在浏览器中呈现视觉输出:几乎可以在浏览器中执行Clojure代码的几乎任何部分(某些与文件访问和Java特定的功能(例如线程)有关的例外)。 得益于JavaScript的互操作性,您还可以利用本地JavaScript库(例如jStat和D3.js)进行可视化。

我对推理统计的理解最有用的方法之一就是通过交互式可视化。 在第2章中,例如,我展示如何构建历时从几个正态分布重复样本和计算样品平均值和的95%置信区间的浏览器应用总体平均值为它们中的每。 很明显,可以看到置信区间和样本量之间的关系。 而且,由于置信区间表示期望值位于的范围,因此重复抽样凭经验证明总体均值落在外部的时间为5%。 建立这样的简单工具可以帮助加深理解,否则可能需要数月或数年的时间才能开发出来。

数据科学在抽象梯子上_第1张图片

(点击图片放大)

Reagent和Om库都提供对Facebook React库的访问,以供用户界面使用。 React Native提供了使用相同的Clojure代码创建专用移动应用程序的可能性。

数据方向

我之所以推荐Clojure用于数据科学,也是为什么我认为Clojure是任何程序员学习的极好的语言的原因。

人们对编程和数据科学之间的所有这些界限感到困惑。 这是关于编码和表示信息。

- 卡林·迈耶

Michael Nygard在他的文章The New Normal:Data Leverage中将Clojure描述为面向数据的语言。 用他的话说:

例如,在Clojure中,您将数据作为数据来处理。 您不要试图将数据强制为面向对象的语义。 Clojure具有可用于任何类型的顺序数据,任何类型的关联数据和任何类型的集合数据的功能。 您不必使用具有十个或十五个方法的类,而可以使用数百个函数。 (仅clojure.core中超过640。)

因此,使用地图来表示客户,订单或订单行项目都没关系,您可以对所有对象使用相同的功能。 这些功能更通用,因此它们更有价值,因为您可以更广泛地应用它们。

可以灵活地在我的域中对项目建模,就像关联或顺序数据结构(或其层次结构)的集合一样,它提供了对数据的现成访问,而不会过早将其展平为表格。 从这样的结构中提取数字或分类数据以在需要时传递到Incanter的统计函数中仍然很简单。 Spectre库旨在增强Clojure的原始数据处理功能,专门用于从深层嵌套的数据结构中提取值。 正如西蒙别拉克 ,作者胡里 ,简洁地指出的那样: “被认为是有害的数据帧” 。

最近,Clojure.spec与clojure.spec一起发布,该语言的功能通过验证,错误报告和生成测试生成功能增强了这种灵活的面向数据的建模方法。 规范提供了一种对预期的数据模式进行编码的方法,以及早发现错误和错误的假设。 而且,对于数据科学家而言,也许更重要的是,规范可以用作文档:

最好和最有用的规范(和接口)与纯粹的信息方面有关。 只有信息规范才能通过电线和跨系统使用。 我们将始终优先考虑在存在冲突的情况下的信息方法。

Spec的明确目标是使我们编写的代码对我们的同事以及我们未来的人们更加容易理解。

抽象阶梯

即使在Incanter具有执行某些核心统计功能的功能的地方,我也发现在学习实现自己的版本时它很有用。 我发现这样做有两个目的:一是写我自己的版本迫使我理解我正在学习的功能。 第二个更令人惊讶:Clojure实现成为我回忆函数功能的一种方式。 这是我可以用来提醒自己功能比参考原始数学符号有效得多的东西。

仅当您了解如何将数学符号转换为代码时,才能为程序员提供诸如统计公式之类的资源。 尽管它可能显得晦涩难懂,但实际上在公式中经常出现的符号很少。 例如,Σ是明显的sigma,表示和。 当您以数学符号形式看到它时,就意味着正在添加一个序列,并直接映射到Clojure代码:

(reduce + xs)

其中xs是要求和的序列。 以我的经验,Clojure的语法有助于转录在其他地方遇到的统计方法。 扎卡里·泰尔曼(Zachary Tellman)在他的《 Clojure的元素》一书中这样写道 :

这可能是Clojure的最重要属性:语法表示代码的语义层。 经验丰富的Clojure读者可以跳过大部分代码,并且对它的高级意图有完整的了解。

从简单的构建模块中组合出更复杂的算法,成为了我在《数据科学的Clojure》中传达机器学习算法直觉的关键特征。 例如,我可以开始编写用于计算信息,熵,加权熵和信息增益的小纯函数,每个函数均与前一个函数有关。 信息增益量化了项目划分在将相似项目组合在一起而不同项目分开方面的成功程度。 递归地应用这种划分逻辑产生了一个简单的树分类器 。 Clojure允许我表达特定方法的本质,因为它表达此类算法的方式非常简洁。

布雷特·维克多(Bret Victor)写过关于如何通过上下移动抽象梯子来形成深刻的理解:

同样,了解系统的最强大方法是在抽象级别之间移动。 许多设计师本能地执行此操作。 但是很容易陷入困境,体验没有更高层次视野的具体系统。 完全使用抽象方程式或汇总统计信息也很容易陷入云层。

我发现Clojure使我可以轻松地在低级功能和高级行为之间切换。 构建自己的统计功能版本使我对事情如何工作以及如何相互融合有了更深入的了解。 这也给我带来了一些我可能会掩饰不住的惊奇,例如在选择四分位数的值上没有达成普遍共识 。

JVM作为平台

没有实践的数据科学家有时间定期从头开始编写自己的算法。 即使他们这样做了,做数据科学也不仅仅是算法。 数据工程也可能是其中的一个组成部分:将数据从源系统中取出,清理,以及可能也将数据捕获或呈现给实时网站的用户。

将Clojure用于数据科学的一个奇妙方面是可以访问Clojure的Java互操作功能所提供的丰富Java库。 例如,并行统计计算库ParallelColt支持Incanter的大部分数字处理。 Apache Commons Math还包含大量功能,用于灵活的数值分析和优化,以及遗传编程和带聚类的机器学习。 该文档非常适合描述特定算法的工作原理。 同样对于神经网络, Deeplearning4j库提供了许多算法的具体实现,其文档是有关该主题的有用教程的真实集锦。

一些Java机器学习库已经存在Clojure包装器。 例如, clj-ml提供Clojure接口,用于运行线性回归以及逻辑回归,朴素贝叶斯,决策树和许多其他算法的分类。 它建立在Weka之上, Weka是一个用Java编写的开源机器学习项目。 很难超越Python对自然语言处理的支持,但是Clojure库clojure-opennlp包装了Java的Open NLP库。

如果您确实有大数据,那么Parkour和Cascalog都是Clojure库,它们采用非常不同的方法来包装Hadoop的MapReduce框架。 Cascalog是我首先采用Clojure进行数据分析的原因。 我以其简洁的语法将MapReduce作业表示为逻辑程序的解决方案而着迷。 现在,Parkour是我最常使用的Hadoop库,并且它提供了围绕Hadoop本机功能的惯用Clojure包装器。 例如,它允许映射器和缩减器在运行时访问Hadoop的MapReduce上下文对象,并访问分布式缓存,从而避免为内存中查找数据进行昂贵的联接。 它还允许使用Apache Avro使用令人愉快且Clojure友好的DSL来定义和序列化自定义模式。

Interop还允许访问分布式的机器学习库,例如用Scala编写的Mahout和Spark的MLlib和GraphX 。 由于从Scala发出的字节码比等效的Java更复杂,因此从Clojure代码进行调用时,它们有些复杂。 基于scala的库使此操作变得更容易,但它仍然是一门黑暗的艺术。 我希望以与Spark相同的方式为他们提供全面的包装器:Clojure没有一个,而是两个用于与Spark交互的库, Sparkling和Flambo 。

最近,与core.matrix的作者合作开发了Cortex库。 它提供了以纯Clojure实现的神经网络,回归和特征学习。 在撰写本文时,它是新发布的,但是它已经保证可以摆脱Java的遗留问题,并结合基于GPU的快速数字运算技术,获得一系列连贯的机器学习抽象。 Onyx是一个相对较新的Clojure框架,用于使用基于不可变数据结构的API进行分布式计算。

Mahout,MLlib和GraphX解决的分布式机器学习领域是我希望Clojure生态系统将在未来几年内发展最多的领域。 卡斯卡洛(Cascalog)等库展示了将Clojure的功能原理和简洁的语法作为DSL用于大型和复杂数据处理框架的强大功能。 我很希望看到这种成功的方法也能继续应用于分布式机器学习领域,并且对Cortex和Onyx的开发充满兴趣。

功能编程

尽管Clojure提供了用于大规模进行机器学习的工具,但通常会要求我处理更小的数据集。 我的一位同事和好朋友Bruce Durling 为大数据量创造了术语笨拙的数据 ,这些数据量太大,无法在台式计算机上快速处理,但又太小,不足以保证Hadoop等分布式框架。

它大约是数十万个数据点,而不是数百万个,它是指适合合理指定笔记本电脑内存容量的数据集。

这是我大部分工作要做的地方。 Clojure提供了使用Reducers解决此问题的方法。 归约器提供可归约集合(可以在多个机器核心中归约的集合)的实现,以及操纵归约功能的手段。 实际上,这意味着您要建立一系列计算,然后对数据同时进行计算。 为了首先解决将数据放入可还原集合中的问题, Iota提供了从大型文件有效创建可还原集合的支持。

最近,Clojure推出了Transducers ,该工具将还原功能的实现与它们所应用的集合分开。 我在伦敦的Clojure eXchange上进行了有关带有换能器的表达并行分析的演讲。 库kixi.stats是该讨论的结果:一个统计归约函数库。 kixi.stats中的每个函数都将通过一次输入数据来计算其输出。 这种算法通常称为流算法,并以其在线性时间内产生近似解的能力而著称。

由于归约函数是纯函数 ,因此可以使用函数组合将它们组合在一起。 以这种方式,可以一次通过数据序列来计算多个统计量(例如平均值,标准偏差,偏度等)。 xforms和redux之类的库提供归约函数组合器,并且可以与任何归约函数一起使用,包括您自己编写的归约函数。

kixi.stats的实施在很大程度上受影响Tesser ,一个Clojure的库,还提供了流媒体这样的算法,因为他们既可以在本地或在Hadoop上运行的实现。

编码为数据

Clojure最有用的属性之一不是Clojure的特定属性,而是Lisp语言家族的成员。 Lisp作为最终的高级语言或众神语言而受到高度赞扬。 是发现而不是发明的可编程编程语言 。 它激发了伟大的计算机科学家的敬意:

如果您给某人Fortran,则他拥有Fortran。 如果您给某人提供Lisp,则他会选择任何语言。 -盖·斯蒂尔

Lisp不是语言,而是建筑材料。 -艾伦·凯

Lisp(以及Clojure)的这些品质可能很难用其他语言传达给程序员。 尽管我知道上面的作者来自何处,但这些陈述对于新手来说是疏远的,就像有关新手数据科学家在进行首次A / B测试之前学习多元演算的建议一样。

相反,我将仅提供一些示例,说明为什么拥有可编程的编程语言是一种资产。 迈克尔·尼加德再次:

使用Clojure,很容易支持我们的API的多个版本。 实际上,它是如此简单,我们甚至可以拥有有关API的API。 现在,我们的数据导向方法将所有内容都提升了。 通过使用数据而不是类或注释,我们使自己能够“进行元数据” [...]。 如果我们想用Java做到这一点,我们将需要构建一种新的语言来发出Java作为其字节码。 我们不需要用Clojure做到这一点。

实际上,此功能是Clojure表示数据的简洁方式及其一致且明确的语法的自然扩展。 Clojure代码本身就是数据,表示为可以由那些相同的数据操作函数操纵的符号列表。 通过称为宏的语言构造,Clojure允许程序员扩展语言本身。 函数接受值并返回新值。 宏接受代码并返回新代码。

在实践中,诸如Tesser之类的库使用它来提供表达转换的简洁方法。 库中有一个称为deftransform的宏,它可以消除用于指定转换的样板代码。 下面是地图的实现:

(deftransform map
  "Takes a function `f` and an optional fold. Returns a version of the fold
  which finally calls (f input) to transform each element.
      (->> (t/map inc) (t/into []) (t/Tesser [[1 2] [3 4]]))
      ; => [2 3 4 5]"
  [f]
  (assoc downstream :reducer (fn reducer [acc x]
                               (reducer- acc (f x)))))

剩下的代码体现了Tesser中映射转换的本质:它关联了调用(fx)的下游reducer函数。 这种内部表示使Tesser能够进行相同的计算,并以本地或基于Hadoop的上下文为目标。 顺便说一句,Tesser的作者写了一系列有关学习Clojure的文章,包括宏 。

宏不仅仅被高级Clojurian使用,来表达新概念。 它们使您(即使是Clojure初学者)也能完成更多工作。 例如, 线程宏通过删除嵌套表达式使代码更易读。 所以:

(reduce + (take 10 (filter even? (map square (range)))))

最后线程宏->>变为:

(->> (range)
     (map square)
     (filter even?)
     (take 10)
     (reduce +))

在编译为与先前版本相同的代码时,后者更清楚地表达了表达顺序。 Daniel Higginbotham在《 勇敢的克洛瑞 ( Brave Clojure)》中这样说 :

是的,宏比北极熊的脚趾甲凉爽,但是当您觉得自己的代码特别花哨时,就不应该将宏视为一种深奥的工具。 实际上,宏允许Clojure从功能和特殊形式的微小核心派生很多内置功能。

宏将一些评论员带入令人愉悦的发作中,但不要让它使您失望。 适当地使用宏将使您的代码更容易理解而不是难以理解。

学习学习

学习强大的语言(例如Clojure)以及技术学科(例如数据科学)是一项艰巨的任务。 但是不要灰心! 美国政府数据黑客贝基·斯维格(Becky Sweger )说:

我最好的技术技能不是编码。 我愿意在所有人面前就我不了解的问题提出问题。

此外,仅通过编程进入数据科学,您就可以带来大量与实践相关的实用技能。 例如:

  • 用户故事。 您习惯于将大问题分解为较小的步骤,以提供可衡量的增量业务价值。 您知道在没有明确说明预期结果和优先级的情况下着手进行项目是愚蠢的,即使实施可能不清楚。
  • 版本控制。 您知道将来不可避免地需要重复进行统计分析。 幸运的是,您已经将代码提交到了指定其意图的分支中的版本控制中。 您还可以在此代码中指出想要审查您的方法的任何人,以便他们可以复制您的方法。
  • 看板板。 您跟踪飞行中的工作以提供有关进度讨论的上下文,并存档完成的工作以提醒自己您走了多远(以及尝试的结果,无论尝试是否成功)。
  • Devops。 当需要将算法投入生产时,您要谨记。 您可以与开发和运营团队就如何将模型以他们可以理解的方式集成到实时站点中进行沟通。

振作起来 您作为数据科学开发人员的丰富经验是一项巨大的财富。

综上所述

预计数据科学家将具有广泛而深入的技术理解。 Clojure编程语言拥有种类繁多的应用程序,而ClojureScript进一步扩展了其应用范围。

如果您的数据科学项目要求您应用现成的算法并继续前进,那么Clojure不是我推荐的语言。 相反,如果您希望在统计思维方面建立坚实的基础,Clojure的语言,工具和社区将使您的投资回报很多倍。 这种方法将使您能够有效地将基本原则应用到您作为实践数据科学家遇到的各种情况中。

在本文开头,我引用了亚历山大·波普的《批评论文》中的一句话。 完整的对联是:

有点学习是一件危险的事情/喝得深一些,或者尝尝皮埃里春天的味道

皮埃里泉是艺术和科学知识的隐喻来源 。 如果您想学习强大的分析技术,请使用一种会随您的抽象阶梯而上下移动的语言。 即使技术选择(甚至您对编程语言本身的选择)在将来继续发展,这种概念性的基础也将为您提供良好的服务。

感谢Luke Snape审阅了本文的初稿。

翻译自: https://www.infoq.com/articles/data-science-abstraction/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

你可能感兴趣的:(可视化,大数据,编程语言,python,机器学习)