引子
2015年6月17日是我在twitter工作兩周年的紀念日。回想起來,兩年間,資料科學在twitter的應用方式和範圍發生了很大變化:
許多twitter的非機器學習主導的核心産品中,機器學習的比重正在不斷增加(例如“while you were away” 功能——twitter把你下線時可能錯過的頭條推文推送到你的個人首頁)。
工具的智能化上,pig已經過時了,現在的資料流水線都是用scalding(建立在串聯之上的scala領域特定語言,便于較長的描述hadoop mapreduce任務——譯者注)編譯的。
組織結構上,資料科學家和産品經理、工程師的工作環環相嵌,合作之密切史無前例。
以上隻是衆多改變中的一小部分。拿我來說,我的研究領域最近從growth延伸到pie (product産品, instrumentation實施, and experimentation實驗) ,工作是研究twitter自家開始的a/b測試平台上的統計學方法。
在twitter工作真的很刺激。在這裡,我能直接觀察學習一個大型科技公司是如何使用資料與資料科學來創造競争優勢的。
與此同時,人們對于資料科學的需求與渴望在不斷攀升。
“大資料就像青春期的性:每個人都在讨論,但鮮有人在行,大家覺得所有人都在做,是以大家都聲稱自己在做。”——dan ariely(行為經濟學大牛,著有《怪誕行為學》—譯者注)
關于如何成為一名資料科學家的讨論有很多很多。盡管這些探讨資訊量都很大(我便是衆多受益者之一),人們總是傾向于過分強調技術、工具和技巧的重要性。我以為,對于那些有志成為資料科學家的人來說,充分了解資料科學家的實戰操作是怎樣一番體驗,是同等重要的。
是以,在我在twitter工作兩周年之際,我希望以這次回顧為契機來分享我的個人經曆,同時希望資料科學行業的同僚們也能加入到這個行列中!
分析型資料科學家v.s.建構型資料科學家
來twitter之前,我以為資料科學家都是“珍稀動物”——做數學/統計/計算機/機器學習/ 算法/資料可視化等等出身。另外,寫作技巧和溝通能力與專業技能同等重要。進一步講,在執行任務的過程中,理清項目環節中的輕重緩急、上司團隊、管理項目的能力是最最重要的。除此以外,你還應該向大衆傳播一下由資料驅動的文化是多麼美好。good luck!
在twitter工作了幾個月後,我發現“珍稀動物”們确實存在,但對于大多數努力跻身于“珍稀動物”行列的資料工作者來說,一下子掌握那麼多學科是不現實也不可能的。也就是說,幾乎所有和資料沾邊的東西都和“資料科學”這個概念是相關的。那時,還是菜鳥一枚的我,尋找自己定位的時候感覺怯生生的。
久而久之,我意識到資料科學家可以被分為對立的兩類。這種分類有些過于簡單粗暴,卻十足精準。quora使用者michael hochster将我想表達的這種分類方法漂亮地總結如下:
a型資料科學家:a,即analysis(分析)。分析型資料科學家主要緻力于尋找資料背後的含義,或是以一種靜态的方式使用這些資料。分析型資料科學家類似于統計學家(他們很可能本來就是搞統計的),但他們還懂得統計課程裡不涉及的與資料工作相關的具體的實際操作,比如資料清理、大型資料集、資料可視化、對某一領域的深度了解和如何用資料講一個漂亮的故事,等等。
b型資料科學家:b,即building(建構)。建構型資料科學家和分析型分局科學家的共同點是都有統計學背景,但前者還是程式設計高手,抑或是訓練有素的軟體工程師。建構型資料科學家的關注點是把資料“投入生産”。他們建立的模型通常以“推薦”的方式與使用者互動,比如産品、你可能認識的人、廣告、電影、搜尋結果等。
真希望自己早些知道這兩種資料科學家的分别。如果你想成為一名資料科學家,留意這種分别——這對你選擇職業道路以及做取舍是非常有幫助的。
個人而言,我是學數學、操作研究和統計出身的。我認為我是一名分析型資料科學家,但我非常享受用到程式設計設計的建構型項目!
不同類型公司,資料科學家工作的異同
技術型人才找工作時往往要考慮,是去大企業任職,還是加入小型企業。雖然關于這種選擇的讨論有很多,但針對資料科學家的讨論就很少了——即,企業的發展階段與規模各有不同,那麼資料科學家在這些企業裡扮演的角色會有什麼不同呢?
處于不同發展階段的企業所産生的資料的速度、種類和量級是不同的。對于一個正在探索産品定位的創業公司,他們多半用不到hadloop這樣的軟體,因為這種公司并沒有那麼多資料可處理。成長性創業公司通常會産生更密集的資料,但對他們來講,postgresql和vertica這樣的資料庫管理系統就足夠了。但是像twitter這種規模的公司,就必須使用hadoop和mapreduce來處理資料了。
我在twitter學到了重要的一課——資料科學家從資料中提煉、創造價值的能力與企業資料平台的成熟度是高度相關的。如果你想保證達到企業和個人之間雙向選擇的最優化,做到以下是機智而關鍵的:搞清自己到底想做什麼類型的資料科學工作,然後下功夫衡量這個企業的體制設施能不能幫你實作你的目标。
發展初期的創業公司:資料分析主要緻力于執行記錄(log),建立etl過程(extract-transform-load 的縮寫,用來描述将資料從來源端經過抽取(extract)、轉換(transform)、加載(load)至目的端的過程——譯者注),模拟資料,設計一個架構來追蹤并儲存資料。這種公司的工作重點在于打好分析資料的基礎,而不是分析資料本身。
發展中期的創業公司:企業在成長,相應地,企業的資料也會增長。資料平台需要适應增長的資料,但由于資料的“地基”已經建好了,公司會自然地從單純收集資料轉向從資料中形成觀點、提煉價值。除非這個企業本來對資料的戰略用途就是非正常的,大多數分析型工作主要涉及定義關鍵績效名額、促進業績增長、尋找增長的下個契機。
達到一定規模的公司:企業規模增長,資料規模會跟着增長。這時,企業需要利用資料創造或保持它的競争優勢,比如:搜尋結果要更加優化、推薦内容的相關性要更高、物流與企業運作要更加高效。機器學習工程師、企業營運優化專家、實驗設計者之類的專家能夠有效幫助企業實作以上各種訴求。
我入職的時候,twitter的資料平台已經非常成熟了,基礎設施也非常穩定。資料倉庫幹淨而穩定,etl過程可以日常性、毫無壓力地處理無數mapreduce任務。最重要的是,在這裡,有一群優秀的資料科學家們緻力于資料平台、産品洞悉、growth、實驗、檢索/相關性以及許許多多其他方面的工作。
我的心路曆程
我是第一個專攻growth的資料科學家。告訴你一個真實的故事:産品部門、工程部門和資料科學部門花了好幾個月才共同認識到資料科學在growth中扮演着至關重要的角色。根據與産品部門密切合作的經曆,我的工作内容可以分為以下四大類:
産品洞見
資料流水線
a/b測試
模組化
下面我會分别我做這幾類工作的經曆與心得。
1.産品洞見
在消費者技術公司做資料科學有個獨特之處:我們可以利用資料來了解并推測使用者的意見和偏好。當使用者與産品互動時,我們能記錄到有價值的資料與中繼資料(描述其他資料并提供相關資訊的資料集),把它們儲存起來以便日後分析。
這個過程叫做“記錄日志”或“測量”,而且在不斷更新。資料科學家們經常會因為資料不正常、資料不比對或資料缺失而難以開展某一項分析。這時候,和工程師建立良好的工作關系就顯得很重要了:資料科學家可以幫助工程師識别系統中的bug和意外行為。反過來,工程師可以幫資料科學家縮小資料斷層,讓資料變得更豐富、相關性更強、更精确。
以下是我在twitter做的幾個典型的産品分析:
推送消息分析——多少使用者适用推送消息?這個比例是使用者組次元的嗎?還是用戶端次元?各種類型的推送消息點選率是多少?
短信投放率——如何計算不同移動營運商下twitter的短信投放率?新興國家使用者的投放率更低嗎?如何提高這一比率呢?
多個賬戶——為什麼某些國家的使用者擁有多個twitter号的比例更高?人們使用多個twitter号的動機是什麼?
具體分析形式多種多樣——對簡單的資料行為(推送分析)給出直白的解釋;創造新生(卻重要的)業務名額的計算方法;最後,你可能會負責深入分析使用者行為(小号)。
通過産品分析進而形成洞見是一個疊代過程。想做到這一點,你需要質疑以上問題的答案,了解産品所處的業務環境,找到合适的資料集來解決問題。久而久之,你将能夠熟練地定位你需要的那組資料并對其含義了如指掌。你将能夠準确地估算做一項分析需要多長時間。更重要的是,你會逐漸從被動轉為主動,提出新穎有趣的分析角度——産品負責人可能都沒想到,因為他們根本不知道某組資料的存在,抑或是不知道截然不同的資料源可以以某種方式互補結合。
涉及的技能:
• 記錄日志和測量。識别資料斷層。與工程師建立良好的工作關系。
• 定位、識别并使用相關資料集。
• 了解類型的分析,準确估算各種分析的耗時或難易程度。
• 玩轉查詢語言。能用r或python做典型的資料處理。
2.資料流水線
雖然分析型資料科學家不怎麼寫直接面對使用者的代碼,為了處理資料流水線,我們還是會經常向代碼庫貢獻一些代碼。
如果你對unix公司的pipe(一個運作一系列指令的操作)有所耳聞,資料流水線就很好了解了——不過是一系列操作,整合在一起以後能夠自動捕捉資料,循環地處理并整合資料。
我在twitter以前的公司任職時,所做的分析工作大多是ad-hoc(ad-hoc結構是一種省去了無線中介裝置ap而搭建起來的對等網絡結構)。我一般隻在自己的電腦上跑程式,也就跑個一兩次、兩三次。幾乎沒有人來檢查我的代碼寫的怎麼樣;運作的時候也不會控制代碼的版本。寫資料流水線的時候,一系列問題就出現了:依賴關系管理、計劃安排、資源配置、監測、錯誤報告,甚至還有警報。
下面是建立資料流水間的典型過程示例:
首先,你認識到,循環性地生産資料集将會是一件功德無量的事。
确認了這個需求以後,你先設計出最終産品,例如設計輸出資料集的資料架構。
根據資料所在環境用pig, scalding或sql寫代碼。
把代碼送出至code review(代碼評審),準備改代碼。也許你的商業邏輯有問題,或者你的代碼沒能做到速度與效率的最優化。
也許你需要測試程式,空運作(不帶資料跑代碼——譯者注)一下,看看代碼是否運作正常。
整合代碼。把代碼配置好,安排好每一個事項。
設定監控、錯誤報告、警報機制,以防代碼運作出錯。
資料流水線顯然比臨時性分析複雜得多,但資料流水線的好處是,它可以自動運轉,生産出來的資料可以被儀表闆所利用,這樣更多的使用者就可以使用你的資料或結果。更重要(但往往被忽視)的一點是,履歷資料流水線的過程是個軟體工程實操的絕佳機會。你可以為日後建立專業化流水線打好基礎,比如機器學習模型(本文最後一部分會對此進行詳細說明)、a/b測試平台。
• 版本控制。一般來講,最常用的工具是git(軟體開發時用到的源代碼管理系統——譯者注)。
• 學會做code review,迅速地給出回報。
• 程式出錯時,知道該怎麼測試、空運作、找bug。
• 掌握依賴管理、計劃安排、資源配置、監測、錯誤報告,以及給出提示資訊。
3.a/b測試
此時此刻,你用的twitter app很有可能和我的有所不同,很可能你有的功能我沒有。從内部從業人員的角度講,twitter的使用者非常多,是以twitter可以抽出一小部分流量來體驗尚未面世的新功能,以便将這部分實驗組使用者對新功能的回報情況與控制組使用者(即未體驗新功能的使用者——譯者注)作對比——這就是a/b測試,即用來測試變量a與變量b哪個效果更好。
個人認為,a/b測試是在大型消費者技術公司工作的特殊福利。資料科學家可以通過使用真實随機樣本的控制實驗來研究因果關系(用觀測值是很難做到這一點的)。在twitter,“幾乎每天都要做至少一個實驗——alex roetter,進階工程師”。a/b測試已經深深烙在twitter的資料科學家心裡,也是産品開發環節不可或缺的一環。
典型的a/b測試過程是這樣的:收集樣本-使用者分組-開始測試-衡量結果-對比分析。聽上去很簡單對吧?然而,我認為a/b測試是最被低估、相當棘手的分析工作,而且學校一般不教你這種技能。為了說明這一點,讓我們來回顧一下一上五個步驟以及實戰過程中的常見問題:
• 收集資料:樣本量需要多少?每組應該配置設定多少使用者?能不能保證明驗效果足夠明顯?
• 使用者分組:哪些使用者适用于這個測試?應該在程式的哪個階段開始分組并對使用者展示測試的新功能?這種分組是否會造成資料稀釋(比如某些測試組的使用者在使用過程中根本用不到我們測試的新功能)?
• 開始測試:有沒有其他項目組和我們用同一批樣本做測試?如果和他們發生樣本沖突,如何確定我們的資料沒有被污染?
• 衡量結果:實驗結果的預期是什麼?衡量實驗成功與否的标準是什麼?衡量标準可追蹤嗎?如何追蹤?需要額外記錄哪些資訊?
• 對比分析:假如線上使用者激增,這是來自其他變量的幹擾嗎?如何判斷結果是否統計顯著?如果确實是統計顯著的,實際上使用者組之間的差别真的明顯嗎?
處理好以上問題需要很強的統計學功底。即使你自己設計實驗的時候思維足夠嚴謹,你的隊友也有可能掉鍊子。産品經理會比較喜歡對資料先睹為快,或者挑幾個自己想要的結果(這是人的天性)。工程師可能會忘記記錄資料科學家用來計算成敗名額的某些資料,或者實驗代碼“姿勢”不對,造成偏誤。
對于資料科學家來說,故意唱唱反調、幫助團隊完善實驗是極其重要的,因為浪費在運作設計不合理的測試上的時間會一去不複返。更有甚者,根據不良資料做出的不良決策會造成非常嚴重的後果。
• 假設檢驗:統計檢驗、p值、統計顯著、統計力、效應值、多重檢驗
• 實驗缺陷:滞後效應、名額選擇、資料稀釋、分組異常
4.預測模型與機器學習
我在twitter做的第一個大型項目是對現有的郵箱通知産品增設一套繁瑣的規則,進而減少對使用者的騷擾。雖然這一舉措十分聖母,我們其實也清楚郵件通知是留住使用者的最有效的手段之一(我們曾對此進行試驗,驗證了這一點),是以找到一個合适的度是關鍵。
針對這個關鍵點,我旋即決定研究觸發性郵件——當使用者在twitter上有活動時,這種郵件會像雪片一樣飛進使用者的郵箱。作為一個正在努力證明自己的價值的野心勃勃的新晉資料科學家,我決定建立一個高端機器學習模型來預測使用者水準上的郵件點選率。我用pig收集了一大堆使用者特征,建立了随機森林模型來預測郵件點選率。我的思路是,如果一個使用者的點選率長期保持在很低的值,我們就可以安心撤銷該使用者的觸發性郵件。
其他的都好說,隻有一個問題——我的程式都是用本地電腦上的r寫的。别人承認我很努力,但他們無法利用我的模型來創造價值,因為我的沒有被産品化,公司的組織架構無法和我的局部模型互動。多麼慘痛的教訓!
一年後,我得到了與兩名來自growth的資料科學家一起建立顧客流失預測模型的寶貴機會。這一次,有了足夠的建立資料流水線的經驗,我知道建立機器學習流水線其實是類似的——在訓練階段,我們可以用python線上下做循環模型更新;在預測部分,我們可以每日收集使用者特征,用預測公式(大多數隻是“點産品”)生成每個使用者的流失率評分。
我們花了幾個禮拜建起來流水線,确認其具有良好的預測能力,全面部署,将使用者流失率評分輸入到vertica、hadoop檔案分散系統,以及我們的内部鍵值存儲“manhattan”。我們把這些scores涉及的非常便于分析師、資料科學家和工程師查詢。這一點大大幫助我們宣傳并促進這個模型的使用。這是我在建造生産模型時學到的最重要的一課。
我故意沒有提及建立機器學習模型的步驟——建立問題架構,定義标簽,手機訓練資料,設計特征,建立樣品,客觀地測試模型的可行性。這些步驟顯然都很重要,但我認為這些步驟前人都已經講得很明白了,無需我來提供相關建議。
我覺得大多數優秀的資料科學家,特别是分析型資料科學家,都不存在不會模組化的問題。他們的困惑在于,知道該怎麼模組化,但不清楚怎麼把自己的模型融入到整體生态環境裡。我對此的建議是,多和經驗豐富的建構型資料科學家交流,搞清你需要掌握什麼技能,潛心修煉,屆時自然能得心應手地接管相關項目。 請允許我引用以下這段話來為本章畫上句号:
“機器學習并不等同于r程式設計。機器學習是以數學為根基,用代碼表達,整合到軟體裡的。你需要掌握電腦工程師的技能,學着寫可讀、可重複使用的代碼:别人讀你的代碼的次數将遠遠多于你自己,是以你要寫得能讓别人看懂。”——ian wong,于哥倫比亞大學資料科學課程客座講座
這裡所涉及的技能:
• 模式識别:識别可以用模型解決的問題。
• 模組化和機器學習的基本功:探索式資料分析、履歷特征、特征選擇、模型選擇、訓練/驗證/測試、模型評估
• 生産化:掌握上文提到和資料流水線相關的一切知識。建立索引标志以便他人查詢。
一些感想
資料科學家的工作确實非常令人興奮,那種忽然窺到天機的興奮感堪比腎上腺素爆發。從零開始建構資料管道和機器學習模型會令你成就感滿滿,做a/b測試時,那種翻手為雲覆手為雨的上帝姿态也非常有樂趣。資料科學家這條路有苦又累,沿途九九八十一難,但聰明努力的人會迅速克服的。
資料科學之路任重而道遠,同志仍需努力。good luck各位,更為重要的是享受這其中的樂趣!
原文釋出時間為:2016-03-13
本文來自雲栖社群合作夥伴“大資料文摘”,了解相關資訊可以關注“bigdatadigest”微信公衆号