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