出自16世紀(jì)荷蘭畫家彼得·勃魯蓋爾(Pieter Bruegel the Elder)的《煉金術(shù)士的實(shí)驗(yàn)室/Alchemist's Laboratory》
在數(shù)據(jù)科學(xué)項(xiàng)目中,我們經(jīng)常遇到各種腳本、notebook、Python代碼、Java代碼、SQL等大雜燴式組合在一起的工程項(xiàng)目。這些項(xiàng)目從各種來(lái)源提取數(shù)據(jù),代碼被復(fù)制并在各個(gè)地方經(jīng)過(guò)微小調(diào)整后重新使用。有些項(xiàng)目有版本控制和自動(dòng)化的打包腳本,而有些項(xiàng)目根本沒(méi)有測(cè)試、持續(xù)集成和部署(CI/CD)。所有這些問(wèn)題導(dǎo)致無(wú)法確保項(xiàng)目質(zhì)量和可重復(fù)性,為項(xiàng)目失敗埋下隱患。大部分?jǐn)?shù)據(jù)科學(xué)項(xiàng)目都是無(wú)序堆積的大雜燴,在工程化管理方面存在明顯不足。
隨著數(shù)據(jù)科學(xué)(包括人工智能應(yīng)用)的復(fù)雜性和重要性在當(dāng)今企業(yè)中不斷增加,許多數(shù)據(jù)科學(xué)項(xiàng)目在實(shí)際應(yīng)用中遇到各種問(wèn)題,導(dǎo)致項(xiàng)目失敗或結(jié)果不可靠。為了保障數(shù)據(jù)項(xiàng)目的成功,DrivenData Lab團(tuán)隊(duì)在其電子書《The 10 Rules of Reliable Data Science》中總結(jié)了數(shù)據(jù)科學(xué)項(xiàng)目持續(xù)成功的十條規(guī)則(最佳實(shí)踐)。這些規(guī)則為確保數(shù)據(jù)項(xiàng)目的成功提供了寶貴的指導(dǎo),能夠幫助數(shù)據(jù)科學(xué)家和團(tuán)隊(duì)提高工作效率,確保項(xiàng)目質(zhì)量和可重復(fù)性。
規(guī)則1:有序開(kāi)始,有序進(jìn)行(Start Organized, Stay Organized)
“在數(shù)據(jù)準(zhǔn)備過(guò)程中,經(jīng)常出現(xiàn)‘管道叢林’的現(xiàn)象。這些管道可能隨著新信號(hào)的識(shí)別和新信息源的添加而自然發(fā)展。如果不加以注意,最終為機(jī)器學(xué)習(xí)準(zhǔn)備數(shù)據(jù)的系統(tǒng)可能會(huì)變成由抓取、連接和采樣步驟組成的叢林,常常伴隨著中間文件的輸出。管理這些管道、檢測(cè)錯(cuò)誤和從失敗中恢復(fù)都是困難且昂貴的……所有這些都會(huì)增加系統(tǒng)的技術(shù)債務(wù),使得進(jìn)一步的創(chuàng)新變得更加昂貴?!?—— Sculley 等人, “Machine Learning: The High Interest Credit Card of Technical Debt” (2014)
以干凈和邏輯清晰的結(jié)構(gòu)開(kāi)始數(shù)據(jù)科學(xué)項(xiàng)目,并保持這種有序性,有助于數(shù)據(jù)科學(xué)家理解、擴(kuò)展和重現(xiàn)分析。
- 為什么要遵循這條規(guī)則?
- 防止混亂:如果沒(méi)有明確的結(jié)構(gòu),項(xiàng)目中的代碼和數(shù)據(jù)很快就會(huì)變得混亂,導(dǎo)致結(jié)果難以重現(xiàn)。
- 促進(jìn)協(xié)作:一個(gè)組織良好的項(xiàng)目使他人更容易理解和貢獻(xiàn),促進(jìn)更好的協(xié)作。
- 自我文檔化:有序的代碼本身就是一種文檔,減少了大量文檔的需求,使得以后返回項(xiàng)目時(shí)更容易上手。
- 如何實(shí)現(xiàn)這條規(guī)則:
- 使用模板:從像Cookiecutter Data Science這樣的項(xiàng)目模板開(kāi)始,它提供了合理且自我文檔化的結(jié)構(gòu)。
以下是Cookiecutter的項(xiàng)目結(jié)構(gòu):
├── LICENSE <- Open-source license if one is chosen├── Makefile <- Makefile with convenience commands like `make data` or `make train`├── README.md <- The top-level README for developers using this project.├── data│ ├── external <- Data from third party sources.│ ├── interim <- Intermediate data that has been transformed.│ ├── processed <- The final, canonical data sets for modeling.│ └── raw <- The original, immutable data dump.│├── docs <- A default mkdocs project; see www.mkdocs.org for details│├── models <- Trained and serialized models, model predictions, or model summaries│├── notebooks <- Jupyter notebooks. Naming convention is a number (for ordering),│ the creator's initials, and a short `-` delimited description, e.g.│ `1.0-jqp-initial-data-exploration`.│├── pyproject.toml <- Project configuration file with package metadata for │ {{ cookiecutter.module_name }} and configuration for tools like black│├── references <- Data dictionaries, manuals, and all other explanatory materials.│├── reports <- Generated analysis as HTML, PDF, LaTeX, etc.│ └── figures <- Generated graphics and figures to be used in reporting│├── requirements.txt <- The requirements file for reproducing the analysis environment, e.g.│ generated with `pip freeze > requirements.txt`│├── setup.cfg <- Configuration file for flake8│└── {{ cookiecutter.module_name }} <- Source code for use in this project. │ ├── __init__.py <- Makes {{ cookiecutter.module_name }} a Python module │ ├── config.py <- Store useful variables and configuration │ ├── dataset.py <- Scripts to download or generate data │ ├── features.py <- Code to create features for modeling │ ├── modeling │ ├── __init__.py │ ├── predict.py <- Code to run model inference with trained models │ └── train.py <- Code to train models │ └── plots.py <- Code to create visualizationste
這種標(biāo)準(zhǔn)化的項(xiàng)目結(jié)構(gòu)有助于保持項(xiàng)目的有序性和可維護(hù)性,確保數(shù)據(jù)科學(xué)項(xiàng)目的成功。
規(guī)則2:所有數(shù)據(jù)都有來(lái)源,原始數(shù)據(jù)不可變(Everything Comes from Somewhere, and the Raw Data is Immutable)
“每一條知識(shí)都必須在系統(tǒng)內(nèi)有一個(gè)唯一的、明確的、權(quán)威的表示?!?—— Andy Hunt 和 Dave Thomas, 《The Pragmatic Programmer》
這條規(guī)則強(qiáng)調(diào)確保項(xiàng)目中的所有數(shù)據(jù)都可以追溯到其來(lái)源的重要性。原始數(shù)據(jù)應(yīng)保持不變,任何轉(zhuǎn)換或分析都應(yīng)能從這一原始數(shù)據(jù)集中再現(xiàn)。
- 為什么要遵循這條規(guī)則?
- 可重現(xiàn)性:確保每一個(gè)結(jié)論或結(jié)果都可以通過(guò)一個(gè)清晰、不間斷的轉(zhuǎn)換鏈條追溯到最初的原始數(shù)據(jù)。
- 問(wèn)責(zé)性:有助于驗(yàn)證數(shù)據(jù)的有效性及其衍生結(jié)果的可靠性。
- 清晰性:通過(guò)澄清每個(gè)數(shù)據(jù)的來(lái)源,減少模糊性。
- 如何實(shí)現(xiàn)這條規(guī)則?
- 追蹤數(shù)據(jù)血緣:使用有向無(wú)環(huán)圖(DAG)來(lái)追蹤數(shù)據(jù)的依賴關(guān)系和所應(yīng)用的轉(zhuǎn)換。
- 保持原始數(shù)據(jù)不可變:將原始數(shù)據(jù)存儲(chǔ)為只讀格式,絕不修改它。任何清洗或轉(zhuǎn)換應(yīng)生成一個(gè)新的數(shù)據(jù)集。
- 記錄數(shù)據(jù)獲取過(guò)程:在README或其他可訪問(wèn)文件中記錄數(shù)據(jù)的獲取方式,包括任何預(yù)處理步驟。
- 使用依賴管理工具:使用像Apache Airflow或Prefect這樣的工具來(lái)管理和可視化數(shù)據(jù)管道,確保可追溯性。
- 工具和軟件包:
- Apache Airflow:用于創(chuàng)建和管理數(shù)據(jù)管道。
- Prefect:另一個(gè)數(shù)據(jù)管道管理工具,注重簡(jiǎn)潔和靈活性。
- DAGsHub:用于數(shù)據(jù)和機(jī)器學(xué)習(xí)模型的版本控制,以及代碼管理。
通過(guò)確保所有數(shù)據(jù)都可以追溯到其來(lái)源并保持原始數(shù)據(jù)的不可變性,數(shù)據(jù)科學(xué)家可以提高分析的可重現(xiàn)性和可靠性,使他們的工作更值得信賴且更易于審計(jì)。
規(guī)則3:版本控制是基本的專業(yè)素養(yǎng)(Version Control is Basic Professionalism)
“如果你沒(méi)有源代碼控制,你會(huì)在讓程序員協(xié)同工作時(shí)感到壓力重重。程序員無(wú)法知道其他人做了什么。錯(cuò)誤也無(wú)法輕易回滾。” —— Joel Spolsky, “The Joel Test: 12 Steps to Better Code”
這條規(guī)則強(qiáng)調(diào)使用像Git這樣的版本控制系統(tǒng)(VCS)來(lái)管理代碼和數(shù)據(jù)的變更。它確保所有修改都被追蹤、可逆且可審查。
- 為什么要遵循這條規(guī)則?
- 協(xié)作:通過(guò)允許多個(gè)人在同一個(gè)項(xiàng)目上工作而不產(chǎn)生沖突,促進(jìn)團(tuán)隊(duì)合作。
- 問(wèn)責(zé):追蹤變更并識(shí)別是誰(shuí)做了哪些修改,增強(qiáng)透明度。
- 可逆性:當(dāng)出現(xiàn)問(wèn)題時(shí),可以輕松回滾到以前的版本。
- 審查和質(zhì)量控制:使代碼審查和審計(jì)成為可能,幫助維持高質(zhì)量標(biāo)準(zhǔn)。
- 如何實(shí)現(xiàn)這條規(guī)則?
- 使用Git進(jìn)行代碼管理:定期將代碼更改提交到Git倉(cāng)庫(kù)。使用分支來(lái)管理不同的功能或開(kāi)發(fā)階段。
- 避免在VCS中存儲(chǔ)大數(shù)據(jù):僅存儲(chǔ)小型、很少更改的數(shù)據(jù)集。對(duì)于較大的數(shù)據(jù)集,使用DVC(數(shù)據(jù)版本控制)或Git LFS(大文件存儲(chǔ))等工具。
- 自動(dòng)化版本控制:使用腳本或工具自動(dòng)對(duì)數(shù)據(jù)集和模型進(jìn)行版本控制,確保每次更改都被追蹤。
- 代碼審查實(shí)踐:實(shí)施一個(gè)通過(guò)拉取請(qǐng)求進(jìn)行代碼審查的流程,確保所有更改都由至少一個(gè)團(tuán)隊(duì)成員審查。
- 記錄變更:維護(hù)一個(gè)變更日志,記錄項(xiàng)目中的重大變化和更新。
- 工具和軟件包:
- Git:最廣泛使用的版本控制系統(tǒng),用于追蹤代碼更改。
- Git LFS:用于在Git中管理大文件。
- DVC:用于對(duì)數(shù)據(jù)、模型和管道進(jìn)行版本控制,與代碼一起管理。
- GitHub/GitLab/Bitbucket:提供倉(cāng)庫(kù)、代碼審查工具和CI/CD集成的平臺(tái)。
使用版本控制是任何專業(yè)數(shù)據(jù)科學(xué)項(xiàng)目的基本要求。它增強(qiáng)了協(xié)作、問(wèn)責(zé)和質(zhì)量控制,使代碼和數(shù)據(jù)的管理和維護(hù)隨著時(shí)間的推移變得更加容易。
規(guī)則4:Notebooks用于探索,源文件用于重復(fù)(Notebooks are for Exploration, Source Files are for Repetition)
“大多數(shù)我聽(tīng)到的關(guān)于Notebooks的抱怨,我認(rèn)為是對(duì)它們用途的誤解……Notebooks絕對(duì)不是讓你像在編輯器里那樣輸入所有代碼并弄得一團(tuán)糟。” —— Mali Akmanalp
這條規(guī)則強(qiáng)調(diào)了Notebooks和源文件在數(shù)據(jù)科學(xué)項(xiàng)目中不同的用途。Notebooks適合進(jìn)行探索性分析和可視化,而源文件則更適合可重現(xiàn)和自動(dòng)化的任務(wù)。
- 為什么要遵循這條規(guī)則?
- 探索:Notebooks提供了一個(gè)交互環(huán)境,非常適合實(shí)驗(yàn)和可視化。
- 可重現(xiàn)性:當(dāng)源文件經(jīng)過(guò)良好組織和管理時(shí),確保過(guò)程可以可靠地重復(fù)。
- 協(xié)作和審查:源文件更容易在版本控制系統(tǒng)中管理,促進(jìn)代碼審查和協(xié)作。
- 如何實(shí)現(xiàn)這條規(guī)則?
- 在Notebooks中進(jìn)行探索性分析:使用Jupyter或R Notebooks進(jìn)行初步數(shù)據(jù)探索、可視化和迭代分析。
- 提取常用函數(shù):在開(kāi)發(fā)可重用的函數(shù)和流程時(shí),將它們從Notebooks中提取到源文件(如Python腳本)。
- 組織源代碼:將這些腳本放在一個(gè)組織良好的目錄結(jié)構(gòu)中,如/src或/scripts。
- 版本控制:將這些源文件提交到版本控制系統(tǒng),啟用協(xié)作開(kāi)發(fā)和代碼審查。
- 測(cè)試:為源文件中的函數(shù)編寫測(cè)試,確保它們?cè)贜otebooks環(huán)境外也能正常工作。
- 工具和軟件包:
- Jupyter Notebooks:用于交互式數(shù)據(jù)分析和可視化。
- VS Code或PyCharm:用于開(kāi)發(fā)和管理源文件。
- nbconvert:將JupyterNotebooks轉(zhuǎn)換為腳本。
- pytest:用于測(cè)試從Notebooks中提取的Python代碼。
- Git:用于管理Notebooks和源文件的版本控制。
Notebooks非常適合探索性和迭代分析,但關(guān)鍵函數(shù)應(yīng)提取到源文件中以確??芍噩F(xiàn)性和可維護(hù)性。這種方法利用了兩種環(huán)境的優(yōu)勢(shì),促進(jìn)了更清晰和更有條理的工作流程。
規(guī)則5:測(cè)試和健全性檢查預(yù)防災(zāi)難(Tests and Sanity Checks Prevent Catastrophes)
“沒(méi)有測(cè)試的代碼是糟糕的代碼。它無(wú)論寫得多么好,無(wú)論多么漂亮、面向?qū)ο蠡蛘叻庋b良好。有了測(cè)試,我們可以快速而可靠地改變代碼的行為。沒(méi)有測(cè)試,我們真的不知道我們的代碼是變得更好還是更糟。” —— Michael Feathers, 《Working Effectively with Legacy Code》
這條規(guī)則強(qiáng)調(diào)在數(shù)據(jù)科學(xué)代碼中編寫測(cè)試和進(jìn)行健全性檢查的重要性,以確保正確性和可靠性。測(cè)試有助于及早發(fā)現(xiàn)錯(cuò)誤,并確保代碼按預(yù)期工作。
- 為什么要遵循這條規(guī)則?
- 錯(cuò)誤預(yù)防:測(cè)試有助于在問(wèn)題變得更嚴(yán)重之前捕捉錯(cuò)誤。
- 信心:確保代碼在各種條件下都能正確執(zhí)行。
- 維護(hù):通過(guò)測(cè)試能夠捕捉到回歸,使得修改和擴(kuò)展代碼庫(kù)更加容易。
- 可重現(xiàn)性:確保結(jié)果能夠長(zhǎng)期可靠地重現(xiàn)。
- 如何實(shí)現(xiàn)這條規(guī)則?
- 編寫單元測(cè)試:專注于為單個(gè)函數(shù)和組件編寫測(cè)試,驗(yàn)證它們?cè)诟綦x環(huán)境中的行為。
- 使用健全性檢查:實(shí)施健全性檢查和冒煙測(cè)試,驗(yàn)證數(shù)據(jù)和基本功能的有效性。
- 使用樣本數(shù)據(jù)進(jìn)行測(cè)試:使用小型、具有代表性的數(shù)據(jù)集創(chuàng)建測(cè)試,驗(yàn)證代碼處理典型情景和邊緣情況的能力。
- 自動(dòng)化測(cè)試:使用持續(xù)集成工具將測(cè)試集成到開(kāi)發(fā)工作流中,實(shí)現(xiàn)自動(dòng)化運(yùn)行測(cè)試。
- 文檔化測(cè)試:清晰地記錄每個(gè)測(cè)試驗(yàn)證的內(nèi)容,便于他人理解和維護(hù)。
- 工具和軟件包:
- pytest:用于在Python中編寫和運(yùn)行測(cè)試的框架。
- unittest:Python內(nèi)置的測(cè)試模塊。
- Hypothesis:用于Python中的基于屬性的測(cè)試。
- tox:用于跨多個(gè)環(huán)境自動(dòng)化測(cè)試。
- 持續(xù)集成(CI)工具:如GitHub Actions、Travis CI或Jenkins,用于自動(dòng)化運(yùn)行測(cè)試。
測(cè)試和健全性檢查對(duì)于確保數(shù)據(jù)科學(xué)代碼的正確性和可靠性至關(guān)重要。它們有助于及早發(fā)現(xiàn)錯(cuò)誤,提升對(duì)代碼行為的信心,并使代碼庫(kù)更易于維護(hù)和擴(kuò)展。
規(guī)則6:大聲失敗,快速失敗(Fail Loudly, Fail Quickly)
“這個(gè)問(wèn)題在機(jī)器學(xué)習(xí)系統(tǒng)中比其他類型的系統(tǒng)更常見(jiàn)。假設(shè)正在進(jìn)行聯(lián)接的特定表不再更新。機(jī)器學(xué)習(xí)系統(tǒng)將進(jìn)行調(diào)整,其行為將繼續(xù)保持相當(dāng)良好,逐漸衰減。有時(shí)會(huì)發(fā)現(xiàn)表格已經(jīng)過(guò)時(shí)數(shù)月,簡(jiǎn)單的刷新比季度內(nèi)的任何其他發(fā)布都提高了性能!” — Martin Zinkevich, 《Rules of Machine Learning/機(jī)器學(xué)習(xí)規(guī)則》
這條規(guī)則強(qiáng)調(diào)設(shè)計(jì)系統(tǒng)以在遇到意外情況時(shí)能夠及時(shí)且顯眼地失敗的重要性。它倡導(dǎo)防御性編程實(shí)踐,使錯(cuò)誤變得顯而易見(jiàn)且可以迅速采取措施。
- 為什么要遵循這條規(guī)則?
- 錯(cuò)誤檢測(cè):幫助及時(shí)捕捉錯(cuò)誤,防止錯(cuò)誤擴(kuò)散并導(dǎo)致更大的問(wèn)題。
- 調(diào)試:便于識(shí)別和修復(fù)問(wèn)題的根本原因。
- 可靠性:確保系統(tǒng)表現(xiàn)可預(yù)測(cè),并以受控方式失敗。
- 責(zé)任:提供清晰的錯(cuò)誤消息,幫助開(kāi)發(fā)人員理解問(wèn)題的原因及如何修復(fù)。
- 如何實(shí)現(xiàn)這條規(guī)則?
- 驗(yàn)證假設(shè):實(shí)施檢查確保輸入和中間結(jié)果符合預(yù)期條件。
- 使用斷言:添加斷言來(lái)強(qiáng)制執(zhí)行關(guān)于數(shù)據(jù)和代碼行為的假設(shè)。
- 記錄錯(cuò)誤:實(shí)施全面的日志記錄,捕獲關(guān)于錯(cuò)誤及其上下文的詳細(xì)信息。
- 引發(fā)異常:使用異常處理未預(yù)期的情況,并確保適當(dāng)處理。
- 快速失?。涸O(shè)計(jì)系統(tǒng)立即檢測(cè)和響應(yīng)錯(cuò)誤,必要時(shí)停止進(jìn)一步執(zhí)行。
- 工具和軟件包:
- 日志記錄庫(kù):如Python的內(nèi)置日志記錄模塊,用于捕獲詳細(xì)的錯(cuò)誤信息。
- assert:Python中的assert語(yǔ)句,用于強(qiáng)制執(zhí)行條件。
- 錯(cuò)誤處理庫(kù):如Python中的bulwark,用于執(zhí)行數(shù)據(jù)驗(yàn)證和假設(shè)。
- 測(cè)試庫(kù):像pytest這樣的工具,編寫測(cè)試確保系統(tǒng)在無(wú)效條件下正確失敗。
設(shè)計(jì)系統(tǒng)以大聲失敗和快速失敗有助于及時(shí)捕捉和解決錯(cuò)誤,提高可靠性和可維護(hù)性。通過(guò)強(qiáng)制執(zhí)行假設(shè)并提供清晰的錯(cuò)誤消息,開(kāi)發(fā)人員可以確保問(wèn)題能夠有效檢測(cè)和解決。
規(guī)則7:從原始數(shù)據(jù)到最終輸出,項(xiàng)目運(yùn)行完全自動(dòng)化(Project Runs are Fully Automated from Raw Data to Final Outputs)
“即使人們記得這些步驟,他們也可能會(huì)自我安慰而跳過(guò)某些步驟。在復(fù)雜的過(guò)程中,畢竟,并不是所有的步驟總是很重要?!@以前從未成為問(wèn)題,’人們會(huì)說(shuō)。直到有一天它變成了問(wèn)題。” — Atul Gawande, 《The Checklist Manifesto/清單宣言》
這條規(guī)則強(qiáng)調(diào)了自動(dòng)化整個(gè)數(shù)據(jù)流水線的重要性,從原始數(shù)據(jù)到最終輸出,確保流程可重復(fù)、可靠,并能夠以最小的努力被任何人執(zhí)行。
- 為什么要遵循這條規(guī)則?
- 可重復(fù)性:確保整個(gè)過(guò)程可以重復(fù)執(zhí)行并得到相同的結(jié)果。
- 效率:通過(guò)自動(dòng)化重復(fù)性任務(wù)節(jié)省時(shí)間。
- 減少錯(cuò)誤:通過(guò)減少手動(dòng)步驟降低人為錯(cuò)誤的發(fā)生概率。
- 一致性:確保每次執(zhí)行都遵循相同的步驟,產(chǎn)生一致的結(jié)果。
- 如何實(shí)現(xiàn)這條規(guī)則?
- 使用構(gòu)建工具:實(shí)施類似GNU Make或Apache Airflow的工具來(lái)管理和自動(dòng)化數(shù)據(jù)流水線。
- 為每個(gè)步驟編寫腳本:創(chuàng)建用于數(shù)據(jù)提取、清洗、轉(zhuǎn)換、建模和報(bào)告的腳本。
- 自動(dòng)化環(huán)境設(shè)置:使用Docker或虛擬環(huán)境等工具確??梢灾噩F(xiàn)分析環(huán)境。
- 文檔化過(guò)程:在README或類似文件中清晰記錄運(yùn)行流水線所需的步驟和命令。
- 持續(xù)集成:集成CI/CD工具,以便在代碼庫(kù)進(jìn)行更改時(shí)自動(dòng)運(yùn)行流水線。
- 工具和軟件包:
- Apache Airflow:用于編排復(fù)雜的數(shù)據(jù)流水線。
- GNU Make:管理構(gòu)建過(guò)程的簡(jiǎn)單而強(qiáng)大的工具。
- Docker:用于容器化環(huán)境,確保在不同設(shè)置中的一致性。
- Vagrant:創(chuàng)建和配置輕量級(jí)、可重現(xiàn)和便攜式工作環(huán)境。
- Jenkins/CircleCI/GitHub Actions:CI/CD工具,用于自動(dòng)化運(yùn)行流水線。
自動(dòng)化從原始數(shù)據(jù)到最終輸出的整個(gè)數(shù)據(jù)流水線,確保了可重復(fù)性、效率和一致性。它減少了人為錯(cuò)誤的可能性,并使任何人都能輕松執(zhí)行流程,從而產(chǎn)生更可靠和可信的結(jié)果。
規(guī)則8:重要參數(shù)提取和集中管理(Important Parameters are Extracted and Centralized)
“明確優(yōu)于隱晦?!?— Tim Peters, 《The Zen of Python/Python之禪》
這條規(guī)則側(cè)重于在項(xiàng)目中集中和清晰定義重要參數(shù),而不是將它們分散到代碼中各處。這種做法提升了項(xiàng)目的清晰度、可重復(fù)性和修改的便捷性。
- 為什么要遵循這條規(guī)則?
- 清晰度:集中參數(shù)使得更容易理解項(xiàng)目的配置方式。
- 易于修改:在一個(gè)地方修改參數(shù)減少了不一致性和錯(cuò)誤的風(fēng)險(xiǎn)。
- 文檔化:集中的配置作為項(xiàng)目設(shè)置和參數(shù)的文檔。
- 可重復(fù)性:確保所有參數(shù)都被明確設(shè)置和跟蹤,使得結(jié)果更易重現(xiàn)。
- 如何實(shí)現(xiàn)這條規(guī)則?
- 使用配置文件:將參數(shù)存儲(chǔ)在一個(gè)中心化的配置文件中(例如 config.yml、settings.json)。
- 環(huán)境變量:對(duì)于敏感信息或在不同環(huán)境中可能變化的參數(shù),使用環(huán)境變量。
- 參數(shù)管理工具:使用能夠管理參數(shù)并強(qiáng)制保持一致性的工具。
- 文檔化參數(shù):在配置文件或單獨(dú)的文檔文件中清晰地記錄每個(gè)參數(shù)的作用和可能的取值。
- 集中訪問(wèn):確保所有需要訪問(wèn)參數(shù)的代碼部分從集中化的配置中讀取參數(shù)。
- 工具和軟件包:
- YAML/JSON/TOML:配置文件的格式。
- ConfigParser:Python模塊,用于處理配置文件。
- dotenv:用于在 .env 文件中管理環(huán)境變量。
- Hydra:Python項(xiàng)目中管理配置文件的框架。
- Cerberus:Python中一個(gè)輕量級(jí)且可擴(kuò)展的數(shù)據(jù)驗(yàn)證庫(kù)。
集中和明確定義重要參數(shù),提升了數(shù)據(jù)科學(xué)項(xiàng)目的清晰度、可維護(hù)性和可重復(fù)性。將所有配置集中在一處使得修改更易管理,項(xiàng)目也更加易于理解和可靠。
規(guī)則9:項(xiàng)目運(yùn)行默認(rèn)詳細(xì),并生成實(shí)質(zhì)性產(chǎn)物(Project Runs are Verbose by Default and Result in Tangible Artifacts)
“在數(shù)據(jù)流水線運(yùn)行期間捕獲有用的輸出,使得很容易找出結(jié)果的來(lái)源,便于回顧和繼續(xù)上次的工作。” — DrivenData
這條規(guī)則強(qiáng)調(diào)了使數(shù)據(jù)流水線運(yùn)行詳細(xì)化,并確保其產(chǎn)生實(shí)質(zhì)性的產(chǎn)物,記錄了整個(gè)過(guò)程和結(jié)果。
- 為什么要遵循這條規(guī)則?
- 透明度:詳細(xì)的日志和產(chǎn)物清晰地展示了結(jié)果如何獲得。
- 調(diào)試:詳細(xì)的輸出幫助識(shí)別問(wèn)題出現(xiàn)的位置。
- 文檔化:自動(dòng)生成的產(chǎn)物作為記錄,有助于未來(lái)的重現(xiàn)和理解。
- 責(zé)任追溯:確保流水線的每一步都有記錄,便于審查和審計(jì)。
- 如何實(shí)現(xiàn)這條規(guī)則?
- 啟用詳細(xì)日志記錄:使用日志庫(kù)捕獲數(shù)據(jù)流水線每個(gè)步驟的詳細(xì)信息。
- 生成產(chǎn)物:確保每次運(yùn)行都生成產(chǎn)物,如日志、配置文件、中間數(shù)據(jù)集和最終結(jié)果。
- 時(shí)間戳和版本信息:在日志和產(chǎn)物中包含時(shí)間戳和版本信息,跟蹤隨時(shí)間的變化。
- 存儲(chǔ)產(chǎn)物:將產(chǎn)物保存在結(jié)構(gòu)化且易訪問(wèn)的位置,如版本控制的目錄或云存儲(chǔ)桶中。
- 文檔化運(yùn)行:為每次運(yùn)行創(chuàng)建摘要報(bào)告,詳細(xì)描述采取的步驟、使用的配置和獲得的結(jié)果。
- 工具和軟件包:
- logging:Python的內(nèi)置日志模塊,用于捕獲詳細(xì)日志。
- MLflow:用于管理機(jī)器學(xué)習(xí)生命周期的工具,包括實(shí)驗(yàn)跟蹤、模型注冊(cè)和產(chǎn)物存儲(chǔ)。
- WandB:Weights & Biases,用于跟蹤實(shí)驗(yàn)和可視化結(jié)果。
- TensorBoard:用于可視化TensorFlow日志。
- 結(jié)構(gòu)化存儲(chǔ):如S3、Google Cloud Storage或Azure Blob Storage,用于存儲(chǔ)產(chǎn)物。
通過(guò)使項(xiàng)目運(yùn)行詳細(xì)化并確保產(chǎn)生實(shí)質(zhì)性的產(chǎn)物,可以提升透明度,便于調(diào)試,并提供全面的文檔記錄。這種做法使得理解、重現(xiàn)和建立在以前工作基礎(chǔ)上更加容易,從而提升數(shù)據(jù)科學(xué)項(xiàng)目的整體可靠性和效率。
規(guī)則10:從最簡(jiǎn)單的端到端流水線開(kāi)始(Start with the Simplest Possible End-to-End Pipeline)
“一個(gè)復(fù)雜系統(tǒng)的工作通常是從一個(gè)簡(jiǎn)單工作的系統(tǒng)演變而來(lái)的。從頭設(shè)計(jì)的復(fù)雜系統(tǒng)從來(lái)都不會(huì)工作,并且不能通過(guò)補(bǔ)丁來(lái)使其工作。你必須從一個(gè)能工作的簡(jiǎn)單系統(tǒng)開(kāi)始?!?— Brian Kernighan 和 John Gall, Systemantics
這條規(guī)則強(qiáng)調(diào)了在逐步增加復(fù)雜性之前,從一個(gè)簡(jiǎn)單且功能完整的端到端流水線開(kāi)始的重要性。首先建立一個(gè)最小可行產(chǎn)品(MVP),能夠從原始數(shù)據(jù)處理到最終輸出,然后逐步增強(qiáng)和優(yōu)化。
- 為什么要遵循這條規(guī)則?
- 基礎(chǔ)建設(shè):建立一個(gè)工作的基準(zhǔn)線,確保流程的各個(gè)部分都能連接和正常工作。
- 迭代改進(jìn):允許逐步完善和優(yōu)化,減少引入錯(cuò)誤的風(fēng)險(xiǎn)。
- 專注:在深陷細(xì)節(jié)和優(yōu)化之前,幫助保持對(duì)主要目標(biāo)的關(guān)注。
- 靈活性:提供一個(gè)靈活的框架,可以根據(jù)需要進(jìn)行調(diào)整和擴(kuò)展。
- 如何實(shí)現(xiàn)這條規(guī)則?
- 定義最小流水線:確定從原始數(shù)據(jù)處理到最終輸出所需的基本步驟,并實(shí)施它們。
- 迭代開(kāi)發(fā):從最簡(jiǎn)單的實(shí)現(xiàn)開(kāi)始,逐步添加功能、優(yōu)化和復(fù)雜性。
- 早期驗(yàn)證:確保每個(gè)流水線階段在進(jìn)入下一階段之前都能正常工作。
- 先用簡(jiǎn)單工具:最初使用簡(jiǎn)單且易理解的工具和方法,只有在必要時(shí)才引入更高級(jí)的技術(shù)。
- 文檔化過(guò)程:隨著每次迭代更新文檔,確保不斷演變的流水線仍然易于理解。
- 工具和軟件包:
- Make:用于簡(jiǎn)單的構(gòu)建自動(dòng)化。
- Pandas:用于數(shù)據(jù)操作和初始數(shù)據(jù)處理。
- Scikit-learn:用于基本建模和機(jī)器學(xué)習(xí)任務(wù)。
- Jupyter Notebooks:用于原型設(shè)計(jì)和探索初始實(shí)現(xiàn)。
- Docker:用于創(chuàng)建可復(fù)現(xiàn)的環(huán)境。
從最簡(jiǎn)單的端到端流水線開(kāi)始,確保了一個(gè)堅(jiān)實(shí)的基礎(chǔ)進(jìn)行構(gòu)建。這種方法允許逐步開(kāi)發(fā)和完善,確保每個(gè)新增功能都建立在一個(gè)經(jīng)過(guò)驗(yàn)證和功能完整的基礎(chǔ)上,從而降低復(fù)雜性并提高可維護(hù)性。
數(shù)據(jù)科學(xué)項(xiàng)目的成功不僅依賴于技術(shù)和算法,更依賴于良好的工作實(shí)踐和組織管理。通過(guò)遵循上述 10 個(gè)規(guī)則(最佳實(shí)踐),數(shù)據(jù)科學(xué)家和團(tuán)隊(duì)可以提高工作效率,確保項(xiàng)目結(jié)果的可靠性和可重復(fù)性,為企業(yè)創(chuàng)造更大的價(jià)值。這些規(guī)則不僅適用于數(shù)據(jù)科學(xué)項(xiàng)目,也適用于任何需要高質(zhì)量數(shù)據(jù)分析和處理的領(lǐng)域。希望這些最佳實(shí)踐能對(duì)您的工作有所幫助,并期待與您共同探討和改進(jìn)數(shù)據(jù)科學(xué)工作流程。
《The 10 Rules of Reliable Data Science》 下載地址:https://drivendata.co/insights
版權(quán)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn),該文觀點(diǎn)僅代表作者本人。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權(quán)/違法違規(guī)的內(nèi)容, 請(qǐng)發(fā)送郵件至 舉報(bào),一經(jīng)查實(shí),本站將立刻刪除。