1. 程式人生 > >分步教程:如何成為一名資料科學家?

分步教程:如何成為一名資料科學家?

"Data Science = statistics who uses python and lives in San Francisco"

恰好我馬上啟程到 Twitter 的 data science team,而且恰巧懂一點點統計和住在舊金山,所以衝動地沒有邀請就厚臉回答了:D

我認為有幾個大方面

1)學好 python。

現在幾乎所以公司的資料都可以 api 給你,而 python 的資料處理能力強大且方便。加之在 machine learning 的很多演算法上,python 也獨俏一方。另外,它的簡明方便迅速迭代開發,15 分鐘寫完個演算法就可以看效果了。

除此之外,py 還有點酷酷的感覺。任何程式拿 matlab 和 c++ 都是可以寫的,不過我真沒認識過哪個 d 願意自己把自己扔那個不酷的框框裡:D

對不規則輸入的處理也給 python 一個巨大的優勢。通常來說,在我現在日常的工作裡,所有的資料都是以純文字但是非格式的形式儲存的(raw text, unstructured data)。問題在於,這些文字不可以直接當作各種演算法的輸入,你需要

  1. 分詞,分句
  2. 提取特徵
  3. 整理缺失資料
  4. 除掉異類(outlier)

在這些時候,python 可謂是神器。這裡做的 1-4 都可以直接在 scikit-learn 裡面找到對應的工具,而且,即使是要自己寫一個定製的演算法處理某些特殊需求,也就是一百行程式碼的事情。

簡而言之,對於資料科學麵臨的挑戰,python 可以讓你短平快地解決手中的問題,而不是擔心太多實現細節。

2)學好統計學習

略拗口。統計學習的概念就是“統計機器學習方法”。

統計和電腦科學前幾十年互相平行著,互相造出了對方造出的一系列工具,演算法。但是直到最近人們開始注意到,電腦科學家所謂的機器學習其實就是統計裡面的 prediction 而已。因此這兩個學科又開始重新融合。

為什麼統計學習很重要?

因為,純粹的機器學習講究演算法預測能力和實現,但是統計一直就強調“可解釋性”。比如說,針對今天微博股票發行就上升 20%,你把你的兩個預測股票上漲還是下跌的 model 套在新浪的例子上,然後給你的上司看。

Model-1 有 99%的預測能力,也就是 99%的情況下它預測對,但是 Model-2 有 95%,不過它有例外的一個附加屬性——可以告訴你為什麼這個股票上漲或者下跌。

試問,你的上司會先哪個?問問你自己會選哪個?

顯然是後者。因為前者雖然有很強的預測力(機器學習),但是沒有解釋能力(統計解釋)。

而作為一個數據科學家,80%的時間你是需要跟客戶,團隊或者上司解釋為什麼 A 可行 B 不可行。如果你告訴他們,“我現在的神經網路就是能有那麼好的預測力可是我根本就沒法解釋上來”,那麼,沒有人會願意相信你。

具體一些,怎麼樣學習統計學習?

  • 先學好基本的概率學。如果大學裡的還給老師了(跟我一樣),那麼可以從 MIT 的概率論教材【1】入手。從第 1 章到第 9 章看完並做完所有的習題。(p.s.面試 Twitter 的時候被問到一個拿球后驗概率的問題,從這本書上抓來的)。
  • 瞭解基本的統計檢驗及它們的假設,什麼時候可以用到它們。
  • 快速瞭解統計學習有哪些術語,用來做什麼目的,讀這本【5】。
  • 學習基本的統計思想。有 frequentist 的統計,也有 bayesian 的統計。前者的代表作有【2】,後者看【3】。前者是統計學習的聖書,偏 frequentist,後者是 pattern recognition 的聖書,幾乎從純 bayesian 的角度來講。注意,【2】有免費版,作者把它全放在了網上。而且有一個簡易版,如果感覺力不從心直接看【2】,那麼可以先從它的簡易版開始看。簡易版【4】是作者在 coursera 上開課用的大眾教材,簡單不少(不過仍然有很多閃光點,通俗易懂)。對於【3】,一開始很難直接啃下來,但是啃下來會受益匪淺。

注意,以上的書搜一下幾乎全可以在網上搜到別人傳的 pdf。有條件的同學可以買一下紙製版來讀,體驗更好並且可以支援一下作者。所有的書我都買了紙製版,但是我知道在國內要買本書有多不方便(以及原版書多貴)。

讀完以上的書是個長期過程。但是大概讀了一遍之後,我個人覺得是非常值得的。如果你只是知道怎麼用一些軟體包,那麼你一定成不了一個合格的 data scientist。因為只要問題稍加變化,你就不知道怎麼解決了。

如果你感覺自己是一個二吊子資料科學家(我也是)那麼問一下下面幾個問題,如果有 2 個答不上來,那麼你就跟我一樣,真的還是二吊子而已,繼續學習吧。

  • 為什麼在神經網路裡面 feature 需要 standardize 而不是直接扔進去
  • 對 Random Forest 需要做 Cross-Validatation 來避免 overfitting 嗎?
  • 用 naive-bayesian 來做 bagging,是不是一個不好的選擇?為什麼?
  • 在用 ensembe 方法的時候,特別是 Gradient Boosting Tree 的時候,我需要把樹的結構變得更復雜(high variance, low bias)還是更簡單(low variance, high bias)呢?為什麼?

如果你剛開始入門,沒有關係,回答不出來這些問題很正常。如果你是一個二吊子,體會一下,為什麼你跟一流的 data scientist 還有些差距——因為你不瞭解每個演算法是怎麼工作,當你想要把你的問題用那個演算法解決的時候,面對無數的細節,你就無從下手了。

說個題外話,我很欣賞一個叫 Jiro 的壽司店,它的店長在(東京?)一個最不起眼的地鐵站開了一家全世界最貴的餐館,預訂要提前 3 個月。怎麼做到的?70 年如一日練習如何做壽司。70 年!除了喪娶之外的假期,店長每天必到,8 個小時工作以外繼續練習壽司做法。

其實學資料科學也一樣,沉下心來,練習匠藝。

3)學習資料處理

這一步不必獨立於 2)來進行。顯然,你在讀這些書的時候會開始碰到各種演算法,而且這裡的書裡也會提到各種資料。但是這個年代最不值錢的就是資料了(拜託,為什麼還要用 80 年代的“加州房價資料”?),值錢的是資料分析過後提供給決策的價值。那麼與其糾結在這麼悲劇的 80 年代資料集上,為什麼不自己蒐集一些呢?

  • 開始寫一個小程式,用 API 爬下 Twitter 上隨機的 tweets(或者 weibo 吧。。。)
  • 對這些 tweets 的 text 進行分詞,處理噪音(比如廣告)
  • 用一些現成的 label 作為 label,比如 tweet 裡會有這條 tweet 被轉發了幾次
  • 嘗試寫一個演算法,來預測 tweet 會被轉發幾次
  • 在未見的資料集上進行測試

如上的過程不是一日之功,尤其剛剛開始入門的時候。慢慢來,耐心大於進度。

4)變成全能工程師(full stack engineer)

在公司環境下,作為一個新入職的新手,你不可能有優待讓你在需要寫一個數據視覺化的時候,找到一個同事來給你做。需要寫把資料存到資料庫的時候,找另一個同事來給你做。

況且即使你有這個條件,這樣頻繁切換上下文會浪費更多時間。比如你讓同事早上給你塞一下資料到資料庫,但是下午他才給你做好。或者你需要很長時間給他解釋,邏輯是什麼,存的方式是什麼。

最好的變法,是把你自己武裝成一個全能工作師。你不需要成為各方面的專家,但是你一定需要各方面都瞭解一點,查一下文件可以上手就用。

  • 會使用 NoSQL。尤其是 MongoDB
  • 學會基本的 visualization,會用基礎的 html 和 javascript,知道 d3【6】這個視覺化庫,以及 highchart【7】
  • 學習基本的演算法和演算法分析,知道如何分析演算法複雜度。平均複雜度,最壞複雜度。每次寫完一個程式,自己預計需要的時間(用演算法分析來預測)。推薦普林斯頓的演算法課【8】(注意,可以從演算法 1 開始,它有兩個版本)
  • 寫一個基礎的伺服器,用 flask【9】的基本模板寫一個可以讓你做視覺化分析的 backbone。
  • 學習使用一個順手的 IDE,VIM, pycharm 都可以。

4)讀,讀,讀!

除了閉門造車,你還需要知道其它資料科學家在做些啥。湧現的各種新的技術,新的想法和新的人,你都需要跟他們交流,擴大知識面,以便更好應對新的工作挑戰。

通常,非常厲害的資料科學家都會把自己的 blog 放到網上供大家參觀膜拜。我推薦一些我常看的。另外,學術圈裡也有很多厲害的資料科學家,不必怕看論文,看了幾篇之後,你就會覺得:哈!我也能想到這個!

讀 blog 的一個好處是,如果你跟他們交流甚歡,甚至於你可以從他們那裡要一個實習來做!

betaworks 首席資料科學家,Gilad Lotan 的部落格,我從他這裡要的 intern :D Gilad Lotan

Hilary Mason,bitly 首席科學家,紐約地區人盡皆知的資料科學家:hilarymason.com

在它們這裡看夠了之後,你會發現還有很多值得看的 blog(他們會在文章裡面引用其它文章的內容),這樣滾雪球似的,你可以有夠多的東西早上上班的路上讀了:)

5)要不要上個研究生課程?

先說我上的網路課程:

前者就不說了,人人都知道。後者我則更喜歡,因為教得更廣闊,上課的教授也是世界一流的機器學習學者,而且經常會有一些很妙的點出來,促進思考。

對於是不是非要去上個研究生(尤其要不要到美國上),我覺得不是特別有必要。如果你收到了幾個著名大學資料科學方向的錄取,那開開心心地來,你會學到不少東西。但是如果沒有的話,也不必糾結。我曾有幸上過或者旁聽過美國這裡一些頂級名校的課程,我感覺它的作用仍然是把你領進門,以及給你一個能跟世界上最聰明的人一個交流機會(我指那些教授)。除此之外,修行都是回家在寢室進行的。然而現在世界上最好的課程都擺在你的面前,為什麼還要捨近求遠呢。

總結一下吧

我很幸運地跟一些最好的資料科學家交流共事過,從他們的經歷看和做事風格來看,真正的共性是

他們都很聰明——你也可以

他們都很喜歡自己做的東西——如果你不喜歡應該也不會看這個問題

他們都很能靜下心來學東西——如果足夠努力你也可以

【2】Hastie, Trevor, et al. The elements of statistical learning. Vol. 2. No. 1. New York: Springer, 2009. 免費版

【3】Bishop, Christopher M. Pattern recognition and machine learning. Vol. 1. New York: springer, 2006.

【5】Wasserman, Larry. All of statistics: a concise course in statistical inference. Springer, 2004.