[資料分析&機器學習] 第2.4講:資料前處理(Missing data, One-hot encoding, Feature Scaling)

Yeh James
JamesLearningNote
Published in
Oct 10, 2017
2021/07/21 更新
In [25]: 原先的程式碼為 df['C'] = df['C'].fillna(df['C'].mode())
由於 df['C'].mode() 回傳的格式是一個 series,需把它轉為數字格式
df['C'] = df['C'].fillna(df['C'].mode()[0])
或是
df['C'] = df['C'].fillna(float(df['C'].mode()))
才能得到正確結果

資料的品質、特徵的選取決定了機器學習的上限,模型(Model)只是逼近這個上限。雖然在學術界總是以Model為主要討論對象,但實際上在業界80%的時間都是在對資料進行前處理,包含了資料獲取、清理、特徵選擇、特徵處理…到這裡我們可以稍微了解資料前處理的重要性。

當我們把資料輸入進Machine Learning的Model時,常常需要對資料先做一些前處理,提升Model的預測效果。主要是因為Machine learning的model是利用空間中的距離來做回歸或是分類,因此如果有缺值,就沒辦法在空間中表示出位置,所以需要補值。如果是類別資料用1, 2, 3來表示第1類、第2類、第3類會因為第3類比第1類數值還要大,在空間中會造成離原點距離較遠,因此需要使用one-hot encoding來處理。特徵縮放主要是可以幫助大部分的Model可以更快收斂並提升準確度。

常見的資料前處理如下所示:

  1. 缺失值的處理
  2. 類別資料的處理(有序、無序)
  3. 資料特徵縮放

當然除了這三點之外,還有很多進階的資料前處理,比方說去掉一些不重要的欄位或是利用某些欄位去組合產生出新的欄位,都能夠提升Machine learning的預測準度。在資料前處理時,除了要對統計以及Model(像是Random forest 比起其他model少去很多資料前處理)知識有一定的了解之外,還必須具備有一定的產業知識(Domain Knowledge),因為在不同產業的處理方式也會不太一樣,接下來就一一介紹吧

1. 缺失值的處理

缺值主要處理方式有兩種:

  1. 丟棄,如果資料量夠多
  2. 補值

常見補值方式有補固定值、平均值、眾數、中位數。較進階的補值方法有最近差補法(在資料中找與缺失樣本最接近的樣本來補足缺失的特徵)回歸方法(對帶有缺失的特徵根據其他的特徵屬性來建立回歸模型補值),或是用插值法(拉格朗日插值法)

首先創立一些包含空值的csv並匯入Dataframe

創立包含空值的Dataframe

使用Pandas去空值的方法“dropna”,dropna預設只要任一欄位有空值,就會整筆刪掉。可透過參數來調整,像是把how設為all,就是要全部為空才清掉,或是用subset指定當某一欄為空時才刪。

pandas 去除空值的方法

補值則使用fillna函式即可,依照以下範例即可補上固定值0、平均數、眾數、中位數…

Pandas補值方法:固定值0, 平均數, 眾數

2. 類別資料的處理(有序、無序)

由於要在空間中表示點,所有的特徵都需要是數值,因此如果是類別的資料,像是XL,L,M,S,XS或是資料類別為Male, Female, Not Specified,就需要轉成數值才能在空間中來表示。有序的類別資料通常是直接使用數值替換,比方說XL, L, M, S, XS雖然是類別的屬性但因為有大小順序的關係,可以用10, 7 , 5, 3, 1來替換。如果是Male, Female, Not Specified因為這三種都是等價的關係因此需要找一個方法讓這三個屬性距離原點是相同距離,One-hot encoding 就是解決這的問題的方法,首先會將Male, Female, Not Specified由Gender從成一個欄位拆成三個欄位,因此編號1的使用者的屬性資料就是(1,0,0)編號2的使用者就是(0,1,0) 編號三個使用者就是(0,0,1)這三個使用者對於原點的距離都是1,就達成我們想要的結果了。但One-hot encoding的方法只適合類別種類少的形況下,如果類別種類太多就會產生出一大堆的特徵,造成其他的問題(比方說維數災難)。

One-hot encoding 示意圖

首先先創立一個Dataframe,我們可以看到color跟size都是類別資料

由於size是屬於有序的資料,我們只要稍微轉換為數值即可

將有序類別資料轉為數值

至於color我們就用onehot-encoding的方法來處理,在pandas裡面要使用onehot-encoding使用get_dummies這個函式就可以了,範例如下

one-hot encoding在Pandas的用法

3. 資料特徵縮放

特徵縮放是資料前處理的一個很重要的關鍵,只少有部分的Model不需要做特徵縮放,像是決策樹以及隨機森林。需要特徵縮放主要是因為Model背後是用空間中的距離來做區分,假設某一個特徵過大,該Model的成本函數會被這個特徵所支配。另外在吳恩達的機器學習課程中有提到特徵縮放後能夠讓我們在做梯度下降時收斂更快。

舉例來說當某一個特徵範圍在零到兩千之間、另一個為一到五,當我們在做梯度下降時,整個等高線圖會呈現橢圓的形狀,因此收斂時沒辦法直接朝圓心(最低點)前進。若有更多興趣可參考吳恩達在Coursera上的課程。

吳恩達機器學習課程內的特徵縮放

簡單來說特徵縮放主要有兩種方法(這兩種常被混淆):

  1. Normalization(據我了解中文翻譯還沒固定,有歸一化、常態化、區間縮放等等…正規化這個詞已經被解決overfitting 的 regularization拿去用了XD)
Normalization

最常見的Normalization為0–1區間縮放,經過Normalization之後資料的範圍會介在0~1之間,原本的最大值變為1,最小值變為0,具體作法如下圖

Normalization in Pandas

2. Standardization(標準化)

Standardization

經過Standardization資料的平均值會變為0, 標準差變為1,具體作法如下圖

Standardization in Pandas

對於新手來說這兩種選其中一種用即可。對於有經驗的同學,我稍微說明一下這兩種差異,經過Standardization之後,資料會符合常態分佈,不會有偏單邊的形況,由於常態分佈機器學習的加權迭代學習(梯度下降)可以更容易完成。另外Standardization還可以使離群值(outlier)對整個model的影響大大減低。

程式碼

感謝你閱讀完這篇文章,如果你覺得這些文章對你有幫助請在底下幫我拍個手(長按最多可以拍50下手)。

[Python資料分析&機器學習]這系列文章是我在Hahow上面所開設課程的講義,如果你是新手想著看影片一步一步學習,可以參考這門課:https://hahow.in/cr/pydataml

如果你對什麼主題的文章有興趣的話,歡迎透過這個連結告訴我:https://yehjames.typeform.com/to/XIIVQC
有任何問題也歡迎在底下留言或是來信告訴我: yehjames23@gmail.com

延伸閱讀

  1. 拉格朗日插值法
  2. 機器學習中,有哪些特徵選擇的工程方法?

--

--