99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀美團推薦算法實踐(2)_數(shù)據(jù)分析師
美團推薦算法實踐(2)_數(shù)據(jù)分析師
2015-01-23
收藏

美團推薦算法實踐(2)_數(shù)據(jù)分析師


5. 實時用戶行為

目前我們的業(yè)務(wù)會產(chǎn)生包括搜索、篩選、收藏、瀏覽、下單等豐富的用戶行為,這些是我們進行效果優(yōu)化的重要基礎(chǔ)。我們當(dāng)然希望每一個用戶行為流都能到達轉(zhuǎn)化的環(huán)節(jié),但是事實上遠非這樣。

當(dāng)用戶產(chǎn)生了下單行為上游的某些行為時,會有相當(dāng)一部分因為各種原因使行為流沒有形成轉(zhuǎn)化。但是,用戶的這些上游行為對我們而言是非常重要的先驗知識。很多情況下,用戶當(dāng)時沒有轉(zhuǎn)化并不代表用戶對當(dāng)前的item不感興趣。當(dāng)用戶再次到達我們的推薦展位時,我們根據(jù)用戶之前產(chǎn)生的先驗行為理解并識別用戶的真正意圖,將符合用戶意圖的相關(guān)deal再次展現(xiàn)給用戶,引導(dǎo)用戶沿著行為流向下游行進,最終達到下單這個終極目標(biāo)。

目前引入的實時用戶行為包括:實時瀏覽、實時收藏。

6. 替補策略

雖然我們有一系列基于用戶歷史行為的候選集觸發(fā)算法,但對于部分新用戶或者歷史行為不太豐富的用戶,上述算法觸發(fā)的候選集太小,因此需要使用一些替補策略進行填充。

  • 熱銷單:在一定時間內(nèi)銷量最多的item,可以考慮時間衰減的影響等。
  • 好評單:用戶產(chǎn)生的評價中,評分較高的item。
  • 城市單:滿足基本的限定條件,在用戶的請求城市內(nèi)的。

子策略融合

為了結(jié)合不同觸發(fā)算法的優(yōu)點,同時提高候選集的多樣性和覆蓋率,需要將不同的觸發(fā)算法融合在一起。常見的融合的方法有以下幾種[3]

  1. 加權(quán)型:最簡單的融合方法就是根據(jù)經(jīng)驗值對不同算法賦給不同的權(quán)重,對各個算法產(chǎn)生的候選集按照給定的權(quán)重進行加權(quán),然后再按照權(quán)重排序。
  2. 分級型:優(yōu)先采用效果好的算法,當(dāng)產(chǎn)生的候選集大小不足以滿足目標(biāo)值時,再使用效果次好的算法,依此類推。
  3. 調(diào)制型:不同的算法按照不同的比例產(chǎn)生一定量的候選集,然后疊加產(chǎn)生最終總的候選集。
  4. 過濾型:當(dāng)前的算法對前一級算法產(chǎn)生的候選集進行過濾,依此類推,候選集被逐級過濾,最終產(chǎn)生一個小而精的候選集合。

目前我們使用的方法集成了調(diào)制和分級兩種融合方法,不同的算法根據(jù)歷史效果表現(xiàn)給定不同的候選集構(gòu)成比例,同時優(yōu)先采用效果好的算法觸發(fā),如果候選集不夠大,再采用效果次之的算法觸發(fā),依此類推。

候選集重排序

如上所述,對于不同算法觸發(fā)出來的候選集,只是根據(jù)算法的歷史效果決定算法產(chǎn)生的item的位置顯得有些簡單粗暴,同時,在每個算法的內(nèi)部,不同item的順序也只是簡單的由一個或者幾個因素決定,這些排序的方法只能用于第一步的初選過程,最終的排序結(jié)果需要借助機器學(xué)習(xí)的方法,使用相關(guān)的排序模型,綜合多方面的因素來確定。

1. 模型

非線性模型能較好的捕捉特征中的非線性關(guān)系,但訓(xùn)練和預(yù)測的代價相對線性模型要高一些,這也導(dǎo)致了非線性模型的更新周期相對要長。反之,線性模型對特征的處理要求比較高,需要憑借領(lǐng)域知識和經(jīng)驗人工對特征做一些先期處理,但因為線性模型簡單,在訓(xùn)練和預(yù)測時效率較高。因此在更新周期上也可以做的更短,還可以結(jié)合業(yè)務(wù)做一些在線學(xué)習(xí)的嘗試。在我們的實踐中,非線性模型和線性模型都有應(yīng)用。

  • 非線性模型
    目前我們主要采用了非線性的樹模型Additive Groves[4](簡稱AG),相對于線性模型,非線性模型可以更好的處理特征中的非線性關(guān)系,不必像線性模型那樣在特征處理和特征組合上花費比較大的精力。AG是一個加性模型,由很多個Grove組成,不同的Grove之間進行bagging得出最后的預(yù)測結(jié)果,由此可以減小過擬合的影響。
    <a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推薦系統(tǒng)</a>每一個Grove有多棵樹組成,在訓(xùn)練時每棵樹的擬合目標(biāo)為真實值與其他樹預(yù)測結(jié)果之和之間的殘差。當(dāng)達到給定數(shù)目的樹時,重新訓(xùn)練的樹會逐棵替代以前的樹。經(jīng)過多次迭代后,達到收斂。
    <a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推薦系統(tǒng)</a>

<a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推薦系統(tǒng)</a>

<a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推薦系統(tǒng)</a>

  • 線性模型
    目前應(yīng)用比較多的線性模型非Logistic Regression莫屬了。為了能實時捕捉數(shù)據(jù)分布的變化,我們引入了online learning,接入實時數(shù)據(jù)流,使用google提出的FTRL[5]方法對模型進行在線更新。
    <a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推薦系統(tǒng)</a>

主要的步驟如下:

  • 在線寫特征向量到HBase
  • Storm解析實時點擊和下單日志流,改寫HBase中對應(yīng)特征向量的label
  • 通過FTRL更新模型權(quán)重
  • 將新的模型參數(shù)應(yīng)用于線上

2. 數(shù)據(jù)

  • 采樣:對于點擊率預(yù)估而言,正負樣本嚴重不均衡,所以需要對負例做一些采樣。
  • 負例:正例一般是用戶產(chǎn)生點擊、下單等轉(zhuǎn)換行為的樣本,但是用戶沒有轉(zhuǎn)換行為的樣本是否就一定是負例呢?其實不然,很多展現(xiàn)其實用戶根本沒有看到,所以把這樣樣本視為負例是不合理的,也會影響模型的效果。比較常用的方法是skip-above,即用戶點擊的item位置以上的展現(xiàn)才可能視作負例。當(dāng)然,上面的負例都是隱式的負反饋數(shù)據(jù),除此之外,我們還有用戶主動刪除的顯示負反饋數(shù)據(jù),這些數(shù)據(jù)是高質(zhì)量的負例。
  • 去噪:對于數(shù)據(jù)中混雜的刷單等類作弊行為的數(shù)據(jù),要將其排除出訓(xùn)練數(shù)據(jù),否則會直接影響模型的效果。

3. 特征

在我們目前的重排序模型中,大概分為以下幾類特征

  • deal(即團購單,下同)維度的特征:主要是deal本身的一些屬性,包括價格、折扣、銷量、評分、類別、點擊率等
  • user維度的特征:包括用戶等級、用戶的人口屬性、用戶的客戶端類型等
  • user、deal的交叉特征:包括用戶對deal的點擊、收藏、購買等
  • 距離特征:包括用戶的實時地理位置、常去地理位置、工作地、居住地等與poi的距離

對于非線性模型,上述特征可以直接使用;而對于線性模型,則需要對特征值做一些分桶、歸一化等處理,使特征值成為0~1之間的連續(xù)值或01二值。

總結(jié)

以數(shù)據(jù)為基礎(chǔ),用算法去雕琢,只有將二者有機結(jié)合,才會帶來效果的提升。對我們而言,以下兩個節(jié)點是我們優(yōu)化過程中的里程碑:

  • 將候選集進行融合:提高了推薦的覆蓋度、多樣性和精度
  • 引入重排序模型:解決了候選集增加以后deal之間排列順序的問題
    <a href='/map/tuijianxitong/' style='color:#000;font-size:inherit;'>推薦系統(tǒng)</a>

以上是我們在實踐中的一點總結(jié),當(dāng)然我們還有還多事情要做。

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }