在這個主題,我們將會學到:
如果今天有一組資料如下圖分佈,那麼很明顯的可以看出是線性可分的,可以直接使用兩個特徵 x1、x2 將其分開。
但是若今天資料是長的像下面這樣呢?很可惜的,你並沒有辦法簡單的使用特徵 x1、x2 就可以將其分開,我們稱作非線性可分。
不過要是加入一個新的特徵 x3,它是兩個特徵的乘積,意即 ,這樣兩種顏色的資料巧妙的被分成正負兩堆,這時候資料就可以被 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個可能的地方:
input_fn
tf.transform
總結來說,特徵組合就好像是把地圖切分成好幾小塊後,嘗試將每一小塊地區內的資訊記憶下來,而隨著大量的資料,這種方式使得線性模型也可以變得非常強大。
在這個實作中,我們將學會:
登入 GCP,並在 storage 創建一個 bucket。
開啟Notebooks後,複製課程 Github repo (如Day9的Part 1 & 2步驟)。
先安裝 Apache Beam 在 Python2 的相關套件:
這次的實作特徵組合的部分是在另一個程式檔案 model.py 裡面,所以要知道詳細的語法可以參考這裡,裡面也有 wide-and-deep 模型的用法歐!
今天介紹了特徵組合,明天我們將介紹 “TensorFlow Transform”。