一、前言
在互聯網高速發展的今天,越來越複雜的特徵被應用到搜索中,對於檢索模型的排序,基本的業務規則排序或者人工調參的方式已經不能滿足需求了,此時由於大數據的加持,機器學習、深度學習成爲了一項可以選擇的方式。
攜程主站搜索作爲主要的流量入口之一,是用戶瀏覽信息的重要方式。用戶搜索方式多樣、對接業務多樣給攜程主站搜索(下文簡稱大搜)帶來了許多挑戰,如:
- 搜索方式多樣化
- 場景多樣化
- 業務多樣化
- 意圖多樣化
- 用戶多樣化
爲了更好滿足搜索的多樣化,大搜團隊對傳統機器學習和深度學習方向進行探索。
說起機器學習和深度學習,是個很大的話題,今天我們只來一起聊聊傳統機器學習中XGBoost在大搜中的排序實踐。
二、XGBoost探索與實踐
聊起搜索排序,那肯定離不開L2R。Learning to Rank,簡稱(L2R),是一個監督學習的過程,需要提前做特徵選取、訓練數據的獲取然後再做模型訓練。
L2R可以分爲:
- PointWise
- PairWise
- ListWise
PointWise方法只考慮給定查詢下單個文檔的絕對相關度,不考慮其他文檔和給定查詢的相關度。
PairWise方法考慮給定查詢下兩個文檔直接的相對相關度。比如給定查詢query的一個真實文檔序列,我們只需要考慮任意兩個相關度不同的文檔直接的相對相關度。相比PointWise,PairWise方法通過考慮任意兩個文檔直接的相關度進行排序,有一定的優勢。
ListWise直接考慮給定查詢下的文檔集合的整體序列,直接優化模型輸出的文檔序列,使得儘可能接近真實文檔序列。
下面先簡單介紹XGBoost的應用流程:
XGBoost是一個優化的分佈式梯度增強庫,增強樹模型,靈活便捷。但對高維度的稀疏矩陣支持不是很好,另外調參確實有點麻煩。
三、特徵工程實踐
在傳統機器學習下,特徵工程顯的尤爲重要,不論後續模型工程做的多好,如果前期的特徵工程沒有做好,那麼訓練的結果不會有多好。所以對特徵處理的總體邏輯如下:
3.1 前期數據準備
首先,我們需要進行需求分析,就是在什麼場景下排序。假設我們需要針對搜索召回的POI場景進行排序,那麼需要確定幾件事情:
- 數據來源:搜索的數據就是各種POI,然後需要確定我們有哪些數據可以用來排序,比如最近半年的搜索POI的曝光點擊數據等;
- 特徵梳理:需要梳理影響POI排序的因子,例如查詢相關特徵、POI相關特徵、用戶相關特徵等;
- 標註規則制定:每次搜索召回的每個POI,會有曝光和點擊數據,簡單點,比如:我們可以將曝光位置作爲默認標註分,當有點擊,就將標註分在原來的基礎上加一;
- 數據埋點/數據抽取:這是兩種方式,可以根據實際需求進行選擇;
- 數據埋點:可以在線上實時生成特徵,然後進行日誌埋點,離線分析的時候可以直接從日誌中拉取即可,這種方式,需要提前進行埋點。
- 數據抽取:可以通過大數據平臺拉取歷史數據,然後進行離線計算抽取所需特徵,這種方式雖然慢點,但是可以拉取歷史數據進行分析。
3.2 特徵處理
前期的數據準備工作完成了,接下來可以開始看看數據質量了。
- 查看缺失值:絕大多數情況下,我們都需要對缺失值進行處理;
- 特徵歸一化處理:監督學習對特徵的尺度非常敏感,因此,需要對特徵歸一化用來促進模型更好的收斂;
- 噪聲點處理:異常的數據會影響模型預測的正確性;
- 特徵連續值分析:分析特徵的值分佈範圍是否均勻;
- 特徵之間的相關性分析;
通過連續值特徵可以分析每個特徵值的大致分佈範圍,有利於對相關特徵進行數據補充或者重新篩選。
通過特徵相關性的分析,如上我們看到幾個特徵之間有很高的相關性,那麼可以幫助我們做特徵組合或者特徵篩選等等方面決策。
四、模型工程實踐
4.1 評估指標制定
在搜索業務中,考慮的有以下兩種情況:
- 看重用戶搜索的成功率,即有沒有點擊;
- 看重頁面第一屏的曝光點擊率;
在文章開頭提到的L2R的三種分類中,我們在XGBoost參數objective配置“rank:pairwise”,同時使用搜索系統常用的評估指標NDCG (Normalized Discounted Cumulative Gain) 。
def _to_list(x):
if isinstance(x, list):
return x
return [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 = 0
for i, (g, p) in enumerate(c_g):
if i >= k:
break
if g > rel_threshold:
idcg += (math.pow(2, g) - 1) / math.log(2 + i)
for i, (g, p) in enumerate(c_p):
if i >= k:
break
if g > rel_threshold:
ndcg += (math.pow(2, g) - 1) / math.log(2 + i)
if idcg == 0:
return 0
else:
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':'ndcg@10-','nthread':16}
xgb_model = xgb.train(params, train_dmatrix, num_boost_round=1000,
evals=[(valid_dmatrix, 'validation')])
import pandas as pd
print('特徵名稱', '特徵權重值')
feature_score = xgb_model.get_fscore()
pd.Series(feature_score).sort_values(ascending=False)
4.3 模型調優五部曲
通過上述基礎的模型訓練,我們可以得出相關的初始參數,進入到五部曲環節,XGBoost參數調節基本爲五個環節:
- Step 1:選擇一組初始參數;
- Step 2:改變 max_depth 和 min_child_weight;
- Step 3:調節 gamma 降低模型過擬合風險;
- Step 4:調節 subsample 和 colsample_bytree 改變數據採樣策略;
- Step 5:調節學習率 eta;
例如我們在通過step1,可以觀察弱分類數目的大致範圍,看看模型是過擬合還是欠擬合。
通過step2調整樹的深度和節點權重,這些參數對XGBoost性能影響最大,我們簡要概述他們:
- max_depth:樹的最大深度。增加這個值會使模型更加複雜,也容易出現過擬合,深度3-10是合理的;
- min_child_weight:正則化參數。如果樹分區中的實例權重小於定義的總和,則停止樹構建過程。
可以通過網格搜索發現最佳結果,當然也可以通過其他方式。
我們看到,從網格搜索的結果,分數的提高主要是基於max_depth增加。min_child_weight稍有影響的成績,但是min_child_weight = 6會更好一些。
4.4 模型離線評估
通過調優五部曲,訓練,生成最終的模型之後,就要進入離線評估階段。離線拉取線上生產用戶的請求,模擬生產,對模型預測的結果進行檢驗,根據在之前評估指標制定環節所提到的用戶點擊率和第一屏曝光點擊率,比對線上用戶點擊產品的位置和模型預測的位置,同時對比兩者之間的第一屏曝光點擊率。
4.5 模型預測
通過AB實驗,對模型進行線上預測,實時監測效果評估,方便之後的迭代和優化。
五、總結與展望
- 對於傳統的機器學習,最重要的一步是要做好需求分析,評估這種算法是否能有效解決該問題,否則得不償失;
- 前期的特徵工程非常關鍵。通過多次的摸索發現,特徵沒有選取好,或者數據覆蓋不全,標註沒做好,導致後續模型不論怎麼調優,都無法達到預定的效果;
- 選定目標後,可以先嚐試一些優秀的開源工具、優秀的數據分析工具。直觀的圖表能幫助你做更好的決策,優秀的算法庫,能避免重複造輪子;
- 單一的算法無法滿足搜索排序應用場景,多模型融合以及深度學習方向需要做更深入的探索與實踐;
作者介紹:
曹城,攜程搜索部門高級研發工程師,主要負責攜程搜索的個性化推薦和搜索排序等工作。
本文轉載自公衆號攜程技術(ID:ctriptech)。
原文鏈接: