Re: [心得] 资料科学工作 / 技术交流Meetup Part.2

楼主: benson415 (沛行)   2019-01-15 06:21:44
<< edit:本文同步刊载在Medium,随个人喜好可至网页版阅读:https://goo.gl/XYjC4D
【前言】
本文主要内容为Data Science相关,并涉及大量个人经验和观察;这是做Data约莫五年
多的小心得,而这些经验来自电商、零售或平台服务,并没有纯R&D的经验。希望带
你走过一趟能让你身历其境;我也会用整篇文章尝试去回答“我这样准备够了没?”这个
经典问题,也欢迎各位版友分享自身经验或看法。内文将从心理素质和学历及技术背景来
讨论这个行业。另外,有个小假设,如果是前文已提及的事情,我会以大家都知道这些事
情的前提下继续讨论,恕我不重复自己 (DRY)。
上篇回文提到“最近爬文内建主题过滤器,一堆标题直接略过”,以SEO的角度来思考,
我的标题可能下的有点差;但本着随缘分享的心情,这篇我就维持原标题了,让有兴趣的
人自己看到即可。
【 约5400字,平均阅读时间13分钟 】
本文为第二部分,文章主要面向想入行或是对Data工作感到好奇的版友。
有兴趣的版友可以随自己喜好随意看看。
- 心理素质
首先,先不论你对Data Science的想像是什么,Data Team,特别是Data Scientists,绝
不是个奇怪的数学社团。在这里每个专案都有他自己的目标函数(Objective function),
这并不只是数学上,也包含到底能带来多少商业价值。躲在角落动动笔和脑、写写Code、
发现或使用Model,大概只有30%的重要性是在做这个吧。我想说的也不是你常看到的
Data creation及Data clean,他们的确是占了很大时间及重要性,我稍后会回到这个主
题。
做Data的思维应该要像是做科学般的严谨,又要有商业上的弹性,他跟工程师没两样,没
比较高尚也没那么特别,我们都在“发现问题”和“解决问题”。在理论与现实间如何搭
桥,数学、Domain Knowledge和Coding就是解决问题的手段。然而“发现问题”才是我们
的大挑战,这其中包括了:我们如何将日常语言定义为严谨问题、是否能合理的做基础假
设而不导向失真、又或者是如何定义才能帮助你完成目标...等等,毕竟很多事情并非那
么直观。我很喜欢一个在学习高微时助教举的著名例子:错误的假设能让你“证明 0 > 1
”。这种反直觉非常的自然,你也许觉得没什么困难去察觉,但当我们透过复杂的Model
、数千万笔的资料加上千行的Code产出了结果,试问我们还可以允许多少错误假设?而又
能多自然的发现结果是违反直观的?那些明显如 0 > 1都是非常严重的错误,我们才会这
么容易发现。而练习Kaggle是好的,但要记得是这里的问题和Features完全都被定义好了
,甚至连评分的Objective Function都已经给了我们。Kaggle常被同事们当作消遣或是练
习新技术的地方,因为通常无需动太多脑筋。
因此,如果只是喜欢这种发现与解决问题的过程,那完全不需要执著于Data Science,这
世界上有太多工作是这个样子的。另外,如果你的工作环境像在GAFA里的一些部门允许你
做纯R&D,不用步步都考量附加价值或成本,只能说那真的太幸福了。
接着讨论Pipeline,经常一提到Data Science便会强调Data creating、wrangling和
cleaning三个过程占绝大多数的时间,但其实还有很多重要的事;这是绝大部分想要跨行
(非资讯领域)者会有的盲点:工作不是打Kaggle,他无法带给我们的是理解实际工作的
Pipeline。进入Production后,如何移交(deliver)你的结果?运算出的结果还打算用csv
来传递?要产出新预测的时候还去terminal打上make prediction或是python model.py?
也许高阶一些,那么除了cron job之外,是否有其他解法去监测每个步骤是否执行成功?
能否让步骤间有相依性?如何确定你的code有容错能力(Try Catch)?你有Logging?你有
做Functional test或你会写Test?化约来说,就是些Design pattern或CI/CD的问题,我
想这一连串的问题有些恼人,也许你现在不知道怎么做,但我们都必须知道有这些问题,
甚至在未来学会怎么做;因为你想成为一个Scientist,这些都像是实验流程的一部分。
这也是为什么当我们觉得自己已经准备到一个程度了,为什么还是没公司愿意给机会?或
是不知道自己一直无止境的上DS/ML相关课程,但到底何时能准备好?我个人认为这是视
野(vision)上的问题;你能把细节思考的多周全、做得多完美,给了你是否有自信作为一
个“独立的”Data Scientist。
再来是对Data Team各个Function的理解,同时也将解释为何说“Data Science不等于
Machine Learning”。严谨来说,Data Scientist、Data Engineer、Machine Learning
Engineer为三个不同的工作,即便都有重叠,但主要的工作内容有极大不同。然而网络上
已有太多详细资料介绍,这边我只做提醒不深谈,接下来我只会针对Data Scientist和
Machine Learning Engineer“消歧义”。另避免争议,每间公司在写Job Description
(JD) 时当然可以有不同要求,这边我想讨论的是原始定义。
相信大家都有看过一个描绘Data Science的文氏图,Data Scientist可以是个Software
Engineer在算法部分的特化,也可以是一个新潮的经济、统计学家,他随者时间的演变被
赋予不同的名称,但在本质上都分享著一些明显的继承。而当中Machine learning是另一
个解决问题的手段,而非唯一;举个例子,某些推荐系统问题我偏好用图论来做,最后再
用ML做优化,原因是无论DFS、BFS...等相较古老却是基石般的算法,在效率或资源的优
化都有一定的保障,而只要明白原理就能将之变形成一个ML能优化的问题;如果当有人看
到一间公司开出Data Scientist职缺,在他快速浏览后,立刻心生鄙视,想着:呿,这工
作连个明确的ML问题都没有,这也叫Data Scientist?但也许其实是他不懂Data Science

接着是Machine Learning Engineer,据我了解台湾目前不多公司有这样的职称,即便国
外也不是所有公司都有明显的分垒,这也是做Data和一些想做Data的人的痛。ML
Engineer比起Data Scientist,他就更专精在model上,从发现或实作高深的Model本身或
是在进入Production之后的各种问题如Model的Delivery等等。ML Engineer的定义可能就
比较接近部分群众对Data Scientist的想像,但事实上这个职位吃的数学又多上更多;有
时是一些线上课程给的错觉,导致有些人对Data Scientist的想像仅止于ML;多一点可能
还会把Data Analyst、Data Engineer的概念也加进去些。此外,另一个混淆人的原因是有
些Data Scientist的JD中,填充了许多Machine Learning的漂亮话,导致人们看到的
Data Scientist好像只要做ML就好了。
最后的Take Away:Data Science不等于Machine Learning;而想换工作时,先想想到底
对Data有热情还是只是想玩玩ML。我们有时会在Job Affair戏弄一些看起来目标就很不明
确的人,会问说“哎呀,可能Data Scientist不缺了,但我们缺个Machine Learning
Engineer (Data Engineer),你觉得如何?”,这些心志不定的求职者通常都会说他有兴
趣、他能做,但我们都知道他没有真的理解他将面对的是什么。
- 学经历背景、技术要求
那么到底什么样背景的人可以做这行呢?没有限制,限制的是我们手上的技能有什么?是
否有发现及解决问题的能力?毕竟同一个问题可以有很多种方式去解,这也是为何(前)同
事们,有应用物理博、天文物理博、语言博、理工硕、经统数硕、资讯硕...背景百百种
。至于哪些技能是必须的,这个网络上都有清单,这边只想提醒几个我觉得最重要的,给
非资讯出生或是觉得做DS一定要有个博的版友:
1. 学会读Documentation、Source Code,善用Google和Stack Overflow(当然是英文)
2. Python
3. SQL 及 Database原理
4. Linux 及 基本网络、网站架构
5. 资料结构、算法及Machine Learning知识
6. AWS / Google服务
7. 学习做概念验证 (Proof of Concept, POC)、看和做Benchmark
-. Kaggle、Mini Project
以上除了1, 2之外,重要性不分轩轾,数字只是想帮忙在时间有限的情形下知道先掌握哪
些。
Python,它很好用,但绝对没有我们想的那么简单。“魔鬼藏在细节里”用来形容Python
应该非常合适,它可能乱写都跑的起来,等到结果真的出现细微的错误又被我们发现
时,真正的问题点可能想找还找不到,毕竟不是所有人都接触过底层的语言。因此,和
Python相处,真的是要持续地学习和深入了解它。其他像是Profiling、Multiprocessing
或是Parallelization等等,其他文章可能都讨论过,特别那些“我觉得不重要,但别人文
章总是会提到的东西”还是留点心,至少加入待读清单吧。
然而不仅仅是Python,还要熟悉SQL和Database,新手时常想忽略他,觉得没什么用。这
里说的Database是指像在内存优化的Server上,而非在练习SQL的笔电或是t2 micro
instance中。很多时候我们真的不会想让个巨大的DataFrame在instance或local端花个十
分钟做preprocessing,又或者如果资料不是只使用一次,如何先将资料处理好存进Data
Warehouse方便下次使用?这时如果我们熟悉一种以上的工具,那就知道如何怎么操作才
最有效率,所谓效率除了运算资源外,也包含你的时间、同事的时间还有你是否会crush
自己或同事的运算。
举例来说,在给定一定资料量的情况下,用Pandas把一个Column包含list的DataFrame全
部展开可能要用个数行(可能还加上些看不到的for loop)再加上短则以分钟为单位的时间
;但如果熟悉SQL的话,可能很快就想到用cross apply只要两个select就可完成,又或是
在Big Query或Snowflake环境中,可能用LATERAL FLATTEN来处理就是个好选择,而处理
的时间可能是秒为单位;在这样的情况下,我们就会选择先在Server端处理好,再写入资
料库(或读取)。因为即使真的需要使用包含list的DataFrame,也只需要一行groupby加上
unique,pandas很快就会帮忙处理好了。
很常时候这些wrangling并不是一次性的,更可能你生产(populate)出的资料也不是你一
个人要用,那么做这些评估就是理所当然的了。小时候真的是铁齿觉得pandas可以做的事
,干嘛还要学SQL或了解Database的原理呢?但当越来越熟练后会发现,即使什么都
vectorization去解决,也突破不了local硬件的极限,虽然形容的有点夸张,但概念大
致如此。再举一个关于Database的例子,一般的RDB是用列来写资料的,如果用python
connector加pandas可以很写意的储存资料;然而像是那些write by column的数据库,如
果不明白其背后的原理还用insert by row的方式去写资料,那可能真的等到天荒地老。
再来是Linux、网络等相关知识,这部分除了像是爬虫、API之类的应用外,还有个心酸的
原因;说真的Data Scientist是个很奇妙的存在,Backend Developer不会当你是个
Developer,而是弄些奇怪数学的人;公司其他非技术的部门的同事却都把你当Developer
,因为对他们来说反正搞不懂的都是程式和逻辑。而很多时候各种环境都需要你自己快速
的架设,除非公司有分配Data Team专用的Backend Dev和DevOps。否则当你的需求是因为
R&D而产生的,比起公司其他有产值的东西,RD的Priority很容易被排到最后。需要
NoSQL DB去纪录每一个预测用的参数和结果?想要用开源的Dashboard,又需要url分享给
其他部门看?通通自己架。而这也是为什么需要学会读Documentation和Google,你很少
听到资讯背景的人在抱怨这些,因为他们都很习惯一边看说明书,一边去摸索新玩具;这
也是为什么有些公司开DS缺都会先要资讯背景,因为本科就是省事又好用。
接着是资料结构、算法和ML的知识。好的资料结构才能让 (ML) 算法跑得好跑得快;
而且如果不明白资料结构,你做profiling也只是瞎忙而已,这些背景知识都可以帮助你
解决问题或加速解决问题。选择好的Machine Learning算法亦是;例如,由于Kaggle的关
系,现在人人起手便是Xgboost,但如果没有去理解bagging和boosting的差别,有没有可
能你错过什么更轻便的算法或是让你一直往overfitting去了呢?
AWS / Google的各种运算服务多的无法枚举,而要学的原因和重要性我也不多说了。
学会做 POC 和Benchmark也非常重要,也很少有人在讲Data Science时提起。然而就像我
们会想拿Data去打脸某些人事物一样,在决定一个Solution前如果不做POC,不看已经有
的Benchmark,那我们和那些凭感觉做事的也没差别,怎么好意思说自己做Data呢?因此
千万不要铁齿,这个待定的Solution可以是算法、开源软件或Package,或是选择外部服
务如数据库,或是选AWS还是Google。
最后才会是Kaggle或是mini project。做这些很重要,但要怎么去做?是否知道如何呈现
?反而才是重要的。要做的原因很简单:就是把手弄脏(Get your hands dirty),这不需
多做解释。然而,开始弄脏手后可能掉进的误区就是想冲高排名。在面试时,若面试者告
诉我他学到什么,我绝对会专注的听,因为也许能学到些什么,更重要的是我可能会因此
找到一个有想法的好伙伴;然而,如果他自顾自的说他的Model多厉害、预测都是多精确
bla bla bla,我可能30秒后就会恍神或是失去耐心;原因是这些排名或嘴巴说的数字完
全无法反应真实,人人都可以去复制贴上个Kernel取得好成绩。因此,Kernel和讨论版要
看、多学,复制Kernel只是重制看别人Model效果如何,但要对自己诚实,那不是真的是
你的东西。
Mini project同理,现在太多书籍或网络资源在做同样的东西,重要的同样是你学到什么
,如果只是说用过Tensorflow、keras做做MNIST等projects,那面试官看手上论文的
State of Art可能就够了。除非你自己刻了一个Attention Layer去解决你的问题,或是
实作了Transformer等新东西去解决老问题,否则老调真的很难引起注意;这些都只是例
子,ML或DL的技术每个月都推陈出新,就看你多有心去理解这些新理论或应用了。
而到底是要继续学新东西还是先把旧工具用熟?这个困境就很像Reinforcement Learning
中的Exploration-Exploitation Dilemma,但无论如何都不要把自己限制在非Machine
Learning算法不学;技能树的广度发展也要合理,否则面试官一下就认定你是在凑字数的
,那得不偿失。回想那个文氏图和那些可能看过的JD对技能的要求,单纯要成为一个
Data Scientist可能更偏向广度,而要成为“好的”Data Scientist差别则在于深度,那
些你特别之处造就你成为更好的。所以如果基本功优先点选,等到你开始觉得自己到达瓶
颈时,开始往广度发展,回头看看自己的盲点和缺陷,反复这个过程就先让你成为一个“
好的”OOO了。具体例子来说,如果你是唸资讯的,先Maximize你本科系的能力,再准备
开始往外点;即便你无法成为一个典型的“Data Scientist”,你也具备能力做一个好的
Software Engineer,或许你还能特别往算法或Text发展,那也是一种Data Science不是
吗?而对于其他科系,Coding在你选择想走这条路时早已经是必备,别只是想着“跟同学
比起来我会coding啊”,那些人可能根本也没想和你在同一个pool,你的对手反而在外面
;因此本科那栏请自动补上coding和资讯相关的基础,其余的都可以参考那些网络上的清
单或是文中的小建议;勇敢面对现实,但也不需妄自菲薄。
- 除此之外
培养嗜好是恢复创造力的一大帮助,如何在忙碌的日子中达到work-life balance是无论
在世界哪个地方工作都要面临的功课。最后身体健康很重要,这大家都知道,但怎么做和
如何做适合自己,那需要自己调适安排。我对CodeTengu很久以前的标题很有印象,大概
是说“如果做不出来的时候,资深工程师知道什么时候该站起来走走,而更资深的知道何
时该跑”。做DS和其他Function很像,很容易陷入停不下来的漩涡,无论是热情还是
Debug或是Debug的热情在驱使着你。
有兴趣入行的你,综上所述请先想好
1. Data Science对你而言是什么?你为何爱Data的工作?
2. 如何规划未来?你是学生,还是已经在工作了?该如何继续学习以达成目标?
3. 到底想在什么样的产业中工作,是纯DS (或ML或AI)?还是电商或其他有商品的产业?
4. 你的环境有这个工作吗?没有的话,是要自己创造、转换环境还是退一步?
5. 是否愿意花时间学好老技能:英文。
另外,如果你想跟我说:啊,这里是台湾啊!
我明白也完全理解
但这句话不应该让你允许自己直接忽略那些更重要的事实:变强和改变环境(无论是就业
环境、政治...)
也许我说的轻描淡写,但这些都不是纯粹的理想
而未来都在我们手上,该如何改变环境或自身,决定在我们而已。
衷心希望这篇文章的某些小想法能带给你一些启发,文章或多或少也有可争议之处,欢迎
批评指教
谢谢阅读,第三部分将会是与Meetup有关,但仍需要思考如何进行,如果对这个活动有兴
趣的朋友欢迎随时站内信,我们能透过其他方式先聊聊现有想法。
作者: johnnyjana (DJY)   2019-01-15 07:01:00
推 好文
作者: loveu8 (RA1-推广)   2019-01-15 07:04:00
推~
作者: mozzan (mozzan)   2019-01-15 07:13:00
作者: plsmaop (plsmaop)   2019-01-15 07:14:00
台湾的row是列喔,中国的row才是行,刚好相反
作者: ss5566sa (sa)   2019-01-15 08:10:00
推!
作者: doranako (真爱无限)   2019-01-15 08:17:00
推分享
作者: kokolotl (nooooooooooo)   2019-01-15 08:51:00
作者: xcraft (craft)   2019-01-15 09:08:00
好文必推!
作者: kingofage111 (鸵鸟)   2019-01-15 09:11:00
作者: yp1369   2019-01-15 09:31:00
感谢!
作者: pigpig1226 (林老师)   2019-01-15 09:38:00
好文泪推
作者: ian90911 (xopowo)   2019-01-15 09:49:00
感谢分享 推
作者: vvind (wind)   2019-01-15 11:34:00
很棒的分享!
作者: fg008kimo (大安海瑟威)   2019-01-15 12:21:00
推推
作者: allnun (阿牛)   2019-01-15 12:22:00
推!
作者: rockman037   2019-01-15 12:51:00
谢谢分享与建议
作者: lay911225 (蓝调人生。)   2019-01-15 12:55:00
写得好棒啊!!!
作者: DCTmaybe (竹竹人)   2019-01-15 13:35:00
感谢分享!
作者: isolaXCC (isolaXCC)   2019-01-15 13:36:00
作者: E33258 (E33258)   2019-01-15 13:54:00
作者: Transfat (Transfat)   2019-01-15 13:58:00
感谢分享
作者: Luluemiko (露露)   2019-01-15 14:15:00
作者: kyrie77 (NTU KI)   2019-01-15 14:59:00
作者: bowin (尽其在我)   2019-01-15 15:15:00
补充讨论一下:在国外许多公司的ML Engineer不是更偏向ML而是更偏向Engineer喔,然后各公司的DS定义是比较广但其实还是定位在ML algorithm/engineering比重较高分析比重较高的有些公司的职称是Product Analyst总结来说DS对ML/Stat Inference这两个领域着墨较多推分享
作者: NAVA (BYEs)   2019-01-15 16:57:00
感谢分享~
作者: Dartmoor (纵谷的春天)   2019-01-15 17:07:00
好详细,感谢分享,学到很多
作者: boy955403 (~夹脚拖男孩~)   2019-01-15 17:26:00
感谢分享!!
作者: fayhong (恰似飞鸿踏雪泥)   2019-01-15 18:10:00
大推!
作者: fate111085 (学店鲁肥宅)   2019-01-15 19:44:00
优文推
作者: LERICAL (统二布丁)   2019-01-15 19:48:00
作者: mago (mago)   2019-01-15 20:17:00
ML跟data science不相同是可以理解,但觉得现今最可怕的是很多自称data scientist,其实并不具有Math跟CS solid 知识
作者: prag222 (prag)   2019-01-15 20:21:00
太高端了,人的命运各自不同 聪明才慧各不同有时候也不一定要跟人挤这窄门跟SEO不熟 不过早些年前不是流行 直接买竞争对手关键字然后出现自家的广告....XD
作者: VisualStudio (2015)   2019-01-15 22:00:00
作者: deniel367 (dann)   2019-01-15 22:35:00
感谢分享!这篇绝对是我有生以来看过最完整介绍资料科学的文章,超广度兼具深度。一堆人说要做资料科学只会喊Kaggle, ML 就没惹
作者: abc53 (abc)   2019-01-16 00:00:00
作者: lillianyo (莉莉安)   2019-01-16 01:38:00
作者: vn509942 (如履薄冰)   2019-01-16 08:48:00
感谢分享
作者: darkch (chang)   2019-01-16 09:02:00
深度文! 值得收藏
作者: wavek (狗猫猫 m(OvO)m)   2019-01-16 09:18:00
作者: gmoz ( This can't do that. )   2019-01-16 10:47:00
好文~ 想知道你们怎么跟RD协同合作的 例如INPUT什么OUTPUT什么我指的是Data Team以外的RD~
作者: showlinshow (showlinlin)   2019-01-16 11:14:00
推推好文
作者: PHEj (Vino)   2019-01-16 17:24:00
作者: aloha111 (科科)   2019-01-16 21:04:00
推!
作者: Hodge (Data scientist)   2019-01-17 02:49:00
推推
作者: joy0520 (Joy)   2019-01-17 15:51:00
推,在台北的话想参加看看
作者: clap   2019-01-18 00:29:00
大推!有meetup希望可以参加,也很不熟跟前后端合作QQ
作者: dark104 (GB)   2019-01-18 08:15:00
谢谢分享!
作者: hungurlea (嗨)   2019-01-18 15:20:00
推仔细!!!!!感谢分享
作者: kevin015015 (Rockefeller)   2019-01-18 18:34:00
认真文推
作者: qwe85158 (xine)   2019-01-19 00:41:00
期待meetup
作者: s865795 (jack)   2019-01-19 10:36:00
推这篇 对这个meetup有兴趣
作者: kate2008 (红豆柳丁~慢!!)   2019-01-20 01:03:00
作者: jasmine14   2019-01-26 20:41:00
中肯

Links booklink

Contact Us: admin [ a t ] ucptt.com