特徵工程常是建構ML專案中,花費最長時間的階段,因為在做特徵工程的時候,需要的不只是資料,通常還需要該領域的知識作為協助,才能得到好的特徵,在這個子課程中,我們將會講到:
在將原始資料轉為特徵(如下圖)的過程中,一開始要先知道,什麼樣的特徵是好的,什麼樣是不適當的。
好的特徵必須具備下列的條件:
將資料表示成特徵的方式有很多種類,這邊將逐一介紹常見的類型。
最簡單又直接的當然就是數值資料直接轉變成特徵,如下面例子, price 和 waitTime 都是適合直接轉變成特徵,不需要再特別處理的例子。
而有些資料並不適合當作特徵,例如說代表個人身份的ID、代表每筆交易的Id,這些資料本身除了用來識別身份,並沒有可以用於實質運算ML模型的意義。
另一種就是種類的特徵(Categorical Feature),這類型的特徵直接轉成種類對應的數字就當作輸入特徵並不恰當,一般比較好的方式是使用 one-hot encoding 的方式,將種類的數字變成索引的位置,再作為輸入特徵才比較對ML運算有意義。
在實際建構的時候,會使用一個字彙對照(Vocabulary mapping) 的方式來做 one-hot encoding,這樣做的好處可以讓訓練和預測兩種不同階段使用的 encoding 相同,才可以保持預測的精準度。
對於種類資料的處理,下面是三種可行的方式:
另外要注意的是,有的數值資料雖然可以直接表示,但也可以因要解決的問題不同,將其轉變成類似種類資料的 one-hot encoding 如下圖。
而處理資料缺失值的時候,數值資料可能比較簡單可以用平均值取代,但是種類資料就不行,有的人可能會多建一個種類給缺失的資料,但這並不是好的方式,比較好的方式是在 one-hot encoding 下,使用不同且可以區別的方式,例如說不同的維度或是全部是0。
機器學習和統計有蠻多類似的地方,卻也有不同的地方,在機器學習中,我們會使用大量的資料,留下離群的資料並且為這些離群值建構模型,然而在統計中,我們更傾向於捨棄掉這些離群值。
但是有時離群值實在偏離太遠的時候,若在訓練時直接使用這些數值,將會造成運算上的急速變化進而傷害到模型的訓練,這時候我們就會使用限制最大或最小值的方式 (clip) 來減緩離群值差異所造成的不良影響。
在這個實作中,我們將學會:
登入GCP,開啟Notebooks後,複製課程 Github repo (如Day9的Part 1 & 2步驟)。
在左邊的資料夾結構,點進 training-data-analyst > courses > machine_learning > deepdive > 04_features,然後打開檔案 a_features.ipynb。
一開始先將資料讀取進來後,做簡單的資料探索,前面的實作也有提到使用 df.describe()
可以將基本的統計值顯示出來:
tf.feature_column.bucketized_column()
是因為從上面第3步觀察到最大是在42,最小是32.5,所以我們將其在32~42之間,重新分類,轉成新的數值輸入。train_and_evaluate()
,這邊就和之前幾天的許多實作一樣做法,定義 estimator
、train_spec
和 eval_spec
。今天介紹了如何將原始資料轉為特徵,明天我們將介紹 “前處理和特徵建構”。