摘要: 在一個新的數據科學項目,你應該如何組織你的項目流程?數據和代碼要放在那裏?應該使用什麼工具?在對數據處理以前,須要考慮哪些方面?讀完本文,會讓你擁有一個更加科學的工做流程。
假如你想要開始一個新的數據科學項目,好比對數據集進行簡單的分析,或者是一個複雜的項目。你應該如何組織你的項目流程?數據和代碼要放在那裏?應該使用什麼工具?在對數據處理以前,須要考慮哪些方面?html
數據科學是當前一個不太成熟的行業,每一個人都各成一家。雖然咱們能夠在網上參照各類模板項目、文章、博客等建立一個數據科學項目,可是目前也沒有教科書對這些知識作一個統一的回答。每一個數據科學家都是從經驗和錯誤中不斷的探索和學習。如今,我逐漸瞭解到什麼是典型的「數據科學項目」,應該如何構建項目?須要使用什麼工具?在這篇文章中,我但願把個人經驗分享給你。git
儘管數據科學項目的目標、規模及技術所涉及的範圍很廣,但其基本流程大體以下:github
如上圖所示,項目不一樣,其側重點也會有所不一樣:有些項目的某個過程可能特別複雜,而另外一些項目可能就不須要某一過程。舉個例子來講,數據科學分析項目一般就不須要「部署」(Deployment)和「監控」(Monitoring)這兩個過程。如今,咱們逐一來細說各個過程。web
不論是你接觸到人類基因組仍是iris.csv,一般都會有 「原始源數據」這一律念。數據有不少種形式,能夠是固定的,也能夠是動態變化的,能夠存儲在本地或雲端。其第一步都是對源數據訪問,以下所示:算法
一般來講,在設置數據源的時候能夠遵循如下規則:docker
上面這個步驟很重要。後續項目會你可能會犯任何錯誤,好比源文件無效、誤用方法等等,若是沒有記住數據的含義、位置及訪問過程,那將很麻煩。數據庫
數據處理的目的是將數據轉化爲「乾淨」的數據,以便建模。在多數狀況下,這種「乾淨」的形式就是一個特徵表,所以,「數據處理」一般歸結爲各類形式的特徵工程(feature engineering),其核心要求是:確保特徵工程的邏輯可維護,目標數據集可重現,整個管道能夠追溯到源數據表述。計算圖(computation graph)即知足以上要求。具體例子以下:apache
首先,容許用戶輕鬆的跟蹤當前所定義的特徵,而不用存儲在大型數據表中。特徵定義僅在代碼運行期間有效;其次,模型從部署到生產很是簡單,假設實時數據庫使用相同的模式,你就只須要複製相應的視圖。此外,還可使用CTE語句將全部的特徵定義編譯爲模型最終預測的單個查詢語句。flask
在進行數據處理時,請注意一下問題:api
1.重複以計算圖的形式處理數據。
2.考慮計算基礎架構。是否進行長時間計算?是否須要並行計算仍是聚類?是否能夠從具備跟蹤任務執行的管理UI做業中獲益?
3.若是想要將模型部署到生產環境中,請確保系統支持該用例。若是正在開發一個包含JAVA Android應用程序模型,可是仍是想用Python開發,爲了不沒必要要的麻煩,就可使用一個專門設計的DSL,而後將這個DSL轉換爲Java或PMML之類的中間格式。
4.考慮存儲特徵或臨時計算的元數據。能夠將每一個特徵列保存在單獨的文件中,或使用Python函數註釋。
完成數據處理和特徵設計後便可開始進行建模。在一些數據科學項目中,建模能夠歸結爲單個m.fit(X,y)或某個按鈕;而在其餘項目中則可能會涉及數週的迭代和實驗。一般來講,你能夠從「特徵工程」建模開始,當模型的輸出構成了不少特徵時,數據處理和建模這兩個過程並無明確的界限,它們都涉及到計算。儘管如此,將建模單獨列出來做爲一個步驟,仍然頗有意義,由於這每每會涉及到一個特殊的需求:實驗管理(experiment management)。具體例子以下:
在實際應用中,模型最終都要部署到生產環境中,必定要有一個有效的計劃,下面有些例子:
咱們對模型部署作一下總結:
1.模型部署的方式有不少種。在部署以前必定要了解實際狀況,並提早作計劃:是否須要將模型部署到其餘語言編寫的代碼庫中?若是使用REST服務,服務的負載時多少?可否進行批量預測?若是打算購買服務,費用是多少?若是決定使用PMML,那麼就要確保它可以支持你的預期預處理邏輯。若是在訓練期間使用第三方數據源,那麼就要考慮是否在生產中可以與它們集成,以及如何在管道導出模型中對訪問信息進行編碼。
2.模型一旦部署到生產環境,它就轉變爲一行行實際的代碼,因此也要知足全部需求,所以,這就須要測試。在理想狀況下,部署管道應該產生用於部署的模型包以及測試時須要的全部內容。
將模型成功部署到生產環境,也許訓練集中的輸入分佈與現實不一樣,模型須要從新練或從新校準;也許系統性能沒有達到預期。所以,你須要收集模型性能的數據並對其進行監控。這就須要你設置一個可視化儀表板,具體事例以下:
在整個數據科學項目中,你還須要嘗試不一樣的假設,以生成圖標和報告。這些任務與構建管道有所不一樣,主要體如今兩個方面:
首先,大部分任務不須要可再現性,即不用包含在計算圖中。另外,也不必使用模型的可重複性,在Jupyter中手動繪製圖便可。
其次,這些「進一步探索」的問題每每具備不可預測性:可能須要分析性能監控日誌中的一個異常值;或者測試一個新的算法。這些探索會塞滿你的筆記本中,團隊中的其餘人可能看不懂你的記錄。所以按照日期排列子項目很重要。
./2017-01-19 - Training prototype/
(README, unsorted files)
./2017-01-25 - Planning slides/
(README, slides, images, notebook)
./2017-02-03 - LTV estimates/
README
tasks/
(another set of
date-ordered subfolders)
./2017-02-10 - Cleanup script/
README
script.py
./... 50 folders more ...
注意,你能夠根據須要自由組織每一個子項目的內部目錄,由於每一個子項目極可能也是一個「數據科學項目」。在任何狀況下,在每一個子項目中都要有個README文件夾或README.txt文件,簡要列出每一個子項目目錄的信息。
若是項目列表太長,你須要從新組織項目目錄,好比壓縮一部分文件移動到存檔文件夾中。「探索性」的任務有兩種形式,即一次性分析和可重複性使用的代碼,這時候創建一些約定頗有必要。
數據科學項目可能會依賴一些服務,能夠指定提供如下9個關鍵服務,來描述指望:
1.文件存儲。任何一個數據科學項目都必須有個存儲項目的地方,且須要整個團隊共享。它是網絡驅動器上的一個文件夾?仍是Git存儲庫中的一個文件夾?
2.數據服務。如何存儲和訪問數據?這裏的「數據」指的是計算機讀取或輸出的全部內容,包括源數據、中間結果及第三方數據集訪問、元數據、模型及報告等。
3.版本。代碼、數據、模型、報告和文檔都須要有版本控制,另一定要備份!
4.元數據和文檔。如何記錄項目及子項目?是否有任何機器均可讀的特徵、腳本、數據集或模型的元數據?
5.交互式計算。在交互式計算中,你選擇JupyterLab、RStudio、ROOT、Octave仍是Matlab?您是否爲交互式並行計算設置了一個聚類(如ipyparallel或dask)?
6.做業隊列和調度程序。代碼如何運行?是否須要安排按期維護?
7.計算圖。如何描述計算圖並創建可重複性?
8.實驗管理。如何收集、查看和分析模型培訓進度和結果?使用 ModelDB、Hyperdash仍是 FloydHub?
9.監控儀表板。如何收集和跟蹤模型在生產環境中的具體表現?使用元數據庫、Tableau、 PowerBI仍是Grafana?
最後,我總結了一個電子表格,包含了本文提到的全部工具,可自行下載使用。
本文爲雲棲社區原創內容,未經容許不得轉載。