隨着美團交易規模的逐步增大,積累下來的業務數據和交易數據愈來愈多,這些數據是美團作爲一個團購平臺最寶貴的財富。經過對這些數據的分析和挖掘,不只能給美團業務發展方向提供決策支持,也爲業務的迭代指明瞭方向。目前在美團的團購系統中大量地應用到了機器學習和數據挖掘技術,例如個性化推薦、篩選排序、搜索排序、用戶建模等等,爲公司創造了巨大的價值。
本文主要介紹在美團的推薦與個性化團隊實踐中的數據清洗與特徵挖掘方法。主要內容已經在內部公開課"機器學習InAction系列"講過,本博客的內容主要是講座內容的提煉和總結。 html
如上圖所示是一個經典的機器學習問題框架圖。數據清洗和特徵挖掘的工做是在灰色框中框出的部分,即「數據清洗=>特徵,標註數據生成=>模型學習=>模型應用」中的前兩個步驟。
灰色框中藍色箭頭對應的是離線處理部分。主要工做是 算法
灰色框中綠色箭頭對應的是在線處理的部分。所作的主要工做和離線處理的相似,主要的區別在於1.不須要清洗標註數據,只須要處理獲得特徵數據,在線模型使用特徵數據預測出樣本可能的標籤。2.最終生成數據的用處,最終生成的數據主要用於模型的預測,而不是訓練。
在離線的處理部分,能夠進行較多的實驗和迭代,嘗試不一樣的樣本採樣、樣本權重、特徵處理方法、特徵組合方法等,最終獲得一個最優的方法,在離線評估獲得好的結果後,最終將肯定的方案在線上使用。
另外,因爲在線和離線環境不一樣,存儲數據、獲取數據的方法存在較大的差別。例如離線數據獲取能夠將數據存儲在Hadoop,批量地進行分析處理等操做,而且容忍必定的失敗。而在線服務獲取數據須要穩定、延時小等,能夠將數據建入索引、存入KV存儲系統等。後面在相應的部分會詳細地介紹。 緩存
本文以點擊下單率預測爲例,結合實例來介紹如何進行數據清洗和特徵處理。首先介紹下點擊下單率預測任務,其業務目標是提升團購用戶的用戶體驗,幫助用戶更快更好地找到本身想買的單子。這個概念或者說目標看起來比較虛,咱們須要將其轉換成一個技術目標,便於度量和實現。最終肯定的技術目標是點擊下單率預估,去預測用戶點擊或者購買團購單的機率。咱們將預測出來點擊或者下單率高的單子排在前面,預測的越準確,用戶在排序靠前的單子點擊、下單的就越多,省去了用戶反覆翻頁的開銷,很快就能找到本身想要的單子。離線咱們用經常使用的衡量排序結果的AUC指標,在線的咱們經過ABTest來測試算法對下單率、用戶轉化率等指標的影響。 app
在肯定了目標以後,下一步,咱們須要肯定使用哪些數據來達到目標。須要事先梳理哪些特徵數據可能與用戶是否點擊下單相關。咱們能夠借鑑一些業務經驗,另外能夠採用一些特徵選擇、特徵分析等方法來輔助咱們選擇。具體的特徵選擇,特徵分析等方法咱們後面會詳細介紹。從業務經驗來判斷,可能影響用戶是否點擊下單的因素有: 框架
在肯定好要使用哪些數據以後,咱們須要對使用數據的可用性進行評估,包括數據的獲取難度,數據的規模,數據的準確率,數據的覆蓋率等, dom
Ok,在選定好要用的特徵以後,咱們須要考慮一個問題。就是這些數據從哪能夠獲取?只有獲取了這些數據咱們才能用上。不然,提一個不可能獲取到的特徵,獲取不到,提了也是白提。下面就介紹下特徵獲取方案。 機器學習
離線特徵獲取方案
離線可使用海量的數據,藉助於分佈式文件存儲平臺,例如HDFS等,使用例如MapReduce,Spark等處理工具來處理海量的數據等。 分佈式
在線特徵獲取方案
在線特徵比較注重獲取數據的延時,因爲是在線服務,須要在很是短的時間內獲取到相應的數據,對查找性能要求很是高,能夠將數據存儲在索引、kv存儲等。而查找性能與數據的數據量會有矛盾,須要折衷處理,咱們使用了特徵分層獲取方案,以下圖所示。 函數
出於性能考慮。在粗排階段,使用更基礎的特徵,數據直接建入索引。精排階段,再使用一些個性化特徵等。 工具
在瞭解特徵數據放在哪兒、怎樣獲取以後。下一步就是考慮如何處理特徵和標註數據了。下面3節都是主要講的特徵和標註處理方法
##標註數據清洗
首先介紹下如何清洗特徵數據,清洗特徵數據方法能夠分爲離線清洗和在線清洗兩種方法。
特徵數據只有在和標註數據合併以後,才能用來作爲模型的訓練。下面介紹下如何清洗標註數據。主要是數據採樣和樣本過濾。
數據採樣,例如對於分類問題:選取正例,負例。對於迴歸問題,須要採集數據。對於採樣獲得的樣本,根據須要,須要設定樣本權重。當模型不能使用所有的數據來訓練時,須要對數據進行採樣,設定必定的採樣率。採樣的方法包括隨機採樣,固定比例採樣等方法。
除了採樣外,常常對樣本還須要進行過濾,包括
在分析完特徵和標註的清洗方法以後,下面來具體介紹下特徵的處理方法,先對特徵進行分類,對於不一樣的特徵應該有不一樣的處理方法。
根據不一樣的分類方法,能夠將特徵分爲(1)Low level特徵和High level特徵。(2)穩定特徵與動態特徵。(3)二值特徵、連續特徵、枚舉特徵。
Low level特徵是較低級別的特徵,主要是原始特徵,不須要或者須要很是少的人工處理和干預,例如文本特徵中的詞向量特徵,圖像特徵中的像素點,用戶id,商品id等。Low level特徵通常維度比較高,不能用過於複雜的模型。High level特徵是通過較複雜的處理,結合部分業務邏輯或者規則、模型獲得的特徵,例如人工打分,模型打分等特徵,能夠用於較複雜的非線性模型。Low level 比較針對性,覆蓋面小。長尾樣本的預測值主要受high level特徵影響。 高頻樣本的預測值主要受low level特徵影響。
穩定特徵是變化頻率(更新頻率)較少的特徵,例如評價平均分,團購單價格等,在較長的時間段內都不會發生變化。動態特徵是更新變化比較頻繁的特徵,有些甚至是實時計算獲得的特徵,例如距離特徵,2小時銷量等特徵。或者叫作實時特徵和非實時特徵。針對兩類特徵的不一樣能夠針對性地設計特徵存儲和更新方式,例如對於穩定特徵,能夠建入索引,較長時間更新一次,若是作緩存的話,緩存的時間能夠較長。對於動態特徵,須要實時計算或者準實時地更新數據,若是作緩存的話,緩存過時時間須要設置的較短。
二值特徵主要是0/1特徵,即特徵只取兩種值:0或者1,例如用戶id特徵:目前的id是不是某個特定的id,詞向量特徵:某個特定的詞是否在文章中出現等等。連續值特徵是取值爲有理數的特徵,特徵取值個數不定,例如距離特徵,特徵取值爲是0~正無窮。枚舉值特徵主要是特徵有固定個數個可能值,例現在天周幾,只有7個可能值:周1,周2,...,週日。在實際的使用中,咱們可能對不一樣類型的特徵進行轉換,例如將枚舉特徵或者連續特徵處理爲二值特徵。枚舉特徵處理爲二值特徵技巧:將枚舉特徵映射爲多個特徵,每一個特徵對應一個特定枚舉值,例現在天周幾,能夠把它轉換成7個二元特徵:今天是不是週一,今天是不是週二,...,今天是不是週日。連續值處理爲二值特徵方法:先將連續值離散化(後面會介紹如何離散化),再將離散化後的特徵切分爲N個二元特徵,每一個特徵表明是否在這個區間內。
在對特徵進行分類後,下面介紹下對特徵經常使用的處理方法。包括1.特徵歸一化,離散化,缺省值處理。2.特徵降維方法。3.特徵選擇方法等。
主要用於單個特徵的處理。
歸一化
不一樣的特徵有不一樣的取值範圍,在有些算法中,例如線性模型或者距離相關的模型像聚類模型、knn模型等,特徵的取值範圍會對最終的結果產生較大影響,例如二元特徵的取值範圍爲[0,1],而距離特徵取值多是[0,正無窮),在實際使用中會對距離進行截斷,例如[0,3000000],可是這兩個特徵因爲取值範圍不一致致使了模型可能會更偏向於取值範圍較大的特徵,爲了平衡取值範圍不一致的特徵,須要對特徵進行歸一化處理,將特徵取值歸一化到[0,1]區間。經常使用的歸一化方法包括1.函數歸一化,經過映射函數將特徵取值映射到[0,1]區間,例如最大最小值歸一化方法,是一種線性的映射。還有經過非線性函數的映射,例如log函數等。2.分維度歸一化,可使用最大最小歸一化方法,可是最大最小值選取的是所屬類別的最大最小值,即便用的是局部最大最小值,不是全局的最大最小值。3.排序歸一化,無論原來的特徵取值是什麼樣的,將特徵按大小排序,根據特徵所對應的序給予一個新的值。
離散化
在上面介紹過連續值的取值空間多是無窮的,爲了便於表示和在模型中處理,須要對連續值特徵進行離散化處理。經常使用的離散化方法包括等值劃分和等量劃分。等值劃分是將特徵按照值域進行均分,每一段內的取值等同處理。例如某個特徵的取值範圍爲[0,10],咱們能夠將其劃分爲10段,[0,1),[1,2),...,[9,10)。等量劃分是根據樣本總數進行均分,每段等量個樣本劃分爲1段。例如距離特徵,取值範圍[0,3000000],如今須要切分紅10段,若是按照等比例劃分的話,會發現絕大部分樣本都在第1段中。使用等量劃分就會避免這種問題,最終可能的切分是[0,100),[100,300),[300,500),..,[10000,3000000],前面的區間劃分比較密,後面的比較稀疏。
缺省值處理
有些特徵可能由於沒法採樣或者沒有觀測值而缺失,例如距離特徵,用戶可能禁止獲取地理位置或者獲取地理位置失敗,此時須要對這些特徵作特殊的處理,賦予一個缺省值。缺省值如何賦予,也有不少種方法。例如單獨表示,衆數,平均值等。
在介紹特徵降維以前,先介紹下特徵升維。在機器學習中,有一個VC維理論。根據VC維理論,VC維越高,打散能力越強,可允許的模型複雜度越高。在低維不可分的數據,映射到高維是可分。能夠想一想,給你一堆物品,人腦是如何對這些物品進行分類,依然是找出這些物品的一些特徵,例如:顏色,形狀,大小,觸感等等,而後根據這些特徵對物品作以歸類,這其實就是一個先升維,後劃分的過程。好比咱們人腦識別香蕉。可能首先咱們發現香蕉是黃色的。這是在顏色這個維度的一個切分。可是不少東西都是黃色的啊,例如哈密瓜。那麼怎麼區分香蕉和哈密瓜呢?咱們發現香蕉形狀是彎曲的。而哈密瓜是圓形的,那麼咱們就能夠用形狀來把香蕉和哈密瓜劃分開了,即引入一個新維度:形狀,來區分。這就是一個從「顏色」一維特徵升維到二維特徵的例子。
那問題來了,既然升維後模型能力能變強,那麼是否是特徵維度越高越好呢?爲何要進行特徵降維&特徵選擇?主要是出於以下考慮:1. 特徵維數越高,模型越容易過擬合,此時更復雜的模型就很差用。2. 相互獨立的特徵維數越高,在模型不變的狀況下,在測試集上達到相同的效果表現所須要的訓練樣本的數目就越大。 3. 特徵數量增長帶來的訓練、測試以及存儲的開銷都會增大。4.在某些模型中,例如基於距離計算的模型KMeans,KNN等模型,在進行距離計算時,維度太高會影響精度和性能。5.可視化分析的須要。在低維的狀況下,例如二維,三維,咱們能夠把數據繪製出來,可視化地看到數據。當維度增高時,就難以繪製出來了。在機器學習中,有一個很是經典的維度災難的概念。用來描述當空間維度增長時,分析和組織高維空間,因體積指數增長而遇到各類問題場景。例如,100個平均分佈的點能把一個單位區間以每一個點距離不超過0.01採樣;而當維度增長到10後,若是以相鄰點距離不超過0.01小方格採樣單位超一單位超正方體,則須要10^20 個採樣點。
正是因爲高維特徵有如上描述的各類各樣的問題,因此咱們須要進行特徵降維和特徵選擇等工做。特徵降維經常使用的算法有PCA,LDA等。特徵降維的目標是將高維空間中的數據集映射到低維空間數據,同時儘量少地丟失信息,或者降維後的數據點儘量地容易被區分
PCA算法
經過協方差矩陣的特徵值分解可以獲得數據的主成分,以二維特徵爲例,兩個特徵之間可能存在線性關係(例如運動的時速和秒速度),這樣就形成了第二維信息是冗餘的。PCA的目標是發現這種特徵之間的線性關係,並去除。
LDA算法
考慮label,降維後的數據點儘量地容易被區分
特徵選擇的目標是尋找最優特徵子集。特徵選擇能剔除不相關(irrelevant)或冗餘(redundant )的特徵,從而達到減小特徵個數,提升模型精確度,減小運行時間的目的。另外一方面,選取出真正相關的特徵簡化模型,協助理解數據產生的過程。
特徵選擇的通常過程以下圖所示:
主要分爲產生過程,評估過程,中止條件和驗證過程。
其餘如雙向搜索( BDS , Bidirectional Search ),序列浮動選擇( Sequential Floating Selection )等
隨機算法共同缺點:依賴隨機因素,有實驗結果難重現。
對特徵的有效性進行分析,獲得各個特徵的特徵權重,根據是否與模型有關能夠分爲1.與模型相關特徵權重,使用全部的特徵數據訓練出來模型,看在模型中各個特徵的權重,因爲須要訓練出模型,模型相關的權重與這次學習所用的模型比較相關。不一樣的模型有不一樣的模型權重衡量方法。例如線性模型中,特徵的權重係數等。2.與模型無關特徵權重。主要分析特徵與label的相關性,這樣的分析是與此次學習所使用的模型無關的。與模型無關特徵權重分析方法包括(1)交叉熵,(2)Information Gain,(3)Odds ratio,(4)互信息,(5)KL散度等
在機器學習任務中,特徵很是重要。
機器學習InAction系列講座介紹:結合美團在機器學習上的實踐,咱們進行一個實戰(InAction)系列的介紹(帶「機器學習InAction系列」標籤的5篇文章),介紹機器學習在解決問題的實戰中所需的基本技術、經驗和技巧。本文主要介紹了數據清洗與特徵處理,其餘四篇文章主要介紹了機器學習解決問題流程和模型訓練、模型優化等工做。
《elements of statistical learning》
http://en.wikipedia.org/wiki/Supervised_learning
http://www.cnblogs.com/heaad/archive/2011/01/02/1924088.html
http://zh.wikipedia.org/zh-cn/維數災難
http://www.cs.waikato.ac.nz/ml/weka/
http://blog.csdn.net/lihaifeng555/article/details/4543752
http://blog.csdn.net/abcjennifer/article/details/8002329
http://www.cnblogs.com/leftnoteasy/archive/2011/01/08/lda-and-pca-machine-learning.html
附上一張來自知乎大神總結的特徵工程的流程圖: