科學是以嚴謹的態度提出證明的過程。資料科學作為「科學」的一份子,如何達到「嚴謹」?有兩個必要條件,其一是客觀的評估方法,另一個可重複性的結果(reproducibility)。本文逐步說明在建立模型上,如何達成科學的「嚴謹」要求,以盡可能確保應用模型後的有效性,以及在建立模型時常被忽略的地方。
如果忘記什麼是預測性資料分析,可以在資料分析的三大目的中找到相關說明,並在資料分析的流程中可以看到建立模型在資料分析流程中的位置。
預測性資料分析的重點在於盡可能準確預測,並且經過嚴謹的評估,確保上線後同樣可以精準預測。那麼,在建立模型的時,如何「盡可能」客觀評估模型效果呢?
一個初步的作法,是將總共1,000筆資料來訓練模型,接著預測這1,000資料的結果,來看模型的是否學得夠好。不過這樣有「資訊洩漏(Information Leakage)」的狀況,指的是用來驗證的資料訊息,被透露在模型訓練的過程之中。也就是說,模型可能只是把訓練資料的答案背起來,如果換了考題(其他用來驗證的資料),模型的表現就不一定好,而這就是「過度配適(over-fitting)」,指的是模型對於用來訓練的資料表現很好,但是在測試資料上表現卻相對差了取多。而且,原始作法並無法事先評估模型在未來新資料預測的準確率上表現如何,貿然部署上線應用,模型預測不如預期的風險較高。
那麼,有什麼方式可以相對客觀的評估模型預測結果?可以將總共1,000筆資料,在還沒開始訓練這些資料時,先將其中的200筆分割出來並鎖在保險箱裡(測試集,testing set),用剩下的800筆訓練模型(訓練集,training set),完成模型訓練後,預測這200筆資料的結果,以驗證模型準確率。這樣的方式的好處,在於我們透過僅有的1,000資料,就可以預估對於模型沒看過的資料,它的預測表現如何。但是,當我們發現模型對於測試集預測結果表現不好,我們就會對此調整模型的超參數(hyperparameters),經過反覆多次的「調整超參數→訓練模型→測試預測結果→調整超參數→...」的循環,會變成將模型訓練成測試集的形狀,也就是在測試集上過度配適;對於未來真的實際上線後,預測結果仍然未知。
有什麼方式,讓我們可以調整模型超參數,同時避免在測試集上過度配適嗎?想法很單純,就如同切出測試集一樣,不過這次是將原本800筆的訓練集資料,在訓練過程中,分為訓練集和驗證集(validation set),用前者訓練模型、後者評估不同超參數的表現結果。但如果從頭到尾都是用800筆中,同樣的640筆訓練、另外的160筆驗證,這樣最後模型調校出來超參數,變成在驗證集上過度配適,對於測試集(保險箱中的那200筆)的預測結果,可能一樣不符預期!
這時候需要就需要引入交叉驗證(cross validation)!也就是說,假設我們把原本的 800 筆資料,隨機切成 5 等份,在給定一組超參數的情況下,每次以其中 4 份訓練模型,另 1 份評估,這樣做了 5 次之後,將 5 次模型評估的結果平均,作為該組超參數的表現結果。如此一來,每 1 份(或是說每 1 筆)資料,都被用來訓練和評估過,沒有浪費任何資訊和偏誤,而模型也不是針對特定一組資料選取超參數,可以避免過度配適的狀況。這樣完美地避免資訊洩漏和過度配適了,是嗎?
模型訓練不只是要針對超參數調整,在特徵工程(feature engineering)上,有時影響力更勝模型的超參數。特徵工程指的是,在資料面上,將原始資料轉換(transform)、組合(combine)、萃取(extract)或是選擇(select)的工作,目的在於使資料在建模中有更大的資訊量,以利模型學習。例如:將身高、體重的資料,計算為身體質量指數(BMI),為了使模型更有效學習以預測肥胖的風險。
我們在訓練模型中,往往會將資料進行最大最小標準化,使變數範圍介於0到1之間,利於模型收斂(或是說「利於模型完成訓練」)。此時,在沒有分割訓練集和驗證集的情況下進行特徵工程,例如訓練集的BMI範圍是16.2到25.3,而驗證集為16.5到25.7,則變數範圍的上限就會是驗證集洩漏資訊的結果。
所以,需要將特徵工程等流程,在執行交叉驗證時應用。也就是說,切成 5 等份的交叉驗證過程中,使用其中 4 份訓練模型之前的特徵工程時,要以這 4 份執行的例如上下界範圍作為範圍,並應用到另 1 份的驗證上,以此類推,避免特徵工程的資訊洩漏。
透過上述的 4 個嚴謹程度的邏輯發展階段,可以分成 4 個等級。
在社會科學的碩博士論文相當常見等級 4 的作法,例如:透過所有資料直接執行多元線性迴歸並解釋結果,但這並非表示這些研究不夠嚴謹或成果不重要,而是這些碩博士論文的目的,在於提出一個具有足夠「解釋能力」的模型。
在執行難度上,要達成等級 3 ,可透過一般將資料分割訓練集和測試集的套件(如:sklearn.model_selection.train_test_split),可以很容易達成;等級 2 則是透過交叉驗證的套件(如:sklearn.model_selection.GridSearchCV),也不算困難;等級 1 則是需要能夠組合資料分割、交叉驗證、特徵工程的pipeline(imblearn.pipeline.Pipeline),才可以達成相對嚴謹的評估結果,但若實際了解整個運算流程,其實也是組裝積木的概念,難度也不是相當高。
建立模型的方式相當多元且容易,但模型評估本身就是門學問,如何執行客觀、可靠、有效的嚴謹評估方式,對於模型的部署上線應用至關重要。本文針對模型評估的嚴謹性提供邏輯發展上的推演,藉此說明模型評估嚴謹程度的不同等級,等級切分的依據包含:是否分割測試集、是否交叉驗證執行超參數搜索、是否納入特徵工程於交叉驗證中;文末列出相關的套件,供讀者進一步研究可以如何整合應用。
文中提到「過度配適」和「資訊洩漏」兩個專有名詞。前者幾乎是機器學習或資料分析界中無人不知,但後者卻乏人問津;可是,資訊洩漏的狀況,有時可能才是導致過度配適的根本原因。
本文無意評價許多實務上可能在模型評估上不夠嚴謹的作法,而是提出相對嚴謹的方式供參考,而對於交叉驗證的概念目前也沒有特別說明,讀者可以自行搜尋參考,或是之後有時間的話再另文說明。
如果你有任何建議、想法或問題,都歡迎留言跟我分享,謝謝。