天天看點

xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用

作者簡介

曹城,攜程搜尋部門進階研發工程師,主要負責攜程搜尋的個性化推薦和搜尋排序等工作。

一、前言

在網際網路高速發展的今天,越來越複雜的特征被應用到搜尋中,對于檢索模型的排序,基本的業務規則排序或者人工調參的方式已經不能滿足需求了,此時由于大資料的加持,機器學習、深度學習成為了一項可以選擇的方式。

攜程主站搜尋作為主要的流量入口之一,是使用者浏覽資訊的重要方式。使用者搜尋方式多樣、對接業務多樣給攜程主站搜尋(下文簡稱大搜)帶來了許多挑戰,如:

  • 搜尋方式多樣化
  • 場景多樣化
  • 業務多樣化
  • 意圖多樣化
  • 使用者多樣化

為了更好滿足搜尋的多樣化,大搜團隊對傳統機器學習和深度學習方向進行探索。

說起機器學習和深度學習,是個很大的話題,今天我們隻來一起聊聊傳統機器學習中XGBoost在大搜中的排序實踐。

二、XGBoost探索與實踐

聊起搜尋排序,那肯定離不開L2R。Learning to Rank,簡稱(L2R),是一個監督學習的過程,需要提前做特征選取、訓練資料的擷取然後再做模型訓練。

L2R可以分為:

  • PointWise
  • PairWise
  • ListWise

PointWise方法隻考慮給定查詢下單個文檔的絕對相關度,不考慮其他文檔和給定查詢的相關度。

PairWise方法考慮給定查詢下兩個文檔直接的相對相關度。比如給定查詢query的一個真實文檔序列,我們隻需要考慮任意兩個相關度不同的文檔直接的相對相關度。相比PointWise,PairWise方法通過考慮任意兩個文檔直接的相關度進行排序,有一定的優勢。

ListWise直接考慮給定查詢下的文檔集合的整體序列,直接優化模型輸出的文檔序列,使得盡可能接近真實文檔序列。

下面先簡單介紹XGBoost的應用流程:

xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用

XGBoost是一個優化的分布式梯度增強庫,增強樹模型,靈活便捷。但對高次元的稀疏矩陣支援不是很好,另外調參确實有點麻煩。

三、特征工程實踐

在傳統機器學習下,特征工程顯的尤為重要,不論後續模型工程做的多好,如果前期的特征工程沒有做好,那麼訓練的結果不會有多好。是以對特征處理的總體邏輯如下:

xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用

3.1 前期資料準備

首先,我們需要進行需求分析,就是在什麼場景下排序。假設我們需要針對搜尋召回的POI場景進行排序,那麼需要确定幾件事情:

  • 資料來源:搜尋的資料就是各種POI,然後需要确定我們有哪些資料可以用來排序,比如最近半年的搜尋POI的曝光點選資料等;
  • 特征梳理:需要梳理影響POI排序的因子,例如查詢相關特征、POI相關特征、使用者相關特征等;
  • 标注規則制定:每次搜尋召回的每個POI,會有曝光和點選資料,簡單點,比如:我們可以将曝光位置作為預設标注分,當有點選,就将标注分在原來的基礎上加一;
  • 資料埋點/資料抽取:這是兩種方式,可以根據實際需求進行選擇;
    • 資料埋點:可以線上上實時生成特征,然後進行日志埋點,離線分析的時候可以直接從日志中拉取即可,這種方式,需要提前進行埋點。
    • 資料抽取:可以通過大資料平台拉取曆史資料,然後進行離線計算抽取所需特征,這種方式雖然慢點,但是可以拉取曆史資料進行分析。

3.2 特征處理

前期的資料準備工作完成了,接下來可以開始看看資料品質了。

  • 檢視缺失值:絕大多數情況下,我們都需要對缺失值進行處理;
  • 特征歸一化處理:監督學習對特征的尺度非常敏感,是以,需要對特征歸一化用來促進模型更好的收斂;
  • 噪聲點處理:異常的資料會影響模型預測的正确性;
  • 特征連續值分析:分析特征的值分布範圍是否均勻;
  • 特征之間的相關性分析;
xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用

通過連續值特征可以分析每個特征值的大緻分布範圍,有利于對相關特征進行資料補充或者重新篩選。

xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用

通過特征相關性的分析,如上我們看到幾個特征之間有很高的相關性,那麼可以幫助我們做特征組合或者特征篩選等等方面決策。

四、模型工程實踐

4.1 評估名額制定

在搜尋業務中,考慮的有以下兩種情況:

  • 看重使用者搜尋的成功率,即有沒有點選;
  • 看重頁面第一屏的曝光點選率;

在文章開頭提到的L2R的三種分類中,我們在XGBoost參數objective配置“rank:pairwise”,同時使用搜尋系統常用的評估名額NDCG (Normalized Discounted Cumulative Gain) 。

def _to_list(x):if isinstance(x, list):return xreturn [x]def ndcg(y_true, y_pred, k=20, rel_threshold=0):if k <= 0:return 0    y_true = _to_list(np.squeeze(y_true).tolist())    y_pred = _to_list(np.squeeze(y_pred).tolist())    c = list(zip(y_true, y_pred))    random.shuffle(c)    c_g = sorted(c, key=lambda x: x[0], reverse=True)    c_p = sorted(c, key=lambda x: x[1], reverse=True)    idcg = 0    ndcg = 0for i, (g, p) in enumerate(c_g):if i >= k:breakif g > rel_threshold:            idcg += (math.pow(2, g) - 1) / math.log(2 + i)for i, (g, p) in enumerate(c_p):if i >= k:breakif g > rel_threshold:            ndcg += (math.pow(2, g) - 1) / math.log(2 + i)if idcg == 0:return 0else:return ndcg / idcg
           

4.2 初始模型訓練

前期通過基礎的模型訓練,可以初步得出一些初始參數和相關特征的重要度等相關資訊。

train_dmatrix = DMatrix(x_train, y_train)valid_dmatrix = DMatrix(x_valid, y_valid)test_dmatrix = DMatrix(x_test)train_dmatrix.set_group(group_train)valid_dmatrix.set_group(group_valid)test_dmatrix.set_group(group_test)params = {'objective': 'rank:pairwise', 'eta': 0.5, 'gamma': 1.0,'min_child_weight': 0.5, 'max_depth': 8,'eval_metric':'[email protected]','nthread':16}xgb_model = xgb.train(params, train_dmatrix, num_boost_round=1000,                           evals=[(valid_dmatrix, 'validation')])
           
xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用
import pandas as pdprint('特征名稱', '特征權重值')feature_score = xgb_model.get_fscore()pd.Series(feature_score).sort_values(ascending=False)
           
xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用

4.3 模型調優五部曲

通過上述基礎的模型訓練,我們可以得出相關的初始參數,進入到五部曲環節,XGBoost參數調節基本為五個環節:

  • Step 1:選擇一組初始參數;
  • Step 2:改變 max_depth 和 min_child_weight;
  • Step 3:調節 gamma 降低模型過拟合風險;
  • Step 4:調節 subsample 和 colsample_bytree 改變資料采樣政策;
  • Step 5:調節學習率 eta;

例如我們在通過step1,可以觀察弱分類數目的大緻範圍,看看模型是過拟合還是欠拟合。

xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用

通過step2調整樹的深度和節點權重,這些參數對XGBoost性能影響最大,我們簡要概述他們:

  • max_depth:樹的最大深度。增加這個值會使模型更加複雜,也容易出現過拟合,深度3-10是合理的;
  • min_child_weight:正則化參數。如果樹分區中的執行個體權重小于定義的總和,則停止樹建構過程。

可以通過網格搜尋發現最佳結果,當然也可以通過其他方式。

xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用

我們看到,從網格搜尋的結果,分數的提高主要是基于max_depth增加。min_child_weight稍有影響的成績,但是min_child_weight = 6會更好一些。

4.4 模型離線評估

通過調優五部曲,訓練,生成最終的模型之後,就要進入離線評估階段。離線拉取線上生産使用者的請求,模拟生産,對模型預測的結果進行檢驗,根據在之前評估名額制定環節所提到的使用者點選率和第一屏曝光點選率,比對線上使用者點選産品的位置和模型預測的位置,同時對比兩者之間的第一屏曝光點選率。

4.5 模型預測

通過AB實驗,對模型進行線上預測,實時監測效果評估,友善之後的疊代和優化。

五、總結與展望

  • 對于傳統的機器學習,最重要的一步是要做好需求分析,評估這種算法是否能有效解決該問題,否則得不償失;
  • 前期的特征工程非常關鍵。通過多次的摸索發現,特征沒有選取好,或者資料覆寫不全,标注沒做好,導緻後續模型不論怎麼調優,都無法達到預定的效果;
  • 標明目标後,可以先嘗試一些優秀的開源工具、優秀的資料分析工具。直覺的圖表能幫助你做更好的決策,優秀的算法庫,能避免重複造輪子;
  • 單一的算法無法滿足搜尋排序應用場景,多模型融合以及深度學習方向需要做更深入的探索與實踐;

關于AI學習路線和優質資源,在背景回複"AI"擷取

xgboost執行個體_幹貨 | XGBoost在攜程搜尋排序中的應用