科學(xué)(比如物理、化學(xué)等)的主要原則(或者至少是科學(xué)的理想原則)之一是:可重復(fù)性。只有結(jié)果能被清楚地再現(xiàn)并經(jīng)過(guò)嚴(yán)格的同行評(píng)議后,真正“科學(xué)的”結(jié)論才能被學(xué)術(shù)界所接受。當(dāng)然,不管是學(xué)術(shù)界里科學(xué)家還是數(shù)據(jù)科學(xué)家,在實(shí)際操作過(guò)程中,事情都會(huì)變的有些混亂。很多數(shù)據(jù)科學(xué)家所使用的流程都還遠(yuǎn)未達(dá)到可重復(fù)性。這些流程可能是如下的幾種形式:
- 一系列的Jupyter notebook,里面包括不斷增加的描述性的文件名,比如second_attempt_at_feature_selection_for_part2.ipynb。
- Python或R的腳本,被手工拷貝到一臺(tái)機(jī)器上,并用crontab來(lái)設(shè)置定時(shí)運(yùn)行。
- 相當(dāng)魯棒但很難看懂的應(yīng)用程序。一般是由數(shù)據(jù)科學(xué)家完成需求文檔,并交由軟件工程師來(lái)開(kāi)發(fā)的。
- 一些應(yīng)用程序,它們生成的結(jié)果幾乎不可能與一個(gè)或多個(gè)持續(xù)變化的數(shù)據(jù)集的特殊狀態(tài)相關(guān)聯(lián)起來(lái)的。
最好的情況是,這些工作流的產(chǎn)出結(jié)果一般可以被這些項(xiàng)目的參與人員所重新生成。但是,如果讓新加入項(xiàng)目的人員或者是進(jìn)行項(xiàng)目評(píng)估的人再重新生成同樣的結(jié)果,就不可能了。
與可重復(fù)性相關(guān)的苦惱已經(jīng)在整個(gè)數(shù)據(jù)科學(xué)社區(qū)中被廣為探討:
“數(shù)據(jù)分析是非常容易出錯(cuò)的,很難知道你什么時(shí)候得到了正確的結(jié)果。這使得形成可重復(fù)的研究變的非常重要”——《可重復(fù)性不僅僅只是研究人員需要關(guān)注的》,數(shù)據(jù)學(xué)院。
“曾經(jīng)試圖去重復(fù)你幾個(gè)月前做的一個(gè)分析嗎?或者是幾年之前?盡管可能是你自己寫(xiě)的代碼,但是現(xiàn)在你幾乎不可能去理解并決定是用哪一個(gè)程序來(lái)完成任務(wù)。是make_figures.py.old?還是make_figures_working.py?或者是new_make_figures01.py?”——Cookiecutter數(shù)據(jù)科學(xué)
“6個(gè)月之后,別人問(wèn)了一個(gè)你分析里沒(méi)有涉及的問(wèn)題,這要求你必須重復(fù)你的分析。但是你就是記不得你把文件存在電腦的什么地方了。如果你是一個(gè)數(shù)據(jù)科學(xué)家,特別是關(guān)注決策科學(xué)和決策分析的那種,你一定碰到過(guò)這種情況?!薄?a >最無(wú)聊/有價(jià)值的數(shù)據(jù)科學(xué)的建議》,Justin Bozonier
可重復(fù)的問(wèn)題是一個(gè)機(jī)構(gòu)里的數(shù)據(jù)科學(xué)團(tuán)隊(duì)在某個(gè)時(shí)間點(diǎn)不得不面對(duì)的問(wèn)題。然而,這是一個(gè)好消息!只要運(yùn)用一點(diǎn)點(diǎn)原則和正確的工具,數(shù)據(jù)科學(xué)團(tuán)隊(duì)就可以獲得可重復(fù)的能力。這篇博文將會(huì)討論一下可重復(fù)性的價(jià)值,并提供實(shí)現(xiàn)可重復(fù)性的一些實(shí)戰(zhàn)方法。
為什么數(shù)據(jù)科學(xué)團(tuán)隊(duì)需要關(guān)心可重復(fù)性?
一些人可能會(huì)認(rèn)為只要模型和分析能輸出“好的”結(jié)果,這個(gè)結(jié)果是否能夠被重復(fù)并不重要。然而如果忽略可重復(fù)性,即使是一個(gè)很小的數(shù)據(jù)科學(xué)團(tuán)隊(duì)也可能會(huì)出問(wèn)題。在數(shù)據(jù)科學(xué)中,可重復(fù)性不應(yīng)該被放棄,無(wú)論你的機(jī)構(gòu)有多大或者有多成熟,因?yàn)榭芍貜?fù)性是以下活動(dòng)的前提條件:
合作:數(shù)據(jù)科學(xué),或是通常意義上的科學(xué),都是一個(gè)合作的行為。沒(méi)有一個(gè)數(shù)據(jù)科學(xué)家知道所有的建模技術(shù)和分析方法。即使有人全都知道,但是現(xiàn)代公司里的數(shù)據(jù)問(wèn)題的復(fù)雜度和規(guī)模已經(jīng)超出了單個(gè)人所能控制的范疇。因此作為一個(gè)數(shù)據(jù)科學(xué)家,你應(yīng)該總是要關(guān)心如何把你的結(jié)果分享給你的同事,以及你們?nèi)绾卧诜治龊徒r(shí)進(jìn)行合作。特別是,你應(yīng)該使用一個(gè)專(zhuān)門(mén)的方式來(lái)分享和部署產(chǎn)品,能讓別人使用相同的數(shù)據(jù),重復(fù)你的方法,產(chǎn)出相同的結(jié)果。不然,你的團(tuán)隊(duì)將無(wú)法把團(tuán)隊(duì)合作出的知識(shí)變現(xiàn),同時(shí)團(tuán)隊(duì)內(nèi)部的進(jìn)步將也僅僅只能被個(gè)別人了解,而成為個(gè)人的進(jìn)步。
創(chuàng)新:怎么能知道一個(gè)新模型比舊的模型要有更好的表現(xiàn)?怎么能恰當(dāng)?shù)刈C明對(duì)分析所加入的創(chuàng)新的精細(xì)度或復(fù)雜度更好?不幸的是,這些問(wèn)題的答案通常都是通過(guò)個(gè)別人的試錯(cuò)(例如用一個(gè)notebook)得到的,而一般在做出決定后就被忘掉了。但是如果分析是可重復(fù)的,數(shù)據(jù)科學(xué)團(tuán)隊(duì)就可以(1)明確地判定新的分析結(jié)果是否比舊的好,因?yàn)榕f的分析可以被再現(xiàn),且新的分析是用已知的數(shù)據(jù)來(lái)進(jìn)行的;(2) 清晰地了解到過(guò)去哪一個(gè)分析的表現(xiàn)比較差,從而能避免犯同樣的錯(cuò)誤。
合規(guī):隨著越來(lái)越多的統(tǒng)計(jì)、機(jī)器學(xué)習(xí)和人工智能的應(yīng)用做出對(duì)用戶產(chǎn)生直接影響的決定,將會(huì)越來(lái)越多的來(lái)自大眾的壓力,要求解釋這些決定,并能重現(xiàn)結(jié)果。事實(shí)上,歐盟已經(jīng)對(duì)很多由算法生成并對(duì)用戶產(chǎn)生影響的決定提出了“獲取解釋的權(quán)利”。如果沒(méi)有一個(gè)清晰可理解的和可再現(xiàn)結(jié)果的工作流,這樣的解釋將無(wú)法給出,而相應(yīng)的審計(jì)也無(wú)法進(jìn)行。
數(shù)據(jù)科學(xué)團(tuán)隊(duì)怎樣才能實(shí)現(xiàn)可重復(fù)性?
在不同的組織里來(lái)成功地實(shí)現(xiàn)可重復(fù)性的方法會(huì)有不同,因?yàn)閿?shù)據(jù)科學(xué)團(tuán)隊(duì)所解決的任務(wù)是非常不同的。不過(guò)通過(guò)對(duì)于下述最佳實(shí)踐、技術(shù)和工具的組合使用,將有可能幫助你的工作流程更接近可重復(fù)性。
努力實(shí)現(xiàn)簡(jiǎn)單、可解釋的解決方案,并為之喝彩
深度學(xué)習(xí)就是一個(gè)典型的很強(qiáng)大但通常非常難重復(fù)的分析工具的例子。并不是所有的業(yè)務(wù)問(wèn)題都需要使用深度學(xué)習(xí),盡管它和其他類(lèi)型的神經(jīng)網(wǎng)絡(luò)算法都明顯更好。經(jīng)常是一個(gè)簡(jiǎn)單的統(tǒng)計(jì)聚合(例如計(jì)算最大和最小值)就能為數(shù)據(jù)驅(qū)動(dòng)的決策提供非常好的支持。在某些場(chǎng)合下,簡(jiǎn)單的線性回歸或是決策樹(shù)也有可能產(chǎn)生足夠好的(甚至是非常好的)預(yù)測(cè)結(jié)果。
在這些場(chǎng)景里,使用更復(fù)雜的建模技術(shù)所帶來(lái)的精確度和準(zhǔn)確度的提升可能并不能抵消在可解釋性上付出的代價(jià)。這里的基線就是,如果使用更復(fù)雜的數(shù)據(jù)處理管道和建模技術(shù)后不能保證可重復(fù)性,那么可重復(fù)性應(yīng)該比使用最新和最好的模型的價(jià)值更高。
無(wú)重復(fù)性,不部署
無(wú)論你面臨著什么樣的時(shí)間節(jié)點(diǎn)壓力,都不應(yīng)該把一個(gè)不完善的分析應(yīng)用上線。作為數(shù)據(jù)科學(xué)家,我們努力地創(chuàng)造一個(gè)依靠數(shù)據(jù)驅(qū)動(dòng)來(lái)制定決策的文化。如果你的應(yīng)用故障了,還沒(méi)有一個(gè)解釋?zhuān)ê芸赡苁且驗(yàn)槟銦o(wú)法再現(xiàn)故障的結(jié)果),大家就會(huì)對(duì)你的應(yīng)用喪失信心,并不會(huì)依據(jù)它的產(chǎn)出來(lái)做決定。即使你最終修復(fù)了故障,用戶喪失的信心卻是非常難以挽回。
數(shù)據(jù)科學(xué)團(tuán)隊(duì)?wèi)?yīng)該按照要求有單元測(cè)試、靜態(tài)代碼分析、代碼版本控制和代碼回顧一樣的方式來(lái)要求有可重復(fù)性。如果不能用已知的數(shù)據(jù)持續(xù)重復(fù)地生成同樣或者更好的結(jié)果,分析就絕對(duì)不能進(jìn)入開(kāi)發(fā)階段。可重復(fù)性的具體的表現(xiàn)可以使用與集成測(cè)試相同的技術(shù)來(lái)衡量。更進(jìn)一步,如果可能,新的模型應(yīng)該和已有的系統(tǒng)上運(yùn)行的模型并行運(yùn)行,對(duì)相同的數(shù)據(jù)做分析,從而實(shí)現(xiàn)相互的比較。
你可以自己完成上述測(cè)試和測(cè)量的排程,但你也可以考慮使用諸如LeVar這樣的工具。LeVar提供了“一個(gè)數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)分析用的數(shù)據(jù)集和使用它們的實(shí)驗(yàn),從而可以用它來(lái)記錄和跟蹤新的方法對(duì)于靜態(tài)和已有的數(shù)據(jù)的運(yùn)行和表現(xiàn)”。
版本化你的數(shù)據(jù)
即使你已經(jīng)版本化了代碼或者Jupyter的notebook,但如果你不能使用同樣的數(shù)據(jù),你還是無(wú)法重復(fù)之前的分析。這意味著你需要制定計(jì)劃,并用工具來(lái)獲取歷史上某個(gè)點(diǎn)的分析和數(shù)據(jù)的狀態(tài)?,F(xiàn)在越來(lái)越多的數(shù)據(jù)版本化的工具出現(xiàn)了,下面會(huì)對(duì)它們做簡(jiǎn)單的分析。不過(guò)你的團(tuán)隊(duì)?wèi)?yīng)該制定一個(gè)數(shù)據(jù)版本化的計(jì)劃,并嚴(yán)格執(zhí)行。實(shí)現(xiàn)數(shù)據(jù)版本化之前的數(shù)據(jù)科學(xué)猶如Git之前的軟件工程。
Pachyderm是我非常了解的一個(gè)工具(曝光一下,我就在Pachyderm工作)。它可讓你如在Git上提交代碼一樣的提交數(shù)據(jù)。Pachyderm的文件系統(tǒng)是由“數(shù)據(jù)資料庫(kù)”構(gòu)成的,你可以提交任何格式的數(shù)據(jù)文件。
對(duì)數(shù)據(jù)的任何操作,你都可以把它們包裝成一個(gè)版本后提交到Pachyderm里。這意味著操作是可回溯的,而對(duì)你和你的同事而言新?tīng)顟B(tài)是可重復(fù)的。就如在Git里一樣,提交是可回退的,所以你的數(shù)據(jù)可以回退到之前的任何狀態(tài)。
知道你數(shù)據(jù)的淵源
實(shí)際上,版本化數(shù)據(jù)還不夠。數(shù)據(jù)來(lái)的時(shí)候可能是用它自己的封包形式,可能是來(lái)自一系列的轉(zhuǎn)換后形成的。因此你有可能會(huì)需要理解數(shù)據(jù)的淵源。沒(méi)有上下文的結(jié)果是沒(méi)有意義的。你分析的每一步中,你需要能理解數(shù)據(jù)是從哪里來(lái)的,以及它們是如何變成當(dāng)前的形式的。
類(lèi)似Pachyderm這樣的工具(作為一個(gè)工具或是你自己過(guò)程的一個(gè)模型)在這里也能幫忙。例如,通過(guò)Pachyderm運(yùn)行的一個(gè)分析在執(zhí)行過(guò)程中會(huì)自動(dòng)的記錄起源。在輸入數(shù)據(jù)沒(méi)有成為輸出的起源時(shí),分析是不會(huì)采用此輸入的。
記錄下來(lái)
如果你想,這一步也可以叫“文檔化”。在任何時(shí)間,你的文檔都應(yīng)該包含一個(gè)“實(shí)驗(yàn)筆記”,用來(lái)記錄你是如何做出會(huì)影響分析結(jié)果的決定的。每個(gè)決定都應(yīng)該有一個(gè)被記錄下來(lái)的動(dòng)機(jī)和與之相關(guān)的代價(jià)。
例如,你非常可能需要去正則化一個(gè)變量。然而在你正則化的時(shí)候,與這個(gè)變量相關(guān)的單位信息就會(huì)丟失,并可能造成別人無(wú)法理解這個(gè)變量。其他情況可能是其他人在利用你的分析時(shí)也可能會(huì)基于列名來(lái)假定測(cè)量單位。
Elias Ponvert在他的博文《我們是怎么用人的模式來(lái)進(jìn)行數(shù)據(jù)科學(xué)的》里對(duì)這一點(diǎn)做了非常好的討論。:
?“實(shí)驗(yàn)筆記太重要的了。沒(méi)有它,數(shù)據(jù)科學(xué)家非常難以重新開(kāi)始他或她在一個(gè)實(shí)驗(yàn)項(xiàng)目里遺留下來(lái)的工作,即使他或她僅僅只是做了一兩天這個(gè)實(shí)驗(yàn)?!?/p>
結(jié)論
在你的數(shù)據(jù)科學(xué)工作流里確??芍貜?fù)性看起來(lái)像是一個(gè)很恐怖的任務(wù)。然而,遵循一些最佳實(shí)踐并運(yùn)用合適的工具就能幫你完成。最終你所做的這個(gè)努力都是值得的,并會(huì)在一個(gè)合作、創(chuàng)新和合規(guī)的環(huán)境里得到回報(bào)。
Daniel Whitenack
Daniel是一個(gè)擁有博士學(xué)位的數(shù)據(jù)科學(xué)家/工程師,并有為大小公司開(kāi)發(fā)數(shù)據(jù)科學(xué)應(yīng)用的行業(yè)經(jīng)驗(yàn),包括預(yù)測(cè)模型、看板、推薦引擎等。Daniel在全球多個(gè)會(huì)議(Gopherfest、GopherCon等)上發(fā)表過(guò)演講。他還維護(hù)者Jupyter的Go內(nèi)核,并主動(dòng)地幫助多個(gè)開(kāi)源的數(shù)據(jù)科學(xué)項(xiàng)目組織它們的代碼提交。


更多內(nèi)容可以參考Strata北京2017的相關(guān)議題。