1. 程式人生 > >例項詳解機器學習如何解決問題

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

前言

隨著大資料時代的到來,機器學習成為解決問題的一種重要且關鍵的工具。不管是工業界還是學術界,機器學習都是一個炙手可熱的方向,但是學術界和工業界對機器學習的研究各有側重,學術界側重於對機器學習理論的研究,工業界側重於如何用機器學習來解決實際問題。我們結合美團在機器學習上的實踐,進行一個實戰(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

###什麼是模型(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_problem

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

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

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

model_merg

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

  • 主要考慮
    1)選擇與業務目標一致的模型;
    2)選擇與訓練資料和特徵相符的模型。

    訓練資料少,High Level特徵多,則使用“複雜”的非線性模型(流行的GBDT、Random Forest等);
    訓練資料很大量,Low Level特徵多,則使用“簡單”的線性模型(流行的LR、Linear-SVM等)。
    
  • 補充考慮
    1)當前模型是否被工業界廣泛使用;
    2)當前模型是否有比較成熟的開源工具包(公司內或公司外);
    3)當前工具包能夠的處理資料量能否滿足要求;
    4)自己對當前模型理論是否瞭解,是否之前用過該模型解決問題。

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

select_model

通常來講,預估真實數值(迴歸)、大小順序(排序)、目標所在的正確區間(分類)的難度從大到小,根據應用所需,儘可能選擇難度小的目標進行。對於訪購率預估的應用目標來說,我們至少需要知道大小順序或真實數值,所以我們可以選擇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銷量生命週期 (保持分佈一致);
  • 考慮不同城市、不同商圈、不同品類的差別 (保持分佈一致)。

抽取特徵

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

extract_fea

通常,特徵可以分為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的特徵,其中一些展示在下圖:

fea_list

  • 非線性模型的特徵
    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沿著這個梯度方向迭代,即

gradient_descent

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

    擬牛頓法(Quasi-Newton Methods):計算目標函式的二階偏導數,難度較大,更為複雜的是目標函式的Hessian矩陣無法保持正定;不用二階偏導數而構造出可以近似Hessian矩陣的逆的正定對稱陣,從而在"擬牛頓"的條件下優化目標函式。
    BFGS: 使用BFGS公式對H(w)進行近似,記憶體中需要放H(w),記憶體需要O(m2)級別;
    L-BFGS:儲存有限次數(如k次)的更新矩陣,用這些更新矩陣生成新的H(w),記憶體降至O(m)級別;
    OWLQN: 如果在目標函式中引入L1正則化,需要引入虛梯度來解決目標函式不可導問題,OWLQN就是用來解決這個問題。
    newton
  • Coordinate Descent
    對於w,每次迭代,固定其他維度不變,只對其一個維度進行搜尋,確定最優下降方向(示意圖如下),公式表達如下:

coordinate_descent

優化模型

經過上文提到的資料篩選和清洗、特徵設計和選擇、模型訓練,就得到了一個模型,但是如果發現效果不好?怎麼辦?
【首先】
反思目標是否可預估,資料和特徵是否存在bug。
【然後】
分析一下模型是Overfitting還是Underfitting,從資料、特徵和模型等環節做針對性優化。

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

underfitting_overfitting

在實戰中,可以基於模型在訓練集和測試集上的表現來確定當前模型到底是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,針對性地優化。