[Data Science]探討模型/分析程式架構

[Data Science]探討模型/分析程式架構
Photo by ZHENYU LUO / Unsplash
快速導覽

一、前言

軟體開發中,會將程式架構引入設計模式(design pattern),目的是用來簡化程式的開發與強化程式的維護性;例如常見的Model-View-Controller(MVC)模式,或是拆成router、controller、service、handle等區塊等,將每個單一的功能或方法,依據不同的功能與邏輯分拆並放到不同的區塊之中,已建立專案內鬆散的耦合(Loose Coupling)關係。

如上圖,一個使用者對點擊一個網頁,觸發了一項請求,這份請求原本應該是一支function再回傳結果,但根據拆分後的架構,請求會經Router決定他要由哪個Controller進行param的檢查後進到Service做資料的撈取。

拆解後的程式架構中,每一個部分負責的功能都不一樣,主要是強調職責分離,這樣的好處可以讓開發跟維護人員可以更快的針對目的或是BUG找到對應的部分,因此在維護跟開發上更加方便。

二、模型/分析有沒有所謂的”通用”架構?

隨著硬體的日新月異,資料的儲存、演算法的運行時間門檻逐漸降低,即時無法購買大型機器或高階顯卡,也能透過租用的方式來獲得高端的空間或是效能。

建立模型、分析數據甚至資料清理不僅不像軟體開發有著悠久的歷史,與前人的經驗,知道開發中或是維護上會遇到哪些問題;又由於數據分析與建模常因為現況條件的不同與目標命題的差異,造成專案某些程度上需要探索、實驗與碟代優化;也因此模型/分析並沒有形成一體適用的”通用”程式架構;不過,多數數據工作者知道建立模型前需要資料清理、特徵擷取、模型選擇與建置、模型參數調校、結果比較,最後產出一個模型,透過上述的流程你會得到一個演算法;接著,還需要考慮

  1. 後續系統該如何串接模型結果?
  2. 如何監控模型是否持續有效?
  3. 後續建模的資料與當初拿到的資料是否擁有一致的特徵?

三、模型/分析的架構應該要包含哪些部分

在模型部署後,我們可以設計一個運行框架,它包含需要從DataBase撈資料進行模型訓練,訓練後檢查模型指標是否符合預期標準,符合則放到Model Service中供系統使用,而整個系統的核心是透過Model Service給予系統預測結果,提供分析服務給下游App,為了得到穩定一致的服務品質,Model Moitoring被設計用來觀測目前資料趨勢是否有改變,匯入模型預測的資料是否有異動或是格式改變的狀況,主要負責模型部署後,在使用中可能遇到的問題,並即時回傳給維護對象,掌握模型狀況。

根據系統使用情境,模型部署後可分為訓練模組、預測模組、監控模組

  • 訓練模組:從DB撈取資料進行資料處理、特徵擷取到建立模型,驗證模型指標有達標準後部署到服務器中,若無則返回並通知相關人士進行調整。
  • 預測模組:根據情況可能是API或是Function部署在系統中,主要使用對象是主服務及模型監控系統。
  • 監控模組
  • 從DB撈取近期資料傳入預測模組,檢查模型是否需要重新訓練。
  • 根據資料庫抽樣調查資料特定指標(偏態、離群值數量...)與前次訓練資料比對,檢查資料型態是否改變,若抽樣結果中改變的特徵多,則通知相關人員進行模型調整。

四、有了架構後,該如何實作到專案中?

以python為例,我們可以用物件導向程式設計(Object-oriented programming,OOP)來進行實作,以提高程式的重用性、擴充性與維護性;而要使用物件導向程式設計就必須對類別(Class)及物件(Object)有基本認識,在python中的class根據相關文件的解釋:

Class 提供了一種結合資料與功能的手段。建立一個 class 將會新增一個物件的型別 (type),並且允許建立該型別的新實例 (instance)。每一個 class 實例可以擁有一些維持該實例狀態的屬性 (attribute)。Class 實例也可以有一些(由其 class 所定義的)method(方法),用於修改該實例的狀態。

簡單言之,Class可視為Object的blueprint。就像製造一架飛機,會需要相應的設計圖,藉此知道此類飛機會有哪些特性與功能,Class就如同設計圖,用來定義未來產生Object時所擁有的屬性(Attribute)與操作方法(Method)。在python現有的演算法套件中,如scikit-learn,就有利用class做相關操作的案例,參考這些套件,可以在python中利用class架構,來開發、管理部署到系統中的演算法專案。

舉例來說:

# 專案利用迴歸建立模型,其建立一個class作為服務放置系統,架構圖應如下

一個class包含了資料的處理、模型訓練、監測、匯出與匯入,但架構並不唯一,需要根據實務上的使用,進行修改與調整。

參考文獻

  1. https://docs.python.org/