美團技術團隊:實例詳解機器學習如何解決問題(轉載)

原文  http://tech.meituan.com/mt-mlinaction-how-to-ml.html

前言

隨着大數據時代的到來,機器學習成爲解決問題的一種重要且關鍵的工具。不管是工業界還是學術界,機器學習都是一個炙手可熱的方向,但是學術界和工 業界對機器學習的研究各有側重,學術界側重於對機器學習理論的研究,工業界側重於如何用機器學習來解決實際問題。我們結合美團在機器學習上的實踐,進行一 個實戰(InAction)系列的介紹(帶“機器學習InAction系列”標籤的文章),介紹機器學習在解決工業界問題的實戰中所需的基本技術、經驗和 技巧。本文主要結合實際問題,概要地介紹機器學習解決實際問題的整個流程,包括對問題建模、準備訓練數據、抽取特徵、訓練模型和優化模型等關鍵環節;另外 幾篇則會對這些關鍵環節進行更深入地介紹。

下文分爲1)機器學習的概述,2)對問題建模,3)準備訓練數據,4)抽取特徵,5)訓練模型,6)優化模型,7)總結 共7個章節進行介紹。

機器學習的概述:

什麼是機器學習?

隨着機器學習在實際工業領域中不斷獲得應用,這個詞已經被賦予了各種不同含義。在本文中的“機器學習”含義與wikipedia上的解釋比較契 合,如下:Machine learning is a scientific discipline that deals with the construction and study of algorithms that can learn from data.

機器學習可以分爲無監督學習(unsupervised learning)和有監督學習(supervised learning),在工業界中,有監督學習是更常見和更有價值的方式,下文中主要以這種方式展開介紹。如下圖中所示,有監督的機器學習在解決實際問題 時,有兩個流程,一個是離線訓練流程(藍色箭頭),包含數據篩選和清洗、特徵抽取、模型訓練和優化模型等環節;另一個流程則是應用流程(綠色箭頭),對需 要預估的數據,抽取特徵,應用離線訓練得到的模型進行預估,獲得預估值作用在實際產品中。在這兩個流程中,離線訓練是最有技術挑戰的工作(在線預估流程很 多工作可以複用離線訓練流程的工作),所以下文主要介紹離線訓練流程。

實例詳解機器學習如何解決問題

什麼是模型(model)?

模型,是機器學習中的一個重要概念,簡單的講,指特徵空間到輸出空間的映射;一般由模型的假設函數和參數w組成(下面公式就是Logistic Regression模型的一種表達,在訓練模型的章節做稍詳細的解釋);一個模型的假設空間(hypothesis space),指給定模型所有可能w對應的輸出空間組成的集合。工業界常用的模型有Logistic Regression(簡稱LR)、Gradient Boosting Decision Tree(簡稱GBDT)、Support Vector Machine(簡稱SVM)、Deep Neural Network(簡稱DNN)等。

實例詳解機器學習如何解決問題

模型訓練就是基於訓練數據,獲得一組參數w,使得特定目標最優,即獲得了特徵空間到輸出空間的最優映射,具體怎麼實現,見訓練模型章節。

爲什麼要用機器學習解決問題?

  • 目前處於大數據時代,到處都有成T成P的數據,簡單規則處理難以發揮這些數據的價值;
  • 廉價的高性能計算,使得基於大規模數據的學習時間和代價降低;
  • 廉價的大規模存儲,使得能夠更快地和代價更小地處理大規模數據;
  • 存在大量高價值的問題,使得花大量精力用機器學習解決問題後,能獲得豐厚收益。

機器學習應該用於解決什麼問題?

  • 目標問題需要價值巨大,因爲機器學習解決問題有一定的代價;
  • 目標問題有大量數據可用,有大量數據才能使機器學習比較好地解決問題(相對於簡單規則或人工);
  • 目標問題由多種因素(特徵)決定,機器學習解決問題的優勢才能體現(相對於簡單規則或人工);
  • 目標問題需要持續優化,因爲機器學習可以基於數據自我學習和迭代,持續地發揮價值。

對問題建模

本文以DEAL(團購單)交易額預估問題爲例(就是預估一個給定DEAL一段時間內賣了多少錢),介紹使用機器學習如何解決問題。首先需要:

  • 收集問題的資料,理解問題,成爲這個問題的專家;
  • 拆解問題,簡化問題,將問題轉化機器可預估的問題。

深入理解和分析DEAL交易額後,可以將它分解爲如下圖的幾個問題:

實例詳解機器學習如何解決問題

單個模型?多個模型?如何來選擇?

按照上圖進行拆解後,預估DEAL交易額就有2種可能模式,一種是直接預估交易額;另一種是預估各子問題,如建立一個用戶數模型和建立一個訪購率模型(訪問這個DEAL的用戶會購買的單子數),再基於這些子問題的預估值計算交易額。

  • 不同方式有不同優缺點,具體如下:
模式 缺點 優點
單模型 1. 預估難度大2. 風險比較高 1. 理論上可以獲得最優預估(實際上很難)2. 一次解決問題
多模型 1. 可能產生積累誤差2. 訓練和應用成本高 1. 單個子模型更容易實現比較準地預估2. 可以調整子模型的融合方式,以達到最佳效果
  • 選擇哪種模式?

    1)問題可預估的難度,難度大,則考慮用多模型;

    2)問題本身的重要性,問題很重要,則考慮用多模型;

    3)多個模型的關係是否明確,關係明確,則可以用多模型。

  • 如果採用多模型,如何融合?可以根據問題的特點和要求進行線性融合,或進行復雜的融合。以本文問題爲例,至少可以有如下兩種:

實例詳解機器學習如何解決問題

模型選擇

對於DEAL交易額這個問題,我們認爲直接預估難度很大,希望拆成子問題進行預估,即多模型模式。那樣就需要建立用戶數模型和訪購率模型,因爲機器學習解決問題的方式類似,下文只以訪購率模型爲例。要解決訪購率問題,首先要選擇模型,我們有如下的一些考慮:

  • 主要考慮

    1)選擇與業務目標一致的模型;

    2)選擇與訓練數據和特徵相符的模型。

    訓練數據少,High Level特徵多,則使用“複雜”的非線性模型(流行的GBDT、Random Forest等);
    訓練數據很大量,Low Level特徵多,則使用“簡單”的線性模型(流行的LR、Linear-SVM等)。
  • 補充考慮

    1)當前模型是否被工業界廣泛使用;

    2)當前模型是否有比較成熟的開源工具包(公司內或公司外);

    3)當前工具包能夠的處理數據量能否滿足要求;

    4)自己對當前模型理論是否瞭解,是否之前用過該模型解決問題。

爲實際問題選擇模型,需要轉化問題的業務目標爲模型評價目標,轉化模型評價目標爲模型優化目標;根據業務的不同目標,選擇合適的模型,具體關係如下:

實例詳解機器學習如何解決問題

通常來講,預估真實數值(迴歸)、大小順序(排序)、目標所在的正確區間(分類)的難度從大到小,根據應用所需,儘可能選擇難度小的目標進行。 對於訪購率預估的應用目標來說,我們至少需要知道大小順序或真實數值,所以我們可以選擇Area Under Curve(AUC)或Mean Absolute Error(MAE)作爲評估目標,以Maximum likelihood爲模型損失函數(即優化目標)。綜上所述,我們選擇spark版本 GBDT或LR,主要基於如下考慮:

1)可以解決排序或迴歸問題;

2)我們自己實現了算法,經常使用,效果很好;

3)支持海量數據;

4)工業界廣泛使用。

準備訓練數據

深入理解問題,針對問題選擇了相應的模型後,接下來則需要準備數據;數據是機器學習解決問題的根本,數據選擇不對,則問題不可能被解決,所以準備訓練數據需要格外的小心和注意:

注意點:

  • 待解決問題的數據本身的分佈儘量一致;
  • 訓練集/測試集分佈與線上預測環境的數據分佈儘可能一致,這裏的分佈是指(x,y)的分佈,不僅僅是y的分佈;
  • y數據噪音儘可能小,儘量剔除y有噪音的數據;
  • 非必要不做採樣,採樣常常可能使實際數據分佈發生變化,但是如果數據太大無法訓練或者正負比例嚴重失調(如超過100:1),則需要採樣解決。

常見問題及解決辦法

  • 待解決問題的數據分佈不一致: 
    1)訪購率問題中DEAL數據可能差異很大,如美食DEAL和酒店DEAL的影響因素或表現很不一致,需要做特別處理;要麼對數據提前歸一化,要麼將分佈不一致因素作爲特徵,要麼對各類別DEAL單獨訓練模型。
  • 數據分佈變化了: 
    1)用半年前的數據訓練模型,用來預測當前數據,因爲數據分佈隨着時間可能變化了,效果可能很差。儘量用近期的數據訓練,來預測當前數據,歷史的數據可以做降權用到模型,或做transfer learning。
  • y數據有噪音: 
    1)在建立CTR模型時,將用戶沒有看到的Item作爲負例,這些Item是因爲用戶沒有看到纔沒有被點擊,不一定是用戶不喜歡而沒有被點擊,所以這些 Item是有噪音的。可以採用一些簡單規則,剔除這些噪音負例,如採用skip-above思想,即用戶點過的Item之上,沒有點過的Item作爲負例 (假設用戶是從上往下瀏覽Item)。
  • 採樣方法有偏,沒有覆蓋整個集合: 
    1)訪購率問題中,如果只取只有一個門店的DEAL進行預估,則對於多門店的DEAL無法很好預估。應該保證一個門店的和多個門店的DEAL數據都有; 
    2)無客觀數據的二分類問題,用規則來獲得正/負例,規則對正/負例的覆蓋不全面。應該隨機抽樣數據,進行人工標註,以確保抽樣數據和實際數據分佈一致。

訪購率問題的訓練數據

  • 收集N個月的DEAL數據(x)及相應訪購率(y);
  • 收集最近N個月,剔除節假日等非常規時間 (保持分佈一致);
  • 只收集在線時長>T 且 訪問用戶數 > U的DEAL (減少y的噪音);
  • 考慮DEAL銷量生命週期 (保持分佈一致);
  • 考慮不同城市、不同商圈、不同品類的差別 (保持分佈一致)。

抽取特徵

完成數據篩選和清洗後,就需要對數據抽取特徵,就是完成輸入空間到特徵空間的轉換(見下圖)。針對線性模型或非線性模型需要進行不同特徵抽取,線性模型需要更多特徵抽取工作和技巧,而非線性模型對特徵抽取要求相對較低。

實例詳解機器學習如何解決問題

通常,特徵可以分爲High Level與Low Level,High Level指含義比較泛的特徵,Low Level指含義比較特定的特徵,舉例來說:

DEAL A1屬於POIA,人均50以下,訪購率高;
    DEAL A2屬於POIA,人均50以上,訪購率高;
    DEAL B1屬於POIB,人均50以下,訪購率高;
    DEAL B2屬於POIB,人均50以上,訪購率底;

基於上面的數據,可以抽到兩種特徵,POI(門店)或人均消費;POI特徵則是Low Level特徵,人均消費則是High Level特徵;假設模型通過學習,獲得如下預估:

如果DEALx 屬於POIA(Low Level feature),訪購率高;
如果DEALx 人均50以下(High Level feature),訪購率高。

所以,總體上,Low Level 比較有針對性,單個特徵覆蓋面小(含有這個特徵的數據不多),特徵數量(維度)很大。High Level比較泛化,單個特徵覆蓋面大(含有這個特徵的數據很多),特徵數量(維度)不大。長尾樣本的預測值主要受High Level特徵影響。高頻樣本的預測值主要受Low Level特徵影響。

對於訪購率問題,有大量的High Level或Low Level的特徵,其中一些展示在下圖:

實例詳解機器學習如何解決問題

  • 非線性模型的特徵

    1)可以主要使用High Level特徵,因爲計算複雜度大,所以特徵維度不宜太高;

    2)通過High Level非線性映射可以比較好地擬合目標。

  • 線性模型的特徵

    1)特徵體系要儘可能全面,High Level和Low Level都要有;

    2)可以將High Level轉換Low Level,以提升模型的擬合能力。

特徵歸一化

特徵抽取後,如果不同特徵的取值範圍相差很大,最好對特徵進行歸一化,以取得更好的效果,常見的歸一化方式如下:

  • Rescaling:

    歸一化到[0,1] 或 [-1,1],用類似方式:

    實例詳解機器學習如何解決問題
  • Standardization:

    設  爲x分佈的均值, 

    爲x分佈的標準差;

  • Scaling to unit length:

    歸一化到單位長度向量

特徵選擇

特徵抽取和歸一化之後,如果發現特徵太多,導致模型無法訓練,或很容易導致模型過擬合,則需要對特徵進行選擇,挑選有價值的特徵。

  • Filter:假設特徵子集對模型預估的影響互相獨立,選擇一個特徵子集,分析該子集和數據Label的關係,如果存在某種正相關,則認爲該特徵子集有效。衡量特徵子集和數據Label關係的算法有很多,如Chi-square,Information Gain。

  • Wrapper:選擇一個特徵子集加入原有特徵集合,用模型進行訓練,比較子集加入前後的效果,如果效果變好,則認爲該特徵子集有效,否則認爲無效。

  • Embedded:將特徵選擇和模型訓練結合起來,如在損失函數中加入L1 Norm ,L2 Norm。

訓練模型

完成特徵抽取和處理後,就可以開始模型訓練了,下文以簡單且常用的Logistic Regression模型(下稱LR模型)爲例,進行簡單介紹。

設有m個(x,y)訓練數據,其中x爲特徵向量,y爲label, 

;w爲模型中參數向量,即模型訓練中需要學習的對象。

所謂訓練模型,就是選定假說函數和損失函數,基於已有訓練數據(x,y),不斷調整w,使得損失函數最優,相應的w就是最終學習結果,也就得到相應的模型。

模型函數

1)假說函數,即假設x和y存在一種函數關係:


2)損失函數,基於上述假設函數,構建模型損失函數(優化目標),在LR中通常以(x,y)的最大似然估計爲目標:


優化算法

  • 梯度下降(Gradient Descent)

    即w沿着損失函數的負梯度方向進行調整,示意圖見下圖, 

    的梯度即一階導數(見下式),梯度下降有多種類型,如隨機梯度下降或批量梯度下降。


  • 隨機梯度下降(Stochastic Gradient Descent),每一步隨機選擇一個樣本 

    ,計算相應的梯度,並完成w的更新,如下式,

    批量梯度下降(Batch Gradient Descent),每一步都計算訓練數據中的所有樣本對應的梯度,w沿着這個梯度方向迭代,即



  • 牛頓法(Newton’s Method)

    牛頓法的基本思想是在極小點附近通過對目標函數做二階Taylor展開,進而找到L(w)的極小點的估計值。形象地講,在w k 處做切線,該切線與L(w)=0的交點即爲下一個迭代點w k+1 (示意圖如下)。w的更新公式如下,其中目標函數的二階偏導數,即爲大名鼎鼎的Hessian矩陣。


    擬牛頓法(Quasi-Newton Methods):計算目標函數的二階偏導數,難度較大,更爲複雜的是目標函數的Hessian矩陣無法保持正定;不用二階偏導數而構造出可以近似Hessian矩陣的逆的正定對稱陣,從而在"擬牛頓"的條件下優化目標函數。

    BFGS: 使用BFGS公式對H(w)進行近似,內存中需要放H(w),內存需要O(m 2 )級別;

    L-BFGS:存儲有限次數(如k次)的更新矩陣 

    ,用這些更新矩陣生成新的H(w),內存降至O(m)級別;

    OWLQN: 如果在目標函數中引入L1正則化,需要引入虛梯度來解決目標函數不可導問題,OWLQN就是用來解決這個問題。


  • Coordinate Descent

    對於w,每次迭代,固定其他維度不變,只對其一個維度進行搜索,確定最優下降方向(示意圖如下),公式表達如下:




優化模型

經過上文提到的數據篩選和清洗、特徵設計和選擇、模型訓練,就得到了一個模型,但是如果發現效果不好?怎麼辦?

【首先】

反思目標是否可預估,數據和特徵是否存在bug。

【然後】

分析一下模型是Overfitting還是Underfitting,從數據、特徵和模型等環節做針對性優化。

Underfitting & Overfitting

所謂Underfitting,即模型沒有學到數據內在關係,如下圖左一所示,產生分類面不能很好的區分X和O兩類數據;產生的深層原因,就是模 型假設空間太小或者模型假設空間偏離。所謂Overfitting,即模型過渡擬合了訓練數據的內在關係,如下圖右一所示,產生分類面過好地區分X和O兩 類數據,而真實分類面可能並不是這樣,以至於在非訓練數據上表現不好;產生的深層原因,是巨大的模型假設空間與稀疏的數據之間的矛盾。


在實戰中,可以基於模型在訓練集和測試集上的表現來確定當前模型到底是Underfitting還是Overfitting,判斷方式如下表:

訓練集表現 測試集表現 問題
< 期望目標值 < 期望目標值 Underfitting
> 期望目標值 接近或略遜於訓練集 合適
> 期望目標值 遠差於訓練集 Overfitting

怎麼解決Underfitting和Overfitting問題?

問題 數據 特徵 模型
Underfitting 清洗數據 1. 增加特徵2. 刪除噪音特徵 1. 調低正則項的懲罰參數 
2. 換更“複雜”的模型(如把線性模型換爲非線性模型) 
3. 多個模型級聯或組合
Overfitting 增加數據 1. 進行特徵選擇 
2. 降維(如對特徵進行聚類、主題模型進行處理等)
1. 提高正則項的懲罰參數 
2. 減少訓練迭代次數 
3. 換更“簡單”的模型(如把非線性模型換爲線性模型)

總結

綜上所述,機器學習解決問題涉及到問題建模、準備訓練數據、抽取特徵、訓練模型和優化模型等關鍵環節,有如下要點:

  1. 理解業務,分解業務目標,規劃模型可預估的路線圖。
  2. 數據: 
    y數據儘可能真實客觀; 
    訓練集/測試集分佈與線上應用環境的數據分佈儘可能一致。
  3. 特徵: 
    利用Domain Knowledge進行特徵抽取和選擇; 
    針對不同類型的模型設計不同的特徵。
  4. 模型: 
    針對不同業務目標、不同數據和特徵,選擇不同的模型; 
    如果模型不符合預期,一定檢查一下數據、特徵、模型等處理環節是否有bug; 
    考慮模型Underfitting和Qverfitting,針對性地優化。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章