詳解特徵工程與推薦系統及其實踐

科賽網Kesci發表於2017-12-01

11月13日,雲腦科技機器學習訓練營正式開營,本期訓練營由科賽 Kesci聯合雲腦科技打造,中美大咖導師授課,精心指導學員解決機器學習中的實際問題,為人工智慧行業培育高潛力人才。

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 可以線性時間來計算,它可以和任何實數型的特徵向量一起用,即使是在非常巨大的資料下它也可以進行一些引數估計,還可以做兩階的特徵組合。


由科賽推出的K-Lab線上資料分析協作平臺,已經為你整合Python3、Python2、R三種主流程式語言環境,同步內建100+常用資料分析工具包(包括本文分享的Seaborn)。官網也聚合了豐富的資料資源,可直接登入kesci.com,任選資料集,嘗試用Seaborn或其他工具包開展資料分析。

詳解特徵工程與推薦系統及其實踐詳解特徵工程與推薦系統及其實踐




相關文章