日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

XGBoost在携程搜索排序中的应用

發(fā)布時(shí)間:2024/1/23 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 XGBoost在携程搜索排序中的应用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

?

?

在互聯(lián)網(wǎng)高速發(fā)展的今天,越來越復(fù)雜的特征被應(yīng)用到搜索中,對于檢索模型的排序,基本的業(yè)務(wù)規(guī)則排序或者人工調(diào)參的方式已經(jīng)不能滿足需求了,此時(shí)由于大數(shù)據(jù)的加持,機(jī)器學(xué)習(xí)、深度學(xué)習(xí)成為了一項(xiàng)可以選擇的方式。

?

攜程主站搜索作為主要的流量入口之一,是用戶瀏覽信息的重要方式。用戶搜索方式多樣、對接業(yè)務(wù)多樣給攜程主站搜索(下文簡稱大搜)帶來了許多挑戰(zhàn),如:

?

  • 搜索方式多樣化

  • 場景多樣化

  • 業(yè)務(wù)多樣化

  • 意圖多樣化

  • 用戶多樣化

?

為了更好滿足搜索的多樣化,大搜團(tuán)隊(duì)對傳統(tǒng)機(jī)器學(xué)習(xí)和深度學(xué)習(xí)方向進(jìn)行探索。

?

說起機(jī)器學(xué)習(xí)和深度學(xué)習(xí),是個(gè)很大的話題,今天我們只來一起聊聊傳統(tǒng)機(jī)器學(xué)習(xí)中XGBoost在大搜中的排序?qū)嵺`。

?

二、XGBoost探索與實(shí)踐

?

聊起搜索排序,那肯定離不開L2R。Learning to Rank,簡稱(L2R),是一個(gè)監(jiān)督學(xué)習(xí)的過程,需要提前做特征選取、訓(xùn)練數(shù)據(jù)的獲取然后再做模型訓(xùn)練。

?

L2R可以分為:

?

  • PointWise

  • PairWise

  • ListWise

?

PointWise方法只考慮給定查詢下單個(gè)文檔的絕對相關(guān)度,不考慮其他文檔和給定查詢的相關(guān)度。

?

PairWise方法考慮給定查詢下兩個(gè)文檔直接的相對相關(guān)度。比如給定查詢query的一個(gè)真實(shí)文檔序列,我們只需要考慮任意兩個(gè)相關(guān)度不同的文檔直接的相對相關(guān)度。相比PointWise,PairWise方法通過考慮任意兩個(gè)文檔直接的相關(guān)度進(jìn)行排序,有一定的優(yōu)勢。

?

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

?

下面先簡單介紹XGBoost的應(yīng)用流程:

?

?

XGBoost是一個(gè)優(yōu)化的分布式梯度增強(qiáng)庫,增強(qiáng)樹模型,靈活便捷。但對高維度的稀疏矩陣支持不是很好,另外調(diào)參確實(shí)有點(diǎn)麻煩。

?

三、特征工程實(shí)踐

?

?

在傳統(tǒng)機(jī)器學(xué)習(xí)下,特征工程顯的尤為重要,不論后續(xù)模型工程做的多好,如果前期的特征工程沒有做好,那么訓(xùn)練的結(jié)果不會(huì)有多好。所以對特征處理的總體邏輯如下:

?

?

3.1 前期數(shù)據(jù)準(zhǔn)備

?

首先,我們需要進(jìn)行需求分析,就是在什么場景下排序。假設(shè)我們需要針對搜索召回的POI場景進(jìn)行排序,那么需要確定幾件事情:

?

  • 數(shù)據(jù)來源:搜索的數(shù)據(jù)就是各種POI,然后需要確定我們有哪些數(shù)據(jù)可以用來排序,比如最近半年的搜索POI的曝光點(diǎn)擊數(shù)據(jù)等;

  • 特征梳理:需要梳理影響POI排序的因子,例如查詢相關(guān)特征、POI相關(guān)特征、用戶相關(guān)特征等;

  • 標(biāo)注規(guī)則制定:每次搜索召回的每個(gè)POI,會(huì)有曝光和點(diǎn)擊數(shù)據(jù),簡單點(diǎn),比如:我們可以將曝光位置作為默認(rèn)標(biāo)注分,當(dāng)有點(diǎn)擊,就將標(biāo)注分在原來的基礎(chǔ)上加一;

  • 數(shù)據(jù)埋點(diǎn)/數(shù)據(jù)抽取:這是兩種方式,可以根據(jù)實(shí)際需求進(jìn)行選擇;

?

    • 數(shù)據(jù)埋點(diǎn):可以在線上實(shí)時(shí)生成特征,然后進(jìn)行日志埋點(diǎn),離線分析的時(shí)候可以直接從日志中拉取即可,這種方式,需要提前進(jìn)行埋點(diǎn)。

    • 數(shù)據(jù)抽取:可以通過大數(shù)據(jù)平臺(tái)拉取歷史數(shù)據(jù),然后進(jìn)行離線計(jì)算抽取所需特征,這種方式雖然慢點(diǎn),但是可以拉取歷史數(shù)據(jù)進(jìn)行分析。

?

3.2 特征處理

?

前期的數(shù)據(jù)準(zhǔn)備工作完成了,接下來可以開始看看數(shù)據(jù)質(zhì)量了。

?

  • 查看缺失值:絕大多數(shù)情況下,我們都需要對缺失值進(jìn)行處理;

  • 特征歸一化處理:監(jiān)督學(xué)習(xí)對特征的尺度非常敏感,因此,需要對特征歸一化用來促進(jìn)模型更好的收斂;

  • 噪聲點(diǎn)處理:異常的數(shù)據(jù)會(huì)影響模型預(yù)測的正確性;

  • 特征連續(xù)值分析:分析特征的值分布范圍是否均勻;

  • 特征之間的相關(guān)性分析;

    ?

?

通過連續(xù)值特征可以分析每個(gè)特征值的大致分布范圍,有利于對相關(guān)特征進(jìn)行數(shù)據(jù)補(bǔ)充或者重新篩選。

?

?

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

?

四、模型工程實(shí)踐

?

?

4.1 評(píng)估指標(biāo)制定

?

在搜索業(yè)務(wù)中,考慮的有以下兩種情況:

?

  • 看重用戶搜索的成功率,即有沒有點(diǎn)擊;

  • 看重頁面第一屏的曝光點(diǎn)擊率;

?

在文章開頭提到的L2R的三種分類中,我們在XGBoost參數(shù)objective配置“rank:pairwise”,同時(shí)使用搜索系統(tǒng)常用的評(píng)估指標(biāo)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 初始模型訓(xùn)練

?

前期通過基礎(chǔ)的模型訓(xùn)練,可以初步得出一些初始參數(shù)和相關(guān)特征的重要度等相關(guān)信息。

?

  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
  • ?
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('特征名稱', '特征權(quán)重值')feature_score = xgb_model.get_fscore()pd.Series(feature_score).sort_values(ascending=False)

?

?

4.3 模型調(diào)優(yōu)五部曲

?

通過上述基礎(chǔ)的模型訓(xùn)練,我們可以得出相關(guān)的初始參數(shù),進(jìn)入到五部曲環(huán)節(jié),XGBoost參數(shù)調(diào)節(jié)基本為五個(gè)環(huán)節(jié):

?

  • Step 1:選擇一組初始參數(shù);

  • Step 2:改變 max_depth 和 min_child_weight;

  • Step 3:調(diào)節(jié) gamma 降低模型過擬合風(fēng)險(xiǎn);

  • Step 4:調(diào)節(jié) subsample 和 colsample_bytree 改變數(shù)據(jù)采樣策略;

  • Step 5:調(diào)節(jié)學(xué)習(xí)率 eta;



  • ?

例如我們在通過step1,可以觀察弱分類數(shù)目的大致范圍,看看模型是過擬合還是欠擬合。

?

?

通過step2調(diào)整樹的深度和節(jié)點(diǎn)權(quán)重,這些參數(shù)對XGBoost性能影響最大,我們簡要概述他們:

?

  • max_depth:樹的最大深度。增加這個(gè)值會(huì)使模型更加復(fù)雜,也容易出現(xiàn)過擬合,深度3-10是合理的;

  • min_child_weight:正則化參數(shù)。如果樹分區(qū)中的實(shí)例權(quán)重小于定義的總和,則停止樹構(gòu)建過程。

?

可以通過網(wǎng)格搜索發(fā)現(xiàn)最佳結(jié)果,當(dāng)然也可以通過其他方式。

?

?

我們看到,從網(wǎng)格搜索的結(jié)果,分?jǐn)?shù)的提高主要是基于max_depth增加。min_child_weight稍有影響的成績,但是min_child_weight = 6會(huì)更好一些。

?

4.4 模型離線評(píng)估

?

通過調(diào)優(yōu)五部曲,訓(xùn)練,生成最終的模型之后,就要進(jìn)入離線評(píng)估階段。離線拉取線上生產(chǎn)用戶的請求,模擬生產(chǎn),對模型預(yù)測的結(jié)果進(jìn)行檢驗(yàn),根據(jù)在之前評(píng)估指標(biāo)制定環(huán)節(jié)所提到的用戶點(diǎn)擊率和第一屏曝光點(diǎn)擊率,比對線上用戶點(diǎn)擊產(chǎn)品的位置和模型預(yù)測的位置,同時(shí)對比兩者之間的第一屏曝光點(diǎn)擊率。

?

4.5 模型預(yù)測

?

通過AB實(shí)驗(yàn),對模型進(jìn)行線上預(yù)測,實(shí)時(shí)監(jiān)測效果評(píng)估,方便之后的迭代和優(yōu)化。

?

五、總結(jié)與展望

?

?

  • 對于傳統(tǒng)的機(jī)器學(xué)習(xí),最重要的一步是要做好需求分析,評(píng)估這種算法是否能有效解決該問題,否則得不償失;

?

  • 前期的特征工程非常關(guān)鍵。通過多次的摸索發(fā)現(xiàn),特征沒有選取好,或者數(shù)據(jù)覆蓋不全,標(biāo)注沒做好,導(dǎo)致后續(xù)模型不論怎么調(diào)優(yōu),都無法達(dá)到預(yù)定的效果;

?

  • 選定目標(biāo)后,可以先嘗試一些優(yōu)秀的開源工具、優(yōu)秀的數(shù)據(jù)分析工具。直觀的圖表能幫助你做更好的決策,優(yōu)秀的算法庫,能避免重復(fù)造輪子;

?

  • 單一的算法無法滿足搜索排序應(yīng)用場景,多模型融合以及深度學(xué)習(xí)方向需要做更深入的探索與實(shí)踐;

總結(jié)

以上是生活随笔為你收集整理的XGBoost在携程搜索排序中的应用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。