Notebook在復現資料科學研究成果中的絲滑使用

Baihai_IDP發表於2022-06-14

對於資料科學和AI科研人員而言,研究成果的復現至關重要。成果復現既是一種研究演算法的方式,也有助於科研人員找到研究的新途徑。

IDP中提供自研notebook互動式程式設計環境,它非常適合做資料分析與程式碼展示,主要功能包括:智慧開發、自適配環境、一鍵執行、一鍵連線資料來源、各種其他平臺工具整合、視覺化工作流管理等等。

本文僅以展示可復現性研究成果為目標,來講解如何利用IDP書寫漂亮的notebook。

研究成果復現的開發週期通常可分為三個階段:組織和記錄,程式碼的思想整理記錄和為分享做準備。下面將對這三階段進行依次展開。

一、 組織和記錄

“組織記錄”,顧名思義就是記錄完整的實驗過程,其實驗依賴應當完全參照論文內容的明確指示或者自我的實驗設計細節。

廣泛總結其他研究學者的經驗,此階段的notebook書寫應當遵循以下幾點:

1. 內容的故事性

IDP notebook由程式碼、文字、SQL、資料視覺化四部分組成,我們要利用好文字甚至多媒體在解釋性方面的優秀表達,建立一個計算性的敘述,像為觀眾講故事一樣地介紹主題、排列步驟、解釋結果,讓這個故事變得更加引人入勝,在此時要對閱讀故事的人群有一個預估,他是實驗室的非技術同事、另一個實驗室的分析師、某一期刊的讀者還是公眾?這決定了你要講故事講成什麼樣、語言描述的粒度大小。


圖1. IDP Notebook組成

2. 更加註重過程而不是結果

IDP notebook有很強的互動性,右邊欄的變數管理器強大的功能進一步增強了這一點,這使得我們嘗試和對比不同方法或引數更加快速和容易。但便捷的互動和引數管理功能,有時會使我們忽略了在執行這些互動式調研時將過程其記錄下來(根源在於懶得新建一個cell)。我們應當確保記錄下所有的探索,甚至那些導致進入死衚衕的探索!這些將幫助你記住做了什麼和為什麼做。不建議等到分析結束、得到了可靠結果後,才新增這樣的解釋性文字。正確做法是不要等,到那時你可能已經忘記了為什麼選擇某個特定引數值、從哪裡複製了一段程式碼,或者中間結果的有趣之處是什麼。如果你沒有時間全面記錄你此刻正在做什麼或在想什麼,那麼留下簡短的描述性筆記來提醒自己,在可以停下時抓緊把這些內容新增上。


圖2. IDP工作區變數管理器

3. 將內容分割槽

IDP的自研notebook 是一個互動式的環境,所以它很容易編寫和執行單行單元格,在實驗過程中,可能會存在多個他人難以理解的短小程式碼單元格。這時,我們可以嘗試新增一個有意義的分析步驟,用以劃分單元塊,還可以聯動右邊欄的大綱功能,實現隨時跳轉,準確定位。

細化來說,就是按單元格模組化程式碼,並在單元格上方用 markdown 標記。將每個單元格想象為一個段落、擁有一個函式或完成一個任務(例如,建立一個繪圖)。避免長單元格(任何超過 100 行或一頁的內容都太長了)。在程式碼註釋中放入低階文件。使用描述性的 markdown header 將 notebook 分割槽,使其可以輕鬆導航和新增目錄。將長 notebook 拆分為一系列 notebook,並保留一個 top-level index notebook,其中包含指向各個 notebook 的連結。


圖3. IDP工作區大綱

二、程式碼的思想整理記錄

到這一步實驗已經基本完成,我們要讓我們書寫的notebook變得更加美觀、合理,需要在以下幾個方面整理筆記:

1. 遵循規則的重要性

物件導向的思想在程式碼工程中應用很多,此時也需要簡單地遵循規則,以避免重複,在 notebook 中,複製一個單元格、調整幾行、將生成的程式碼貼上到新單元格或其他 notebook 中並再次執行是特別容易的,所以實驗過程中難免留下一些重複程式碼,此時就應當將其用函式的形式包裝起來,複雜一點的需要用到類,這取決於自己的判斷。

需要注意的是,如果你要在其他專案或 notebook 中重用程式碼,請考慮將其轉換為模組、包或庫,並遵循良好的軟體開發實踐(如單元測試)。

2. 實驗環境的配置

記錄依賴項是一個非常重要的問題,這決定了你未來是否能重新生成分析,在電腦科學實驗領域,建議一開始就使用諸如 conda 的 environment.yml 或 pip 的 requirements.txt 之類的工具明確地管理依賴項,以列出所有相關的依賴項(包括它們的軟體版本)。始終在這些依賴項建立的環境中工作,以確保不新增未記錄的依賴項。

在 notebook 中,你可以使用!pip install XXX.txt一鍵安裝依賴項,在工作區底部一鍵切換環境等等來完成實驗配置,如果對Linux系統比較熟悉,也可以使用左邊欄的終端功能,直接完成實驗環境的配置。

3. 版本控制的妙用

IDP工作區頭部右側的歷史版本,可以實現版本控制,因為 notebook 的互動特性使其很容易意外地更改或刪除重要內容。此外,由於 notebook 中包含程式碼,程式碼不可避免會有 bug,因此確定 bug 引入與修復的時間(及其可能影響的分析)是科學計算中的一項關鍵能力。


圖4. IDP版本管理

4. 工作流的使用

實驗研究穩定之後,可以考慮構建pipeline,記錄初步探索性研究的 notebook 很少能被廣泛推廣,但一旦確定了某種穩定的分析方法,設計良好的 notebook 就可以通過 pipeline 推廣到其他任務中,從而使用不同的輸入資料和引數很容易地重複分析。記住這一點,從一開始就設計你的 notebook,以允許將來重新調整用途。把關鍵變數宣告(尤其是在進行新的分析時會改變的變數)放在 notebook 的頂部,而不是埋在中間的某個地方。直接在 notebook 中執行準備步驟,如資料清理,並儘可能避免手動干預。

通過構建pipeline,也避免了他人在因為ReadMe.txt的閱讀難度而影響復現結果。


圖5. IDP視覺化工作流管理

三、分享

分享是一項高瞻遠矚的主題,在書寫notebook的時候考慮這一點似乎有些“雞肋”,實際上分享、交流才是實驗研究走得更遠的基石,以下幾點需要注意。

1. 可讀性

分享的內容一定要具有可讀性,特別是對於實驗資料,需要詳細又清晰的解釋。理想情況下,你可以在 notebook 中共享整個資料集。我們認識到許多資料集太大或太敏感,無法以這種方式共享。在這些情況下,考慮將大型和複雜的資料集分解為多個層次,這樣即使原始資料太大,無法與已釋出的 notebook 一起共享,或者受到隱私或其他訪問問題的限制,也不會影響到可復現性。

2. 便捷性

當我們完成了以上所有的點,我們的notebook已經書寫得非常美觀可用了,那麼就需要考慮一個問題,他人如何訪問、執行和探索它們呢?團隊協作是IDP的特色功能,支援notebook的一鍵分享,目前已實現資料視覺化單元格的一鍵分享。
我們也可以選擇將 notebook 儲存到一個具備清晰 README 檔案的公共程式碼庫中來以便分享,如常見的GitHub。


歡迎體驗解鎖 IDP 的更多功能: 立即免費體驗IDP

相關文章