iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 21
0

特徵組合 (Feature Crosses)

主旨:了解特徵組合的目的與做法

在這個主題,我們將會學到:

  • 體會特徵組合是一種強大的方式可以幫助機器學習
  • 在 TensorFlow 實作特徵組合
  • 結合特徵組合在你的 ML pipeline
  • 使用特徵組合提升計程車費模型的表現

簡介特徵組合

如果今天有一組資料如下圖分佈,那麼很明顯的可以看出是線性可分的,可以直接使用兩個特徵 x1、x2 將其分開。

但是若今天資料是長的像下面這樣呢?很可惜的,你並沒有辦法簡單的使用特徵 x1、x2 就可以將其分開,我們稱作非線性可分

不過要是加入一個新的特徵 x3,它是兩個特徵的乘積,意即 https://chart.googleapis.com/chart?cht=tx&chl=x_3%3Dx_1x_2,這樣兩種顏色的資料巧妙的被分成正負兩堆,這時候資料就可以被 x3 這個特徵所分開了。

更仔細地說,我們是先將特徵 x1、x2 從中心點切開,讓特徵的表示變成2x2=4種不同的方式,這就是特徵組合的深層意義。

若考慮更複雜的螺旋狀資料分布,這時候我們可以切分成更多不同的區塊,讓特徵可以表示的方式更多,如下圖:

如此一來,每一小塊的特徵都將可以用來表示該區域的資料,例如說左上綠框是100% 橘色,右下綠框是 85% 藍色、15% 橘色,這種特徵組合的方式,在資料量大的時候變得很有用

one-hot encoding 的角度來看,今天 x3 若是 x1 和 x2 的乘積,那麼其維度將會變成 d(x1)d(x2),能表示的種類變得更多,但相對的矩陣也變得更稀疏(sparse)

再舉一個計程車分類的例子,今天你搜集了各個城市的車子顏色,要來判斷這台車子是不是計程車,這裡的特徵便是城市和車子顏色。

若單獨將兩個特徵獨立用來訓練線性分類模型,那麼將有很大的部分會被顏色黃色所決定是不是計程車(因為大多數的城市計程車都是黃色的),但是你知道這一定會有問題,像是羅馬或日本的計程車就不見得是黃色的,那麼你的線性分類模型勢必不太準確。

這時候若引進了將城市和車子顏色特徵組合後產生的新特徵 x3,那麼黃色還會配上各個城市,例如說黃色紐約的權重會比較大,但是黃色羅馬的權重就會很小或是0,因此透過特徵組合就可以大幅的提升線性分類模型的準度

特徵組合這個方式,可以想成是透過離散化 (discretization) 來將資料記憶 (memorize) 起來,這種方式對於ML模型的泛化是比較不好的,但若資料量越大的時候,就越好用,某種程度可以說是泛化的問題被大量的資料給保證了

那你可能會問,這麼做不就和神經網路差不多嗎?那我幹嘛還需要這麼麻煩用特徵組合啊?沒錯,神經網路確實強大又好用,然而使用特徵組合的優勢在於你還是可以使用線性模型,就可以達到不錯的表現。

可是為什麼要糾結於 ”線性模型“ 呢?答案跟模型在優化的時候,是不是凸函數有關!一般多層的神經網路在使用梯度下降的時候,損失函數並不保證一定是凸函數,換句話說,並不能保證你找到的最小值是全域最小值,通常都是局部最小值,然而若使用線性模型的話,就保證是凸函數,這樣優化找到的最小值就一定是全域最小值了。

實現特徵組合

而實作特徵組合的時候我們需要注意什麼事情呢?最重要的當然是要組合的特徵需要是種類特徵,如果是數值特徵的話,就必須要先 bucketized

在 TensorFlow 中,特徵組合的運作是使用雜湊函數,因此後面用來取餘數的參數 (24*7) 就很重要,如果選得太小的話,很容易造成特徵之間的衝突 (都落在同一種類),但選得太大的話又會變得很稀疏

在特徵組合後,若覺得表示的特徵太稀疏的話該怎麼辦呢?別擔心,我們可以使用一個很重要的方法:嵌入(embedding),透過 embedding 的方式,我們可以將組合後的特徵嵌入至一個比較低維度的空間,以下圖為例就是降成 2 維的 embedding,最後再藉由這個 embedding 做後續的模型判斷。那麼 embedding 的值怎麼來的呢?只要我們給定好它的維度,裡面的值就是透過梯度下降等優化過程,自動會學到的。(這裡也是我以前初學的時候,一直搞不懂的點,希望這個說明可以對第一次接觸 embedding 的人有點幫助)

另外值得一提 embedding 強大的地方就是,當你在 A 問題學出一組 embedding 後,你可以在相似的 B 問題,將 embedding 遷移過去使用,不需要從頭開始訓練一個新的模型,就可以有不錯的表現,這就是大家會聽到的一種遷移式學習(Transfer learning)

了解這些特徵工程後,就要問說那我們該在哪個地方做特徵工程?答案有3個可能的地方:

  1. 訓練模型時
    • input_fn
  2. 特徵生成
    • Dataflow
  3. 前處理
    • Dataflow
    • tf.transform

總結來說,特徵組合就好像是把地圖切分成好幾小塊後,嘗試將每一小塊地區內的資訊記憶下來,而隨著大量的資料,這種方式使得線性模型也可以變得非常強大。

[GCP Lab實作-15]:利用特徵工程來增進ML模型

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

  • 在 TensorFlow 中加入特徵組合
  • 從 BigQuery 中讀取資料
  • 使用 Dataflow 建構資料集
  • 使用 wide-and-deep 模型

[Part 1]:特徵工程

  1. 登入 GCP,並在 storage 創建一個 bucket。

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

  3. 先安裝 Apache Beam 在 Python2 的相關套件:

  1. 設定環境變數名稱如 PROJECT、BUCKET、REGION 等等:

  1. 將原始資料用 BigQuery 撈出來:

  1. 定義資料的前處理後,在本機端運行:

  1. 看看前處理完後的檔案:

  1. 送到 Dataflow 上做前處理,處理完後一樣看看檔案:

  1. 第一塊檔案(train.csv-00000-of-*)的開頭:

  1. 將第一塊檔案載下來做本機端的模型訓練:

  1. 在本機端訓練:

  1. 訓練完後可以看看版本號

  1. 寫一個測試的 JSON 檔來做預測看看,預測的車錢約是 12.63 元:

  1. 將模型送到 GCP 上做訓練,訓練好後在用剛才的測試檔案預測看看,預測的車費約是 11.30 元:

這次的實作特徵組合的部分是在另一個程式檔案 model.py 裡面,所以要知道詳細的語法可以參考這裡,裡面也有 wide-and-deep 模型的用法歐!


今天介紹了特徵組合,明天我們將介紹 “TensorFlow Transform”。


上一篇
鐵人賽Day20 - Feature Engineering (4/6)
下一篇
鐵人賽Day22 - Feature Engineering (6/6)
系列文
Machine Learning with TensorFlow on Google Cloud Platform30

尚未有邦友留言

立即登入留言