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

熱線電話:13121318867

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

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


5. 實(shí)時(shí)用戶行為

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

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

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

6. 替補(bǔ)策略

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

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

子策略融合

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

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

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

候選集重排序

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

1. 模型

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

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

主要的步驟如下:

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

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

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

3. 特征

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

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

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

總結(jié)

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

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

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

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

若不方便掃碼,搜微信號(hào):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(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) 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){ //倒計(jì)時(shí)完成 $(".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); }