看板 Soft_Job 關於我們 聯絡資訊
<< 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有關,但仍需要思考如何進行,如果對這個活動有興 趣的朋友歡迎隨時站內信,我們能透過其他方式先聊聊現有想法。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 81.250.134.182 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1547504507.A.8E1.html
johnnyjana: 推 好文 01/15 07:01
loveu8: 推~ 01/15 07:04
mozzan: 強 01/15 07:13
plsmaop: 台灣的row是列喔,中國的row才是行,剛好相反 01/15 07:14
謝謝揪錯,已經更正!這個中文我真的經常弄反
ss5566sa: 推! 01/15 08:10
doranako: 推分享 01/15 08:17
kokolotl: 推 01/15 08:51
xcraft: 好文必推! 01/15 09:08
kingofage111: 推 01/15 09:11
yp1369: 感謝! 01/15 09:31
pigpig1226: 好文淚推 01/15 09:38
ian90911: 感謝分享 推 01/15 09:49
vvind: 很棒的分享! 01/15 11:34
fg008kimo: 推推 01/15 12:21
allnun: 推! 01/15 12:22
rockman037: 謝謝分享與建議 01/15 12:51
lay911225: 寫得好棒啊!!! 01/15 12:55
DCTmaybe: 感謝分享! 01/15 13:35
isolaXCC: 推 01/15 13:36
E33258: 推 01/15 13:54
Transfat: 感謝分享 01/15 13:58
Luluemiko: 推 01/15 14:15
kyrie77: 推 01/15 14:59
bowin: 補充討論一下:在國外許多公司的ML Engineer不是更偏向ML 01/15 15:15
bowin: 而是更偏向Engineer喔,然後各公司的DS定義是比較廣 01/15 15:16
bowin: 但其實還是定位在ML algorithm/engineering比重較高 01/15 15:18
bowin: 分析比重較高的有些公司的職稱是Product Analyst 01/15 15:19
bowin: 總結來說DS對ML/Stat Inference這兩個領域著墨較多 01/15 15:30
同意!謝謝補充,文中已做些微調整,但會保持我的原意 而確實這挺看公司的,我個人就是個全包的概念...
bowin: 推分享 01/15 16:16
NAVA: 感謝分享~ 01/15 16:57
Dartmoor: 好詳細,感謝分享,學到很多 01/15 17:07
boy955403: 感謝分享!! 01/15 17:26
fayhong: 大推! 01/15 18:10
fate111085: 優文推 01/15 19:44
LERICAL: 推 01/15 19:48
mago: ML跟data science不相同是可以理解,但覺得現今最可怕的是很 01/15 20:17
mago: 多自稱data scientist,其實並不具有Math跟CS solid 知識 01/15 20:17
這部分我覺得倒不如去疑問何以這麼多公司開始用"Data Scientist"去包裝這麼多工作 以至於有像mago你說的這種現象。否則基礎好與不好,不就是我們為什麼需要面試的原 因嗎?
prag222: 太高端了,人的命運各自不同 聰明才慧各不同 01/15 20:21
prag222: 有時候也不一定要跟人擠這窄門 01/15 20:21
prag222: 跟SEO不熟 不過早些年前不是流行 直接買競爭對手關鍵字 01/15 20:24
prag222: 然後出現自家的廣告....XD 01/15 20:25
VisualStudio: 推 01/15 22:00
deniel367: 感謝分享!這篇絕對是我有生以來看過最完整介紹資料科 01/15 22:35
deniel367: 學的文章,超廣度兼具深度。一堆人說要做資料科學只會 01/15 22:35
deniel367: 喊Kaggle, ML 就沒惹 01/15 22:35
abc53: 推 01/16 00:00
lillianyo: 推 01/16 01:38
謝謝大家的回饋,很開心能多少幫助到大家一些 如果有任何想私下詢問的問題,煩請直接使用站內信詢問 不然時差8小時很難即時的用訊息一來一往 但想提醒的是,我真的沒有算命這個技能 可能無法回答一些真的不著邊際的問題,還請見諒
vn509942: 感謝分享 01/16 08:48
darkch: 深度文! 值得收藏 01/16 09:02
wavek: 推 01/16 09:18
gmoz: 好文~ 想知道你們怎麼跟RD協同合作的 例如INPUT什麼OUTPUT 01/16 10:47
gmoz: 什麼 01/16 10:47
gmoz: 我指的是Data Team以外的RD~ 01/16 10:48
你好,請問你指的RD是指像是Backend Developers嗎? 但無論如何,這是個好問題 基本上這是利用組織架構設計的方式來幫助我們互動 然而在PTT上用文字很難清楚又簡單的解釋 這也是我想辦MeetUp的原因之一 我很希望也能知道現在台灣的公司有沒有新的模式來幫助Tech的人們互動 想藉此機會定期交流
showlinshow: 推推好文 01/16 11:14
PHEj: 推 01/16 17:24
aloha111: 推! 01/16 21:04
Hodge: 推推 01/17 02:49
joy0520: 推,在台北的話想參加看看 01/17 15:51
clap: 大推!有meetup希望可以參加,也很不熟跟前後端合作QQ 01/18 00:29
dark104: 謝謝分享! 01/18 08:15
hungurlea: 推仔細!!!!!感謝分享 01/18 15:20
kevin015015: 認真文推 01/18 18:34
qwe85158: 期待meetup 01/19 00:41
s865795: 推這篇 對這個meetup有興趣 01/19 10:36
kate2008: 推 01/20 01:03
Meetup的資訊會先在架構比較確認後儘快與大家分享訊息的, 謝謝回饋 ※ 編輯: benson415 (81.250.134.182), 01/21/2019 01:27:18
jasmine14: 中肯 01/26 20:41