本文最初发表于 Kdnuggets 网站,经原作者 Nicole Janeway Bills 授权,InfoQ 中文站翻译并分享。
一旦掌握这些技能,我敢说,你将会成为一个更“性感”的数据科学家。
《哈佛商业评论》(Harvard Business Review)在 2012 年发表的一篇文章《21 世纪最性感的工作》(The Sexiest Job of the 21st Century)中描绘了这样的一个愿景:数据科学团队将能够毫不费力地从数据中创建可操作的信息。
虽然数据科学并不完全是“海滩游侠”(Baywatch),但它是一个充满活力的领域,具有巨大的潜力,可以从组织的顶级战略资产中产生有价值的见解——伟大的数据基础设施所提供的竞争优势。
译注:《海滩游侠》是由 Michael Berk 执导的电视剧,是世界上收视率最高的电视连续剧之一。故事情节围绕海滩护卫队员营救故事展开,最大看点是海边的旖旎风景,以及无数的泳装帅哥美女。
为帮助你的数据科学工作,本文介绍了十个被低估的 Python 技能。一旦掌握这些技能,我敢说,你将能够成为一个更“性感”的数据科学家。
10、设置虚拟环境
虚拟环境为 Python 项目设置一个隔离的工作区。无论是你是单独工作还是与人合作,拥有一个虚拟环境都会有帮助,原因如下:
避免包冲突。
在安装包的位置提供清晰的视线。
确保项目使用的软件包版本的一致性。
虚拟环境的使用允许你(和你的团队成员)对不同的项目有着不同的依赖关系。在虚拟环境中,你可以测试安装软件包,而不必担心会污染系统安装。
部署venv 模块对于避免将来出现问题非常有帮助。因此在项目开始时不要跳过这一步骤。
了解更多:通过设置包含科学计算最常用包的虚拟环境,以节省空间,并且避免在不同地方安装多个包的相同版本。然后在特定项目的环境中以 .pth 文件的形式共享该公共环境。
9、根据 PEP8 标准进行注释
撰写好注释,提高自信和协作能力。在 Python 中,这意味着遵循PEP8编码风格指南。
注释应该是声明性的,如下所示:
而不是如下所示:
下面是一个带有 docstring
的示例,它是一种特殊类型的注释,用于解释函数的用途:
docstring
(文档字符串)特别有用,因为你的 IDE 会将这个字符串识别为与类关联的定义。在 Jupyter Notebook 中,你可以通过将光标放在函数末尾,并同时按下 Shift 和 Tab 键来查看函数的docstring
。
8、查找好的实用程序代码
你应该听说过“站在巨人的肩膀上”(standing on the shoulders of giants)这句话吧?Python 是一种资源极为丰富的编程语言。通过认识到自己不必孤军奋战,你可以加快数据科学的发现,从而完全可以并应该重用你之前的程序员的使用程序代码。
实用程序代码的一个很好的来源是Chris Albon的博客,该博主是机器学习抽认卡的创建者,这些抽认卡挂满了我家里的书房和卧室的墙上。他的网站提供了数百个代码片段的导航,可以加快你的 Python 工作流。
例如,Chris 向我们展示了如何按组将函数(比如 Pandas 的 rolling mean(移动窗口均值):.rolling()
)应用到数据帧(DataFrame):
这段代码将输出一个数据帧,其中包含每两行的滚动均值,并在.groupby()
语句中的第一部分为每个组重新启动。
7、使用 pandas-profiling 进行自动探索性数据分析
使用panda-profiling 工具包可以自动执行大部分探索性数据分析(Exploratory Data Analysis,EDA)。探索性数据分析是任何数据科学项目的关键准备阶段。它通常涉及基本的统计分析,并观察特征之间的相互关系。
这篇文章《通过 pandas-profiling 进行更好探索性数据分析》(A better EDA with Pandas-profiling)阐述了一种标准的“手动”数据探索方法,并将其与 pandas-profiling 库创建的自动报告进行了比较。
探索性数据分析已死,pandas-profiling 万岁!用事半功倍的方法实现完美的数据概览!
6、使用 qcut 改进目标分析
在这个关于改进机器学习工作流的精彩视频中,Rebecca Bilbro提供了明智的建议,在进行特征分析之前应检查你的目标列。
视频链接:https://youtu.be/gtVls61jolk(需科学上网)
以目标为出发点:这样你就可以在开始预测或分类目标变量之前,对目标标量有一个可靠的了解。采用这种方法,可以帮助你预先识别潜在的棘手问题(如类不平衡)。
如果你处理的是连续变量,那么将值放入容器可能会有用。使用 5 个容器提供了利用帕雷托法则(pareto principle)的机会。要创建五分位数,只需使用 Panda 的q-cut
函数即可。
译注:帕雷托法则(pareto principle),也称为二八定律或 80/20 法则,此法则指在众多现象中,80% 的结果取决于 20% 的原因,而这一法则在很多方面被广泛地应用。这个法则最初是意大利经济学家 Vilfredo Pareto 在 1906 年对意大利 20% 的人口拥有 80% 的财产的观察而得出的。在计算机科学,帕雷托法则可以应用于优化工作。Microsoft 指出,通过修复报告最多的错误的前 20%,给定系统中 80% 的相关错误将被消除。Lowell Arthur 曾提过:“20% 的代码有 80% 的错误,只要找到它们并修复即可。”
每个容器将包含数据集的 20%。将目标变量的最高五分位数与最低五分位数进行比较,通常会得出有趣的结果。这项技术是一个很好的起点,可以用来确定目标变量最高(或最低)性能可能出现的异常情况。
如需进一步了解,也可以看看 Rebecca 在《华盛顿的程序媛们》(《Women Who Code DC》,DC 指哥伦比亚特区,即美国首都华盛顿)职场访谈系列节目中的访谈,由《Yours Truly》节目组(译注:类似中国中央电视台的《大家》、《面对面》节目组)采访:
视频链接:https://youtu.be/xLitAQ2Tynw(需科学上网)
5、为特征分析添加可视化
可视化并不仅仅用于商业智能仪表板。当你研究新的数据集时,加入一些有用的图表和图形,有助于提高分析的速度。
有许多可能的方法使用数据可视化来提高你的分析能力,下面罗列了一些资源可供探索:
Seaborn 样例库(Seaborn example gallery)
Bokeh 笔记本示例(Bokeh notebook examples)
Yellowbrick 库(Yellowbrick gallery)
用于数据探索的 Streamlet(Streamlet for data exploration)
Tableau 入门指南(Tableau getting started guide)
4、测量和优化运行时
数据科学家以擅长修补而闻名。但随着该领域越来越接近于软件工程,对简洁、高性能的代码的需求也在日益增加。程序的性能应该根据时间、空间和磁盘使用情况进行评估,这些都是可扩展性能的关键。
Python提供了一些分析使用程序,可以用来展示你的代码花费时间的地方。为了支持对函数运行时的监视,Python 提供了 timeit
函数。
在使用 Pandas 改进你的代码时,有一些捷径:
3、简化时间序列分析
处理时间序列可能会令人生畏。我的训练营教练在准备讲授这个主题的那天,就带着一副不安的神情出现在课堂上。
幸运的是,dtw-python 包提供了一种比较时间序列的直观方法。简而言之,动态时间规整(Dynamic Time Warping,DTW)计算不同长度的两个数组或时间序列之间的距离。
首先,DTW 拉伸和 / 或压缩一系列可能不同长度的序列,以使它们尽可能彼此相似。借用语音识别的一个例子,使用这种技术可以帮助算法识别出“now”和“nowwwwwwwwwwwww”是同一个单词,无论是由急躁的成年人说的还是由狂暴的小孩说的。转换之后,程序包将计算单个对齐元素之间的距离。
了解更多:
阅读这篇论文《DTW 包:R 中的动态时间规整对齐方式的计算与可视化》(Computing and Visualizing Dynamic Time Warping Alignments in R: The dtw Package)(虽然最初是用 R 实现的,但仍然与 Python 相关)。
阅读此处提供的有关用例的信息。
2、建立用于实验跟踪的 ML Flow
ML Flow可以跟踪参数、代码版本、指标和输出文件。MlflowClient 函数创建并管理实验、管道运行和模型版本。使用mlflow.log_artifact
、.log_metric()
和.log_param()
记录工件(例如数据集)、指标和超参数。
使用mlflow uicommand
,你可以在本地主机浏览器中轻松查看所有实验的元数据和结果。
另外,请参看此数据科学工作流的完整指南:
《模型选择综合指南》(Comprehensive Guide to Model Selection),该指南阐述了选择正确算法的系统方法。
1、理解__main__
函数
使用if __name__ == '__main__'
,可以灵活地编写代码,这些代码可以从命令行执行,或作为包导入到交互式环境中。这个条件判断语句控制程序在给定上下文的情况下执行。
你应该能够预料到,将代码作为可执行文件运行的用户与将代码作为包导入的用户具有不同的目标。if __name__ == ‘__main__'
语句根据执行代码的环境提供控制流。
__name__
是模块全局命名空间中的特殊变量。它有一个由 Python 设置的
repr()
方法。repr(__name__)
的值取决于执行上下文。在命令行中,
repr(__name__)
计算为‘__main__’
,因此if
块中的任何代码都将运行。作为包导入时,
repr(__name__)
将计算为导入的名称,因此if
块中的代码将不会运行。
为什么这很有用呢?从命令行运行代码的人会马上执行函数。但如果有人将这个包作为实用程序代码导入到 Jupyter Notebook 中,则情况可能就不一样了。
在if __name__ == ‘__main__'
中,你应该创建一个名为main()
的函数,其中包含要运行的代码。在各种编程语言中,main
函数提供了执行的入口点。在 Python 中,我们仅根据约定将此函数命名为main()
,与低级语言不同,Python 并没有赋予main
函数任何特殊的意义。但是,通过使用标准术语,我们可以让其他程序员知道,这个函数表示完成脚本主要任务的代码的起点。
main
函数应该调用存储在模块中的其他函数,而不是在main()
中包含完成任务的代码块。有效的模块化允许用户按照自己的意愿重用代码的各个方面。
模块化的程度取决于你自己:更多的函数意味着更多的灵活性和更容易的重用,但可能会使你的包更难以被人们阅读和解释,因为它们在函数之间遍历逻辑中断。
额外好处:知道何时不使用 Python
作为一名职业 Python 程序员,有时候,我怀疑自己是否过度依赖这个工具进行科学计算。Python 是一门令人愉快的编程语言。它简单明了,维护成本低,而且它的动态结构非常适合数据科学的探索性。
尽管如此,Python 绝对不是处理广泛定义的机器学习工作流各个方面的最佳工具。例如:
对于将数据移动到数据仓库的 ETL 流程来说,SQL 是必不可少的,藉由 SQL,数据分析师和数据科学家可以对数据进行查询。
Java可能有助于构建管道组件,如数据提取和清理工具(例如,使用Apache PDFBox来解析 PDF 文档中的文本)。
作为数据科学中 Python 的快速替代品,Julia 正在迅速崛起。
Scala 通常用于大数据和模型服务。
在由TWIML AI 播客主持的小组讨论中,专家们探讨了他们所选择编程语言的数据科学应用。
视频链接:https://youtu.be/efcRhdA4Ql0(需科学上网)
听到一个JavaScript 开发人员谈论使用这种典型的以 Web 开发为中心的语言进行机器学习的潜力,这有点奇怪。但是,嘿,这很有勇气,也很有创意不是吗?而且它有可能通过打破机器学习和传统软件开发之间的障碍,实现数据科学的民主化。
目前,JavaScript 在数字上拥有优势:根据2020 年 StackOverflow 开发人员调查(StackOverflow 2020 Developer Survey),68% 的开发人员使用 JavaScript,而使用 Python 的开发人员为 44%,只有 1% 的开发人员使用 Julia,但预计这种情况将迅速改变。更多的机器学习开发人员是否意味着更多的竞争,更多的见解,甚至更多的 arXiv 论文?这就更有理由提高你的 Python 技能了。
作者介绍:
Nicole Janeway Bills,数据科学家,有用商业和联邦咨询方面的经验,帮助组织利用他们的顶级资产:简单而健壮的数据策略。
原文链接:
https://www.kdnuggets.com/2020/10/10-underrated-python-skills.html
评论 2 条评论