標題寫到模型的靈魂,為什麼是靈魂?因為模型的來源就是資料,我們給模型訓練的資料,會影響模型的表現。在 François Chollet《Deep Learning with Python, Second Edition》一書當中提到:「投入更多金錢和心力於收集資料得到的投資報酬率,大於投資相同資源於開發更好的模型」,資料集的篩選也會影響模型的泛化(Generalization)能力,所以資料集的選擇很重要。今天會介紹一些資料前處理的方法和經驗,之後可以依照自己的資料需求去做嘗試。
首先我們需要檢查蒐集的資料數量是否足夠,資料集整體的特徵會希望是和真實的母群體特徵是相近的,在挑選資料的時候,就要選擇目標的特徵。如果資料是需要做標註的,要檢查是否有標註錯誤,標註錯誤會影響模型訓練(即學習)的表現。如果有錯誤或不適合的資料,需要做資料清理(Data Cleaning),將它們刪除。
資料如果有缺失值,除了直接刪除之外,也可以做一些處理。如果缺失值為數值,可以取該特徵的平均數或中位數等統計方法,當作該缺失值,或是另外訓練一個模型去預測這個缺失值可能為多少;缺失值若為分類特徵,可以將缺失值作為一個新的分類。
可以透過統計方法來查看資料集的狀況與趨勢,並將異常值刪除或修正等。
有時候我們的資料間數值差距太大,可以使用標準化與正規化去做資料前處理,讓數值間的差距變小。
標準化(Standardization)的公式:
此方法稱為標準分數(Standard Score),亦稱做 Z-分數(z-score),其中 x 為要被標準化的數值,µ 為平均值,σ 為標準差。
正規化(Normalization)的公式:
此方法稱為最小-最大縮放(Min-Max Scaling)其中 x_max 為特徵最大值, x_min 為特徵最小值,將數值縮放至 [0, 1]。
如果要做的是分類問題,通常會將類別標籤轉換為數值(如 apple、banana、orange 轉換成 0、1、2),可以編碼成數值,或是使用 One-Hot Encoding(如 apple、banana、orange 轉換成 [1, 0, 0]、[0, 1, 0]、[0, 0, 1]),後者的方法可以避免數值差異太大影響模型學習。
通常我們訓練模型,會在訓練的每一個週期結束時,用驗證資料集去驗證模型。可以在資料集中挑選一部分作為驗證資料集,常使用的方法為拆分驗證集(Holdout Validation Set),例如挑選其中 20% 的數量作為驗證資料集,其餘 80% 則為訓練資料集。
通常不會直接拿原始資料(Raw Data)去訓練模型,會做資料前處理,但前處理的方式其實不只有這些,都要依照需求與目的去實現。例如 MRI 原始資料,需要透過專門的套件(如 SPM12)去做像是排列、校正與對齊等處理步驟,再做切片和轉檔等,或是如航照影像,會需要經過專門的處理軟體(如 ArcGIS)或套件(Python 的 rasterio 或 geopandas)去進行切割等,才能當作模型的輸入。
今天介紹了資料前處理的一些方法和小小的經驗,明天就會進入實作啦!