iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
1
Google Developers Machine Learning

Machine Learning with TensorFlow on Google Cloud Platform系列 第 17

鐵人賽Day17 - Feature Engineering (1/6)

特徵工程 (Feature Engineering)

主旨:了解特徵工程的領域有哪些

特徵工程常是建構ML專案中,花費最長時間的階段,因為在做特徵工程的時候,需要的不只是資料,通常還需要該領域的知識作為協助,才能得到好的特徵,在這個子課程中,我們將會講到:

  • 將原始資料轉為特徵
  • 前處理和特徵建構
  • 特徵組合(Feature Crosses)
  • TensorFlow Transform

將原始資料轉為特徵

在將原始資料轉為特徵(如下圖)的過程中,一開始要先知道,什麼樣的特徵是好的,什麼樣是不適當的。

好的特徵必須具備下列的條件:

  1. 和目標必須有關聯
    • 在同一領域的不同問題間,需要的特徵可能會不同
  2. 在預測時是可以知道的
    • 有些資料可以馬上就知道,但有些並不能即時獲得
  3. 數值大小是有意義的
    • 因為ML演算法本質上就是做許多不同的數學運算
  4. 有足夠多的資料
    • 經驗法則來說,每個特徵至少需要5筆資料
  5. 要將人類的洞見帶進問題
    • 找個你要解決問題的領域專家和自己的好奇心來想出所有可以用來當作特徵的資料

表示特徵

將資料表示成特徵的方式有很多種類,這邊將逐一介紹常見的類型。

最簡單又直接的當然就是數值資料直接轉變成特徵,如下面例子, price 和 waitTime 都是適合直接轉變成特徵,不需要再特別處理的例子。

而有些資料並不適合當作特徵,例如說代表個人身份的ID、代表每筆交易的Id,這些資料本身除了用來識別身份,並沒有可以用於實質運算ML模型的意義。

另一種就是種類的特徵(Categorical Feature),這類型的特徵直接轉成種類對應的數字就當作輸入特徵並不恰當,一般比較好的方式是使用 one-hot encoding 的方式,將種類的數字變成索引的位置,再作為輸入特徵才比較對ML運算有意義。

在實際建構的時候,會使用一個字彙對照(Vocabulary mapping) 的方式來做 one-hot encoding,這樣做的好處可以讓訓練和預測兩種不同階段使用的 encoding 相同,才可以保持預測的精準度。

對於種類資料的處理,下面是三種可行的方式:

  1. 訓練和預測直接使用同一個vocabulary
  2. 將種類數字建立索引
  3. 直接使用雜湊函數,再把數值分成指定的種類數目

另外要注意的是,有的數值資料雖然可以直接表示,但也可以因要解決的問題不同,將其轉變成類似種類資料的 one-hot encoding 如下圖。

處理資料缺失值的時候,數值資料可能比較簡單可以用平均值取代,但是種類資料就不行,有的人可能會多建一個種類給缺失的資料,但這並不是好的方式,比較好的方式是在 one-hot encoding 下,使用不同且可以區別的方式,例如說不同的維度或是全部是0。

機器學習和統計

機器學習和統計有蠻多類似的地方,卻也有不同的地方,在機器學習中,我們會使用大量的資料,留下離群的資料並且為這些離群值建構模型,然而在統計中,我們更傾向於捨棄掉這些離群值

但是有時離群值實在偏離太遠的時候,若在訓練時直接使用這些數值,將會造成運算上的急速變化進而傷害到模型的訓練,這時候我們就會使用限制最大或最小值的方式 (clip) 來減緩離群值差異所造成的不良影響。

[GCP Lab實作-11]:使用新的特徵來增加模型準確度

這個實作中,我們將學會:

  • 藉由合適的表達新的特徵來增加模型準確度

[Part 1]:新增特徵實驗

  1. 登入GCP,開啟Notebooks後,複製課程 Github repo (如Day9的Part 1 & 2步驟)。

  2. 在左邊的資料夾結構,點進 training-data-analyst > courses > machine_learning > deepdive > 04_features,然後打開檔案 a_features.ipynb

  3. 一開始先將資料讀取進來後,做簡單的資料探索,前面的實作也有提到使用 df.describe() 可以將基本的統計值顯示出來:

  1. 接著將訓練和評估的資料分割,切成80%/20%:

  1. 為了提升模型準確度,我們新增2個特徵,一個是一間房子平均有多少房間,另一個則是一個房間平均有多少人,這2個特徵和房價應該有很高的相關程度。

  1. 再來定義模型要作為輸入的特徵有哪些,分別屬於什麼種類,這邊可以試試看不用某些特徵得到的RMSE會變大或變小,另外,latitude我們使用 tf.feature_column.bucketized_column() 是因為從上面第3步觀察到最大是在42,最小是32.5,所以我們將其在32~42之間,重新分類,轉成新的數值輸入。

  1. 定義 train_and_evaluate() ,這邊就和之前幾天的許多實作一樣做法,定義 estimatortrain_speceval_spec

  1. 訓練模型並且輸出讓我們可以在 TensorBoard 監看訓練過程。

  1. 訓練結果 loss 的變化如下圖,如果今天重新訓練但是將上面的輸入特徵拿掉我們新增的2個特徵,那麼訓練結果的 loss 將會明顯的上升。


今天介紹了如何將原始資料轉為特徵,明天我們將介紹 “前處理和特徵建構”。


上一篇
鐵人賽Day16 - Intro to TensorFlow (6/6)
下一篇
鐵人賽Day18 - Feature Engineering (2/6)
系列文
Machine Learning with TensorFlow on Google Cloud Platform30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言