R語言自學日記(7) - 其他資料預處理技巧

Edward Tung
R 語言自學系列
10 min readJul 22, 2018

前言

今天要介紹幾個資料預處理(Data Preprocessing)的方式,我們已經在資料清洗環節中提到不少處理資料的方式,而預處理跟資料清洗比較不一樣的是,資料預處理是基於模型調整的,意味著相比資料清洗的直覺意味,其中的數學意味更濃厚一點,也使得輸入模型的時候可以更精準,比如說機器學習與深度學習的輸入前節點都有不少預處理環節。

當然,我們並不會提到太過Model-based的處理方式,比方說前兩章提到的差分後定態,我們在這裡簡單介紹一些常見且泛用的處理方式:

測試集、訓練集與驗證集(Training Set, Test Set and Validation Set)

在導入模型之前,我們通常會把資料拆分成訓練集與測試集,訓練集的意思是用來讓模型學習的資料集,而測試集就是用來測試結果的資料集(當然還有驗證集,我們待會介紹)。舉例來說,我們可以拿訓練集來建構一個簡單的迴歸方程式,包括他的係數、截距等等,並且透過比較該模型在預測新資料的結果與測試集中的正確結果,我們就可以知道這個模型的效果好不好,一般而言,訓練集與測試集的比例大約從7:3到9:1不等,目前學術界似乎也沒有公定標準,因此選擇上可以隨意一點無妨。在這裡,我們展示一下透過caTools中的資料集切分來替mtcars資料集建立一個簡單的線性迴歸模型:

可以看到,從訓練集中建立出的模型參數截距與係數如上,估計式為Y=594.80–18.18X,以及誤差值,F統計量等等,另外也顯示了R-Squared的統計量,大約在0.7,而下一步,我們就拿這個模型做預測並且比較其與測試集的結果:

基本上這樣做的好處很明顯,當我們想要檢驗模型效度,一般而言我們很難以等到新進資料進來才開始檢驗模型效度,舉例來說我們不可能等到一個月後才來檢驗我們的股價預測模型是否準確,因此我們會傾向於拿自我資料來做檢驗。但這樣做的缺點也很明顯,我們怎麼知道該模型不是只適合訓練集?也就是說,這個模型容易有過度配適(Overfitting)的問題:

因此,我們必須引入驗證集,也就是再透過一組資料來調整我們的參數

Source:magizbox.com

我們這邊並不會特別詳述如何調整參數,因為那可以說是機器學習中最難且最關鍵的環節,但是透過驗證集,我們後期可以做交叉驗證(Cross-Validation),透過重複切分資料、訓練模型,大幅度提高準確度。關於交叉驗證我們會在之後說明,這邊可以先謹記測試集與訓練集就好。

特徵標準化 (Feature Scaling)

甚麼是特徵標準化?簡單來說就是我們需要把資料做縮放,讓不同資料放在同一區間上比較,最常見的方式就是標準化,也就是這東西:

這個公式強制把所有不同範疇(Scale)的資料放在相同的區間上進行比較,此時數據集的平均數為0,標準差為1,很大程度上消弭了範疇不同難以比較的問題,比方說身高體重、年齡與年收入等,以下我們來展示如何在R語言中實現以及視覺化效果,使用scale()函數即可:

可以看到,標準化以後的資料可以被放在同樣的範疇裡面被檢視,方便我們站在同一個標準上去檢驗這些資料,同樣地,對於某些需要消除掉標準差差異的模型來說,特徵標準化會是一個非常有用的前處理方式。

虛擬變數 (Dummy Variables)

虛擬變數其實就是把類別資料轉換成數字資料的方式,舉例來說:

Source:陳旭昇,時間序列分析

上面的表格就是虛擬變數的範例,我們會把n個類別轉碼成n-1個虛擬變數,比方說上述的冬季,只要讓電腦理解[0,0,0]就可以了,這樣做的好處一是讓電腦能夠更快速的運算,相比於處理文字資料,處理數字符號永遠都要快速的多,二來當我們轉換成矩陣之後,就可以支援很多複雜的統計運算。

以下我們來展示如何將mtcar的資料集轉換成虛擬變數,順便演示用Regex取代資料的方法,原因是因為對於Toyota Corona與Toyota Corolla,我們只希望它統一叫做Toyota即可,原始資料長這樣:

以下一步步展示如何創建虛擬變數,首先我們希望將每個車款的第一個單字作為虛擬變數的創建對象:

下一步就是要創建虛擬變數,這邊跟Python很類似的是你必須先將類別變數轉換成數字變數,不同的是Python使用LabelEncoder將各個類別編號,而R語言我們則使用Factor來轉換資料格式。

以上就大功告成,因為我們只摘取前六筆資料展示,因此並沒有看到[0,0,0,0]這樣的變數存在。

維度降減 (Dimensionality Reduction)

實際上維度降減可以應用的範圍太多,當然他可以做為資料前處理的一環,但也可以搭配其他的演算法來做到分群分析、特徵解釋等等的效果。同樣,維度降減的方法與實務應用非常之廣,舉例來說,我們可以透過維度降減來壓縮圖片,進而找出物體輪廓:

Source:https://www.projectrhea.org

在上面的例子中,一張 512x512 的灰階圖片以X來表示,並且透過主成分抽取來壓縮圖片,這背後應用到的原理是透過矩陣將原有的資料集線性或非線性投射到低維度,所以我們很常看到的是某主成分是ABC好幾個變數的線性組合,而這提供我們幾個好處是,一來我們並不需要處理高維度的資料,而能夠專心著眼於少數主成分,後期解釋起來要方便得多,二是這些主成分可以有效處理共線性(Collinearity)的問題,並有效幫助我們篩選變數,這是也是我將維度縮減特別放出來說明的原因。

接下來,我們將要應用線性主成分分析(Linear Principal Component Analysis),也就是上面壓縮圖片提到的方法來對mtcars的資料做處理,這只是維度降減中的其中一個方法,但其他的就不再這邊贅述,至於詳細的數學推導,我放在最後一段。首先,我們從原始資料中抽出我們想要用來做維度降減的變數。

在這裡我們做特徵標準化以避免範疇不同,下一步我們就可以導入主成分分析(PCA)了,這邊我們使用caret與e1071來執行PCA,假設我們希望將這七個變數降減到兩個,我們可以這樣輸入代碼:

可以看到很明顯地我們的七個變數只剩下兩個,但我們還有兩個問題:

第一、 我該選擇幾個主成分比較合適?這個問題我們透過Scree Plot來選擇,代碼如下:

關於解釋變異量的數學含意可以參考下面說明,直觀上的意思是隨著主成分的增多,可以解釋資料集裡頭總變異量的百分之多少。我們可以看到我們選擇兩個是有根據的,兩個主成分就可以達成90%以上的解釋變量,我們就沒有必要再加入第三個(因為此時加一個新的主成分也才多5%而已)

第二、每個主成分背後應該怎麼解釋?這邊我們則引入相關係數的概念來做解釋,針對兩個主成分分別去看他們與七個X變數的相關係數高低:

我們就可以從兩個主成分中去猜測其與每個變量的關係,進而去命名這兩個主成分以供前端分析或其他應用使用。

PCA原理簡介

接下來要來講解數學了,同樣,不想看可以直接跳過!完全不影響的。

對一個擁有p個變數資料集X而言,我們認為可以得到p個主成分Y,每一個主成分Y都會是X的線性組合,可以寫成以下的表達式:

直觀一點的意義就是,當我們的X個變數可以透過線性組合成Y個主成分時,這些主成分實際上是有意義的,比方說Y1 = 0.8X1 +0.01X2,我們可以說Y1跟X1的關聯性非常強。然而實務上,我們希望主成分的數量遠少於p,這個時候就會遇到一個問題,這些主成分加在一起實際上能夠解釋多少X的成分,很直觀吧,比方說我們認為美醜這個評斷標準可以用來概括一個人身高、體重、五官位置等不知幾百種變量,你下一步思考到的是,美醜這個評斷標準有辦法解釋所有這些變數嗎?又能夠解釋多少?

我們這邊用的評斷標準是變異數,也就是p個X變數加總起來的所有變異數作為我們的總變異量的話,m個(m<=p)主成分能夠有多少的解釋變量,在這裡我們必須先提出一個概念叫做特徵值( λ,eigenvalue),詳見以下:

上面推導出的結論是,Y的共變異數矩陣其實只與其特徵值相關,也就是說我們可以用以下的方式來衡量每加一個主成分會多出多少解釋變量。

這就做為我們在選擇主成分數目上的標準,我們可以透過Scree Plot來檢視主成分數量與總解釋變量之間的關係:

以上面情況來說,通常我們會選擇三個主成分變量,也就是尋找肘點(Elbow Point),我們可以發現光是三個主成分就占了大約75%的總變異量。這同時也告訴我們,維度降減的壞處是在於會有資訊遺失(Information Loss),這就必須靠分析師的判斷來做變量數目篩選的決策了。

此時我們還想知道的是,每個主成分與某變量之間的關聯性大不大,舉例來說Y1跟X3,X5,X6有關,Y2跟X4,X7有關等,我們可以引入相關係數的概念:

當然,以上的算法都是建立在資料集有線性關係的時候,並且都是未經過標準化的,對於非線性關係的資料集我們當然還有其他的方法可以做維度降減,比如Kernel PCA, Spectral Embedding, LLE等等,但這邊就不一一列舉了。而標準化實際上也只是平移與縮放,相關的性質實際上也是基於以上的特質去平移縮放,因此此處就不特別說明了。

總結

看完了資料預處理,我們接下來要更進一步地去探討如何去處理時間序列的季節性資料與趨勢性資料,如果你喜歡我的文章,還請幫我按Clap喔!

--

--

Edward Tung
R 語言自學系列

Columbia Student || 2 yrs of data scientist and 1 yr of business consultant experience