我在数据科学前线工作这一年
时间:2020-01-03
作者:
来源:
在本文中,我将结合自己的实践经验,与各位分享心得,希望帮助大家避免我曾在日常数据科学前沿工作中遇到过的错误。
作者:Will Koehrsen 译者:核子可乐 来源:InfoQ
过去一年以来,我的工作内容从简单编写 Jupyter Notebook,转向为数据科学方面犯了不少错误),但在过程中我还是学到了不少关于数据科学前沿工作中遇到过的错误。
生产层面的数据科学,总体属于计算机科学范畴
在被问及工作当中最困难的部分时,我总会首先强调一点——生产层面的数据科学,不属于机器学习。毕竟我们平时接触的“机器学习”基本都是这个样子:
。在结果验证之后,任务即可按计划自动运行,将结果写入回我们的数据库内,并发送 webhooks 以触发其他服务。</p>
<p>这些具体操作构成了机器学习中的大部分内容,同时也对工作人员的计算机科学知识提出严格要求。与代码开发相关的实践方面,则包括编写负责实现单一功能的短函数、开发类以实现多个相关函数、合理的命名约定、以代码与数据为基础编写单元测试、编写读取代码,同时确保不存在重复代码。此外,我们还需要将其他计算机科学实践应用于代码之内,例如版本控制、代码审查、持续集成、代码覆盖与部署等等。这些实践方法,共同构建起一个完全独立的新领域——机器学习运营(MLOps)。</p>
<p>尽管我努力完成了从机械工程到数据科学的过渡,但现在回想起来,如果当初能够选择从工程到计算机科学、再到数据科学的成长道路,也许效果会更好一些。后一种方法意味着,我用不着在数据科学实践当中积累编码知识。换句话说,虽然先学数据科学、再学计算机科学也不是不可行,但最好的方法应该是把二者的顺序颠倒过来。</p>
<p>计算机科学涉及一种完全不同的系统性思维方式,即在编码之前进行合理规划、逐步编写代码,并在编写完成之后进行代码测试。清晰明确的代码,与我之前随意写下的各种 notebook(我们都会编写名为 Untitled12.ipynb 的 notebook)形成了鲜明的对比。此外,计算机科学更强调快速获取结果的重要性,而非可重复利用的无错误代码。</p>
<p>任何数据科学家,都能够从计算机科学最佳编码实践课程当中受益。结构化脚本与软件包、简洁的代码编写风格、测试与记录代码的能力,将帮助我们更高效地管理从探索性数据科学到生产性机器学习的过渡。此外,计算机科学还带来一种重要的思维模式,帮助我们编写出更易于理解且可复用的代码。即使是那些单纯为了分析论文数据而编写数据科学脚本的学术型数据科学家,也将从这些实践当中获得助益。如果科学家们能够编写出更简洁的代码,并佐以用于输入、输出以及函数行为验证的单元测试,那么对科学中可重复性问题的处理能力将得到极大增强。</p>
<p>数据科学当中包含大量值得学习的主题,有时候会令刚刚上手的朋友感到不知所措。但是,计算机科学并非补充性知识;相反,对于希望保证代码可操作性的数据科学家而言,计算机科学更是一种基础性前提。幸运的是,目前市面上存在大量优秀资源,可供感兴趣的朋友学习并应用这些重要的编码实践。</p>
<p><strong>数据科学仍是一种高度主观的学科</strong></p>
<p>数据科学承诺利用数据——而非人类判断——做出最佳决策。虽然这个目标听起来有理有据,但目前的现实还远远无法支撑起这样的效果,这是因为我们使用的数据内容与分析方法在很大程度上仍受到人类的影响。事实上,就连数据科学中的所谓客观因素,同样与人类行为密不可分。正如 Vicki Boykis 在文章中提到,神经网络从始至终都是人的体现。</p>
<p>典型机器学习系统中的每一个步骤,都会受到个人选择的影响。下面来看几种具体决策方向:</p>
<p>数据收集: 我们需要收集什么数据?使用什么传感器?要调查谁?如何表达我们的问题?</p>
<p>特征工程: 我们建立哪些特征?应当使用特定领域知识还是自动化特征工程?如何填充缺失值?哪些意见需要被剔除?</p>
<p>建模: 我们应该使用哪些超参数?模型的复杂度应该控制在怎样的水平?</p>
<p>验证: 我们使用哪些评估指标?验证流程该如何设计?理想的结果应该拥有怎样的性能表现?</p>
<p>部署: 我们能否信任结果并将其展示给客户?是否需要引入人工评估预测,以进行完整性检查?</p>
<p>很明显,不同的人对于上述问题将给出不同的结论。《同一套数据集,不同的分析师(Many Analysts, One Data Set)》一文列举了一个实例,描述多位数据科学家如何凭借不同方法,利用相同的数据集得出相互矛盾的决策结果。毫不夸张地说,我们完全可以通过变更分析方法的方式,利用同一数据集同时证明某个论点及其对立观点。由此来看,我们不该对任何一项研究得同的结论坚持不放,而应该以怀疑的态度审视元分析过程。</p>
<p>此外,人为偏见(无论有意还是无意)都会出现在数据当中,进而影响到机器学习模型。正如《数学毁灭性武器(Weapons of Math Destruction》一书所提到,将决策工作交由机器处理并不能消除歧视,而只是对现实数据中存在的现有偏见进行了一番“整理”。我们的最终目标当然是利用数据科学消除决策偏见,但只要仍有人类参与,我们就不能盲目信赖机器学习的预测结果。</p>
<p>数据科学的主观性,是否意味着我们将陷入关于真理的“不可知论”当中?我认为我们有必要重新思考这个问题:我们不可能找到完全正确的答案,而只能利用数据科学——哪怕仍存在缺陷——不断朝着更好的方向迈进。毕竟,数据科学只是科学的一个子领域,因为其目标同样是随着时间的推进而减少错误机率。同样的,研究问题的人员越多,工作结果就越容易直接比较,也能帮助我们不断提升结果质量。假设有 20 名科学家进行 20 项不同的分析,只要他们能够后续比较分析方法并协同努力,那么最终成果将优于任何单一项目。</p>
<p>在数据科学实践当中,我们必须牢记:与任何其他领域一样,数据科学并非没有缺陷,我们也不应该毫无保留地对其给予信任。因此,负责任的数据科学研究态度,应该是每隔一段时间展示分析结果、尝试找出结果中的谬误、将自己的结果与其他类似工作进行比较,并在展示结果时充分与现实情况进行对比。</p>
<p>正是由于数据科学的一大前提在于人类的判断力,因此我们必须意识到:</p>
<p><strong>人员与沟通技巧至关重要</strong></p>
<p>尽管看起来像是废话(毕竟,有哪个领域能够接受负面的沟通效果呢?),但我每天都在提醒自己,必须要切实有效地向来自各个技术领域的人们传递机器学习知识。单纯了解机器学习术语还远远不够,我们需要能够与拥有不同理解的人们沟通,并告知他们需要知晓的种种细节。</p>
<p>(举个例子,有些朋友非常了解我的工作内容,能跟我进行长时间的机器学习细节讨论;但也有些人认为我是「管电脑的」……)</p>
<p>以我自己为例,机器学习决策并不能替代人工选择(即使有时准确率更高),毕竟最终要由建筑工程师来决定哪些建议值得采纳。事实上,自主建筑运营的全面实现,也许要比无人驾驶汽车更为困难。单纯建立模型、证明模型准确性并将结果提交给客户,当然还远远不够。数据科学家还需要玩转一片混乱的社交互动场景。如果无法说服他人,那么即使开发出了最强大的机器学习模型,它也不可能发挥任何实际作用。</p>
<p>我日常工作中最常规的组成部分,就是面向内部与外部小组通过文章与案例演示来解释分析方法,了解我们的客户如何制定当前决策,并与行业内专家交谈以将知识转化为数据科学系统。大学里肯定不教这些内容,课堂上我们总是认为科学家可以始终高举完美客观的大旗——但现实工作是位好老师,狠狠地击碎了我的幼稚梦想。</p>
<p>即使在解释了计算机如何做出决策之后,客户有时候仍然不愿意采纳,这是因为人类绝不是纯理性的动物。在呈现出客观层面更好的选择时,人们可能出于习惯、不信任、熟悉或者某些误导性信息等理由,而下意识到选择其他选项。</p>
<p>我们不妨以外出兜风例具体聊聊这个问题:人们似乎会出于逻辑角度选择两点之间距离更长的路径。为什么?因为沿途风景更漂亮。天真的数据科学家们当然会推荐模型给出的最短路线,但真正了解客户的数据科学家们会意识到,他们想要旅途中充分享受与大自然的亲密接触。</p>
<p>同样的,有时候客户不愿使用最佳机器学习预测方案,是因为准确性并不是唯一的考量因素。例如,我们预测了建筑工程师开始为建筑物供暖的理想时间点,但不少工程师仍然会更早打开设备,因为他们不希望租户感到温度不适。这当然不合理(我们会按时提出建议,确保在租户抵达室内时将温度提升至正确的水平),但除非能够把人彻底从决策流程中剔除出去,否则需要做出调整的永远只能是计算机系统这一方。</p>
<p>也许除了计算机科学课程之外,我们还可以参加一些社会学课程来了解人类同胞的想法。</p>
<p><strong>使用标准工具,同时放慢新技术的采用速度</strong></p>
<p>我们怎样才能保证算法当中不存在任何错误?首先,从 sklearn 上导入模型,这比自己编写靠谱得多。除非大家是在搞前沿研究,否则真的没什么理由自己动手编写机器学习模型。相反,最好是使用经过广泛测试及使用的公开库提供的函数(我称其为标准工具)来完成任务。</p>
<p>在最近的一条推文中,我提到差劲的数据科学家总爱自主编写算法,而优秀的科学家们则选择从标准库处导入算法。这里面当然有戏谑的成分,但我仍然坚持这样一条原则:相较于自主开发的代码,使用经过广泛测试的开源库中的代码,几乎永远是更加高效可靠的作法。</p>
<p>这种标准工具优先的逻辑不仅适用于机器学习模型。事实上,我们希望对数据集执行的几乎一切操作,都能在 pandas 中找到对应的实现方案(假设您使用 Python),所以不妨优先从这里入手。同样的,与统计、绘图、测试、调度、任务部署以及机器学习流水线内大部分其他操作相关的标准库也所在多有,请善加利用。</p>
<p>我现在这份工作,原本是由两位拥有博士学位的数据科学家负责的。作为学术精英,他们一直渴望发明自己的数据结构、指标、算法、文件加载机制等等(可能是为了证明自己的学位货真价实吧……),但这也带来了一大堆无法理解的混乱代码。我入职后的前六个月,主要工作就是用三个 import 语句替换这些上百行的脚本。现在,我可能非常骄傲地向大家宣布,我已经成为这套机器库出色的负贡献者。</p>
<p> </p>
<img alt=)
免责声明:本网站部 分文章和信息来源于互联网,本网转载出于传递更多信息和学习之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请立即联系管理
员,我们会予以更改或删除相关文章,保证您的权利。对使用本网站信息和服务所引起的后果,本网站不作任何承诺。