詳解特徵工程與推薦系統及其實踐
11月13日,雲腦科技機器學習訓練營正式開營,本期訓練營由科賽聯合雲腦科技打造,中美大咖導師授課,精心指導學員解決機器學習中的實際問題,為人工智慧行業培育高潛力人才。
K-Lab在線數據分析協作平台為本次訓練營提供全程支持,訓練營學員可在瀏覽器中方便、快捷地進行數據處理、模型搭建、代碼調試、撰寫報告等分析工作,實現在線「報名-AI應用演算法案例學習與實踐-作品在線提交-能力測評與篩選」的一站式學習。
目前第一期大咖分享內容已出爐,以下是分享內容實錄~
分享內容簡介
主題:億級用戶電商平台推薦系統挑戰
主講人:張本宇(雲腦科技創始人&CEO)
從事人工智慧十八年的老兵,曾就職於微軟亞洲研究院、Google和Facebook,在AI方面手握了150項美國專利,在國際一流期刊及會議上發表的45篇論文已被引用超過6000次,創新工場最新研究《AI領域,中國人/華人有多牛?》中,張本宇位列「華人前10位大牛科學家」。
內容要點:
- 協同過濾 Collaborative Filtering
- 特徵工程 Feature Engineering
- 推薦系統實戰注意點
機器學習中的特徵工程
首先我們看一下機器學習的五大環節。
一是特徵工程。第二是演算法定義和調參,就是你該選擇什麼樣的演算法,用什麼樣的參數進行調節。第三是數據採集和清洗,接下來是實現這個演算法並進行優化。『I』代表和業務生產系統集成,所以我們就會簡稱為FaDAI這五大步驟。特徵工程是這五大環節最重要的一部分。
我們會簡單介紹一下特徵工程,以及一些常見的特徵工程的方法。
引用一下吳恩達的話:「應用機器學習其實就是在做特徵工程,特徵工程是非常難、耗時、也是需要專業知識的一個工作。」我們理想中機器學習的情況:有很乾凈的Raw data,然後變成可學習的Dataset, 通過某些演算法學出某些模型,然後解決一個問題,這是最理想的一個狀態。但現實中,我們會有各種各樣的數據,有的從資料庫來,有的從日誌來,有的從半結構結構化文檔來,有的從無結構的音頻、圖片中來。從中抽取什麼特徵,才能夠被我們機器學習所使用,從而能學習出模型解決出問題呢?
變數類型的特徵工程
接下來我們看一下針對變數類型的特徵,這裡實際上有幾大類的變數類型。有分類型的特徵變數,也有數值型的特徵,還有兩個比較特殊的是時間和空間,接下來我們也會一一介紹。
1.離散型特徵
對於離散型的特徵枚舉一些例子:你的操作系統是什麼類型?有可能是桌面,有可能是平板,有可能是手機。那你的user_id是什麼?有121545,或者別的一些id。 這種類型的特徵是最需要特徵工程的,因為它的取值空間非常巨大,經常會導致稀疏數據。所以說從效率和精度上來說,都是對模型一個巨大的挑戰。
那最簡單的一個特徵工程,叫做One-Hot encoding。舉例來說,platform這個維度有三個取值:desktop、mobile、tablet。 那我們可以轉換成三個特徵,如果平台是在desktop上,那這個特徵就取1,如果在mobile上,那這個特徵就取1,如果在tablet上,那這個特徵就取1,這是一個非常稀疏的結構。舉例來說,如果有十萬個站點,那就十萬維,這是十萬維只有這一個維度上取1,其他都取0。
一種比較常見的方法就是做Hash Encoding。舉例來說:有200多個國家,用Hash的方法把它轉化為100多列,但用剛才One-Hot的方法就有200多列,但用Hash方式表達,參數是可調的,所以它可以縮成100、50,甚至10。那它會有一定的代價,比如說巴西和智利被放在一列,但是這兩個國家可能有不同的特性,但他們必須share同樣的位置。這是它們潛在的一個問題,但稀疏性是可以控制的,也可以處理低頻和一些新的變數。這裡隱含的條件是有一個假設,這個假設是有些特徵可以share同一個位置。這個假設在深度學習中也會有使用。所以在實踐中發現很多時候並不會影響實際的結果,只要你的參數空間相對是足夠的,就是它有足夠的表達能力。這個也是相對比較常見的一個方法 像有些比較知名、開源的機器學習的工具都有這樣的一個功能。
另外一個是計數型的Encoding,就是把它變成全局的count。比如廣告id:423654,他看了多少次,點擊了多少次,直接把它轉化成一個統計量,可以是觀看的次數,點擊的次數,廣告的CTR。就是用不同的id,每個id有不同的權重,變成浮點數上的一個特徵,共享一個權重。這裡有一個假設,它跟全局統計有某種線性關係,或者在某個轉化空間之後有線性關係。
2.異常值
還有一個是我們關心的異常值對整個統計的影響,那我們可能就從絕對值改為一個相對值,相對值就是它排序的一個次序,比如說按CTR排序,最好的CTR有什麼特徵。
最後是在神經網路中常見的做法,就是把分類變數轉換為嵌入式變數,做Embedding。比如說你有十萬個不同sites,把它投影到64維或者128維的vector上面,相當於原來需要十萬個Free parameters,現在只需要64維或128維。之所以能這樣做,原來的十萬維空間是非常稀疏的,64維或者128維是更稠密的表達,所以還是有非常強的表達意義,好處就是內存需求會更少,相對來說精度也會更高。
有同學問Hash和Embedding的區別,Embedding本身是需要學習出來的,比如說id1它投影到怎樣的Embedding空間,通過學習來獲得。而哈希是通過預定義的哈希函數,直接投影過去,本身的哈希函數是不需要學習的。這裡它最基礎的邏輯是不一樣的,Hash Encoding也就是說你這兩維特徵可以share相同的weight。比如說巴西和智利放在同一列中,他們有相同的權重,而Embedding實際上是一種distributional的表達方式。它的意思是說巴西可能使用64維上不同取值來代表,智利也是同樣用這64維,所以這64維,每一列都參與表達不同的國家,每一個國家都由這64維來表達。它們兩個的基本思路上是有所區別的。
3.數值變數
我們現在進入到數值變數,數值變數主要有兩種,一種是浮點數和一種是定點數,定點數也就是整數。很多時候數值變數也可以當成模型的直接輸入來使用。但是基本上也都需要一定的特徵工程,因為實踐中它的取值範圍會很分散,實際上對模型的影響也比較大。
首先我們看一下缺失數據,缺失數據一種最簡單的做法是轉化為空白,或者NaN,但實際上空白都會當成0來處理,這其實不是一種最好的表達。這時候其實更好的是使用平均值、中位值,或者模值,或者由其他模型來生成一些值。但常見來說平均值和中位值就足夠好了。那第二種情況可能會做一些rounding,就是忽略掉一些小數位上的變化,因為有時候小數位過高會是一種噪音。他本身的觀測實際上沒有這麼高的精度,所以很多時候精度是一些更低階的噪音帶來的。或說我們希望他在某些特徵上有一定的魯棒性。比如說這個例子,它在乘10取整後,實際上某種程度上可以當成分類、離散型的變數,比如說12345678910,當然它變成分類變數之後,實際上是產生了一個約束,10一定比9好,9一定比8好,它有個排序的次序和關係。所以這就是要看實際工作中,這樣一個約束是否成立。
然後還有一種情況是對取整的進一步拓展,二次化,0和1,超過0的就是1,因為很多時候我們需要關注它定性上的一些特性。再做一些擴展就是做Binning,就是做分塊,離散化,切到若干個bin裡面去,這個bin是等寬的,1到2,2到3,3到4 ,取值落到這裡面的個數是多少。另外還有一種分法是落入某個桶的分法平均,盡量的平均,這樣橫軸就是平均的。
還有的時候取值的範圍跨度太大或太小,這時候就採用某種非線性的變化,比如說log的transformation,讓它在兩個有extreme的value range上相對來說更smooth一些,更有區分力。這也是非線性的一種常用手段。雖然它非常簡單,但實際上的效果是不錯的。List還有取平方或者開方。
最後一種是對數組做一定的normalization,有兩種方法:一種是minmax找到最小值最大值,把他們normalize到0到1之間,還有一種是做一個比較標準的正態化,就是減去mean 再除以var,但要對數據的分布有個基本的了解。這裡有另一種方法,是對數值向量做歸一化,這也是為了防止數值上面一些outlier的點,主要還是為了數值上的穩定性。
這裡是一種特徵生成的方法,比如說原始特徵是X1,X2,通過兩兩交互能夠生成新的特徵,也帶來一定的非線性。後面要講的推薦系統FFM本質上就是使用這樣的方法。
接下來是時間變數,本質上是一種連續值,但是實際上有一些特殊的處理,有時會忽略掉一些奇怪的問題,要注意一下。首先要注意一下時區的問題,是應該用local的時間還是同一時區,要根據具體問題來定,還有夏令時的問題。具體要根據場景來定。時間是連續值,很多時候也要進行分段,有時候會有一定語義的分法,比如早上,中午,晚上這樣的切分。實際上對切分本身來說也可以做成有重疊的, 比如說5點到9點是early morning,8點到11點是morning,這樣8點到9點就同時屬於兩個bin,這也是可以的。第二個就是對它的某些時間趨勢做一個特徵,就是它所消耗的時間,上周所消耗的時間,或者是相對消耗時間上的一個變化。
4.時間空間特徵處理
還有一些場景下我們關注一些特殊的時間,比如說節假日、雙十一。舉例來說這些做用電量的預測,那麼春節可能是一個非常強的特徵。春節大城市的用電量會急劇下降,世界盃前、發工資又要做一些特殊的推薦可能是實踐中需要考慮的東西。時間間隔:比如說上一次點擊廣告的時間,兩次點擊的間隔,因為會假設用戶的興趣會隨著時間變數發生變化。
和時間相對應的是空間上的變數,有可能是GPS坐標,也有可能是語義上的地址、郵編、城市、省,或是與特定位置的距離。很多時候地點是連續的特徵流,每一秒可能都有GPS 的坐標,他可能需要進行異常的監測,因為GPS並不是那麼的精準可靠。也可以基於外部資源強增地點信息:包括這個區域的人口情況、收入情況等。
自然語言處理的特徵工程
接下來我們看一下自然語言處理的特徵工程。文本本質上也是一種分類變數,所以他會有一些傳統的做法,比如說:Bag of words ,TF-IDF,也有比較新的Embedding 或Topic models。
Bag of words是One-Hot encoding的一種表達,TF-IDF是對Bag of words的一種簡單改進,它feature取值不僅僅取決於出現或不出現,它希望在這個feature的取值上能夠反映這個單詞對語義的相對重要性。Term Frequency 代表著一個詞如果在文檔中出現的次數越多,它可能的重要性越高。另外一方面,如果這個詞在出現的文章個數越少,說明這個詞更有區分性或者越具有代表性。 所以TF代表的是Term Frequency,IDF是words出現在document 的Frequency,兩者相乘是信息檢索領域對特徵取值進行re-weighting的一種常見的方法。
有了兩個文檔的TF-IDF向量之後,就可以定義這個向量的相似性,可以用Cosine來定義,Cosine可以理解為一個normalize的內積,把兩個特徵進行L2的正則,它們之間的關係就是內積,或者說是兩個向量之間的夾角。
Textual Similarity 是簡單的進行一些定量的計算,比如說從一個文本轉換成另一個文本難易程度的一個計算。Word2vec實際上是Embedding的一種方法,需要定義某種損失函數來學習,最終是哪種損失函數滿足最終我們所期望的損失函數。Topic models本質上是進行某種矩陣的分解,目的是在高維的空間上進行低維的表達,能夠更完整的刻畫數據,這個在推薦系統上也會用到。
協同過濾與推薦系統
推薦系統是一種非常廣泛的機器學習的領域,和廣告系統密切相關。區別是業務上的邏輯,本質上演算法可以互相借鑒。
協同過濾本質是用別的用戶來為這個用戶進行推薦和過濾,假設A和B在都看過的item非常相似,那麼A和B可能會share相似的list. 比如某些items 只有B看過,那麼A很可能和B會有相同的喜好。Item可能是廣告、電影、音樂等等。
舉例來說綠代表喜歡,紅色代表不喜歡,我們要看一下該用戶對電視機的喜好程度,什麼樣的用戶和他會比較像?我們會注意到第二個和第三個用戶,我們會借鑒第二、三個用戶的喜好來猜測它在電視機上的喜好,也意味著它喜歡第三個物品。
協同過濾分為三個步驟:
- 用戶需要對某個物品表現出他的喜好性。
- 用演算法去找到和他比較相似的用戶。
- 基於用戶做一個推薦。
這是基於user的推薦,接下來還會舉例基於item的推薦。
首先他需要確定一個度量方法,可以度量user之間的相似性,也可以度量item之間的相似性。假定這樣一個item都是使用一個特徵向量的表達,那麼它的相似性可以通過歐氏距離或皮爾遜相關係數來度量。歐氏距離實際上是最簡單的一種度量方式,但很多時候也是非常好用的方法。
假設兩個向量是n維空間的兩個點,那麼這兩個點的距離就是歐氏距離。距離我們需要轉化為相似性,有時候越小越好,有時候越大越好。所以我們會用圖中的一個變化。本質上是把無窮區間投影到0,1區間。皮爾遜係數本質上也是刻畫兩者之間的相似性。Cosine 也是基於內積的一個變化,如果在一個超球面上,它和歐氏距離有簡單的對應關係。有了這樣一個距離之後,我們可以找相似的label,有兩種找法:1.找最近的K個鄰居。2.找相似性小於或大於某種程度的一些鄰居。這兩種方法在實踐中都有使用。
Item-item Filtering:現在有用戶ABC和物品ABC, 我們考慮是否要把物品C推薦給用戶C。我們看物品C和哪一個物品經常一起出現,發現是物品A。用戶C被推薦了物品A,因此把物品C推薦給他。User-item Filtering 考慮對用戶A進行推薦,先找到和A相似的可能是用戶C,看用戶C有說明額外的物品是用戶A不知道的,物品D是用戶A不知道的,那麼D就會推薦給A。這兩個可能是不同的維度,用哪種方法更好,也要看數據具體的特徵來定。
無論是哪種方法都會有一些缺點:1.複雜度是O(n^2)的,會隨著用戶數和物品數增高。無論是用Item-item Filtering還是User-item Filtering,本身feature vector的維度就很高,用來計算相似度或差異度的開銷就會更大,會有一個O(n)的增長。找相似的 item的做法有O(n)的複雜度;2.如何對新的用戶進行推薦。
因式分解機試圖來解決帶來的一些問題,這個工作是10年Steffen提出的,他從另外一個角度來增強模型,同時也取得了很好的效果。他關注點在特徵間的協同作用,比如說將兩兩特徵組合起來。舉一個廣告的例子,他關心的是用戶是否有點擊這個廣告(1或者0),展示了用戶的一些特徵,國家、點擊的時間、還有廣告的類型,這是一個簡化的數據集,使用One-Hot encoding。
最簡單的方法是把所有特徵進行One-Hot 表達,也不對日期等別的特徵進行哈希等別的方法的處理。把這樣一個矩陣放回到推薦的系統中,比如用戶和電影的推薦,每行代表用戶和電影的關係,用戶和電影都進行了One-Hot 表達,時間做了一個normalization,y是好與不好。推薦系統除了協同過濾,另一種方法是把它當成回歸問題,那回歸問題X就是這些特徵,y就是rating,最簡單的一個模型就是線性回歸。線性回歸實際上是賦予每個特徵一個權重,然後相加,再加一個先驗。然後就得到一個預測值,我們希望預測值儘可能的接近真實的y。
當只使用原始特徵時可能表達能力不夠強。比如說在USA且今天是Thanksgiving,這是一個非常重要的信息,我們可能需要對這樣的特徵進行組合然後構造新的特徵。但這些組合空間可能會非常巨大,組合數是n方的關係。比如有200個國家,30個節日,再結合其他特徵如站點,相乘就會非常巨大。我們仔細觀察特徵組它們之間可能不是相互獨立的,有一些可以share的參數,這些share的參數是一些非常重要的概念,在Hash Encoding、CNN、RNN上都會用到。比如說美國和Thanksgiving的組合,它與中國和中國的新年的組合非常有關聯,所以它們倆之間可以用相同的latent factors進行刻畫。
找 latent factor傳統的技術是做矩陣因式分解,比如說我們有非常大的矩陣是nm的,我們通過找到兩個nk和km的矩陣相乘可以重構出這樣一個nm的矩陣,就是SVD或者LSI,可能有不同的名詞但是有相同的做法。所以這個想法就被延展到了FFM上面,這裡最關鍵的想法是把wij定義成vi 乘以vj的內積,vi是k維上的一個元素,這樣的一個好處是把O(n^2)的複雜度降到O(n)的複雜度。所以wij就不是任意的一個參數,它是受限制的一個參數。所以FM可以被表達成下面這樣一個式子,它不在是O(n^2)的複雜度,而是O(nk)這樣一個問題,k是一個可選的參數,不會隨著數據量或特徵的增長而變化。計算量看起來更大了,但實際上有很多計算是重複的,通過簡單的變化可以變成O(nk)的複雜度。
總結一下它的優勢:FM model 可以線性時間來計算,它可以和任何實數型的特徵向量一起用,即使是在非常巨大的數據下它也可以進行一些參數估計,還可以做兩階的特徵組合。
目前訓練營優秀作業已公開
登陸科賽 Kesci 查看更多 機器學習 項目案例
推薦閱讀:
※學習數據分析--念念不忘,終有迴響
※如何高效地學習數據結構——Python篇
※數據分析的三板斧
※用戶畫像學習
※「大數據」時代,什麼是數據分析做不了的?