天天看點

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1

  • 寫在前面
  • 1.比賽成績
  • 2.基礎方案
    • 2.1.賽題了解
    • 2.2.特征工程
    • 2.3.算法實作
  • 3.冷啟動探索
    • 3.1.資料分析
    • 3.2.新使用者異常
    • 3.3.分布調整方案
      • 3.3.1.采樣
      • 3.3.2.特征調整
        • 3.3.2.1.分布遷移
        • 3.3.2.2.特征映射&特征弱化
        • 3.3.2.3.GNN傳遞
      • 3.3.3.特征調整效果
  • 3.總結&不足
    • 3.1.總結
    • 3.2.不足
  • 寫在最後

寫在前面

華為賽(連結)終于是結束了。今年由于疫情原因,線下決賽搬到了線上進行,答辯的時候才去南京。決賽打榜在我們熟悉的環境進行,也給了足足5天時間,是以對我們還是有點好處的。最後隊友比較給力,穩住了初賽的成績,南京答辯也一切順利,拿到了最後機器學習賽道的冠軍。這裡偷偷插一句,現場答辯的時候我還是很亢奮的,結果到最後頒獎的時候就緊張了,擔心會被逆襲,還好最後的結果還是好的,哈哈哈。

比賽結束後自然是要分享和開源方案。此前初賽結束的時候就分享過搜尋相關性題目的方案和開源代碼。這裡就來講一下我們ctr題目的方案,整體順序将依托于我們答辯ppt進行。開源代碼位址為連結,歡迎各位大佬來star!

1.比賽成績

本次華為賽的機器學習賽道在初賽的時候包含兩個題目:ctr預估和搜尋相關性預測。我們在兩個題目的A/B榜上都保持了長久的第一,其中ctr預估題目的第一名從8月24日持續到9月30日,搜尋相關性預測題目的第一名從8月25日持續到9月30日。(這裡時間差一天是因為我們在8.24登頂ctr題之後才開始做搜尋題,然後在第二天登頂)

決賽的時候隻做ctr題,在A榜階段我們掉到了第二,B榜的時候才回到第一。其實當時A榜的時候感覺都要涼了,還好最後B榜給機會了( ̄▽ ̄)"

2.基礎方案

2.1.賽題了解

本次ctr預估題目非常傳統,給定前7天内每條曝光的點選行為,預測将來某一天内曝光的點選率,評價名額AUC。資料集劃分如下:

初賽階段:訓練集1-7天,A榜測試集第8天,B榜測試集第9天。

決賽階段:訓練集1-7天,A榜測試集第8天,B榜測試集第10天。

具體的特征可以看一下官網的描述,我們這裡稍微統計了一下,将特征根據内容劃分為使用者、廣告、媒體三方面特征,也可根據資料類型劃分為ID特征和連續特征。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

其中,關注的重點在于使用者特征和ID特征。

2.2.特征工程

我們使用的特征工程非常的正常,以至于大家看完可能都會說一句:就這?包含四個特征:曝光特征、交叉特征、ctr特征、embedding特征:

曝光特征:統計所有ID類特征在8天内的曝光次數(即count特征)

交叉特征:統計使用者ID與所有廣告側ID、廣告ID與所有使用者側ID的類别交叉,如某個使用者ID曝光過多少不同的廣告ID(即nunique特征)

CTR特征:統計所有ID類特征前所有天的曆史點選率

embedding特征:建構廣告曝光序列,訓練word2vector得到廣告表征,平均廣告表征得到使用者表征

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

對于這些特征,還可以采取用滑窗的方式來統計,效果不一定更好,不過會有一定差異性。

在B榜階段,由于測試集是第9天或者第10天,與前7天的訓練集隔了一到兩天,會帶來很明顯的gap。這裡我們将A榜的資料也放進去一起統計特征,就可以顯著提升效果。這裡的A榜資料隻用于輔助做特征,并不參與訓練。我們也試過将之前A榜的預測結果二值化然後當成訓練資料來用,結果就會帶來非常嚴重的過拟合。

我們的方案經過優化之後,占用記憶體不到20G,目前看來應該是最輕量級的方案。

2.3.算法實作

我們使用lightgbm作為模型,在實際訓練的時候給予時間上越靠近測試集的樣本給予更大的權重。具體來說,第7天的樣本權重是1,第2天樣本的權重就是2/7。

我們通過滑窗和去除備援特征構造差異性模型來進行融合,在初賽A榜階段一直使用單模,B榜階段雙模,決賽階段三模。下圖是我們決賽B榜的分數,其實我們單模就已經到了0.8137,剛好比第二的分數高了一個千。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

大家看到這裡是否覺得我們的方案平平無奇?不用急,下面才是我們工作的重心😏

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

3.冷啟動探索

3.1.資料分析

我們首先把使用者的曝光特征以及交叉特征的機率密度圖畫出來。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

可以很明顯的看到,點選與不點選樣本的使用者特征分布差異非常明顯,這說明了本題中使用者特征與點選行為強相關,這也驗證了我們一開始的以使用者特征為重點的想法。

接着來看一下使用者冷啟動的情況。這裡統計了第7天訓練集中冷啟動使用者的情況。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

左圖是冷啟動使用者與老使用者的點選率差别,冷啟動使用者的點選率非常高,是老使用者的10倍。雖然我覺得這種現象非常奇怪,但是在本題的資料中,隻能認為這個廣告場景中冷啟動使用者的特性特别明顯,以至于廣告系統能夠很好把握。右圖是兩種使用者群體的特征分布,兩條尖的曲線就是冷啟動的分布。兩個圖的結合能夠說明冷啟動使用者點選率與特征分布呈現巨大的差異性,也就是說,隻要模型能夠正确區分出冷啟動使用者,就會有很高的分數。

接下來統計測試集的使用者冷啟動情況。這裡以第八天的測試集為例統計。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

左圖為相對于前所有天的統計結果,随着時間的推移,前七天冷啟動比例的統計結果逐漸穩定到0.05,但是第八天出現了暴漲,直飙0.22。考慮到相對前所有天統計是不公平的,我們繼續統計了相對前一天的冷啟動,發現前七天都處于比較穩定的狀态,而第八天依然暴漲。至此,我們确定了,第八天測試集中的冷啟動使用者确實比例非常的不正常。

然而,冷啟動隻有比例不正常嗎?我們繼續對這個群體探索。

3.2.新使用者異常

剛剛有提到,使用者的特征非常重要,其中最重要的一個特征是曝光特征。但是之前的曝光特征是八天一起統計的,老使用者和冷啟動使用者自然gap非常大。這裡,我們将每一天随機采樣到一定的總曝光量,然後統計不同使用者群體的日曝光,以觀察它們特征層面的差别。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

從日曝光上可以看到,老使用者的日曝光一般都接近冷啟動使用者日曝光的兩倍。但是第八天中,冷啟動日曝光再次暴漲。這點就讓人非常奇怪,似乎有種感覺,冷啟動使用者裡面混入了部分老使用者,因而拉高了它們的日曝光。

有跑過這個資料的同學都知道,線上線下分數的差别非常巨大。目前看來,這麼大的gap原因是測試集中冷啟動使用者在比例和日曝光上和訓練集的差異。我們對這個差異出現的原因進行了分析,提出了幾個猜想:

猜測一:測試集經過了特定的采樣。我們将第七天當作驗證集,然後嘗試去采樣成第八天的比例和日曝光,但是我們發現,經過采樣之後的驗證集分數其實下降不大,完全達不到第八天線上分數的效果,說明這個猜想是錯的。

猜測二:在第七天到第八天中廣告系統進行了更新。這個猜想就無法驗證了,當然我也覺得出題方不至于這樣搞事情。

猜測三:在第七天到第八天的過程中出現了使用者ID丢失的情況,部分老使用者在第八天變成了新使用者。我不知道在實際場景中是否會出現這種情況,但是隻要出題人把老使用者的ID改成新的ID就能出現這種效果。我們在第七天嘗試了一下,發現是完全可以得到線上分數的效果的。

(這裡補充說一下,我一開始十分堅定地認為是出題人改ID導緻的,但是後來現場和第二名的老哥溝通後,發現其實删掉前七天的部分老使用者,也可以達到一樣的效果,即可能出題方是對訓練集而不是測試集進行了針對的采樣。是以,後面就統一描述為使用者ID丢失的情況。)

根據猜測三,測試集的使用者冷啟動中,包含部分ID丢失的老使用者, 它們擁有着新使用者的特征分布,卻是老使用者的行為模式。模型遇到這部分使用者,會給予一個比較高的點選率,因為訓練集中的新使用者就是點選率偏高的,然而這部分使用者本身應該是較低的點選率,是以就會導緻嚴重的性能下降。是以,如何調整新使用者的特征分布是解決問題的關鍵。

3.3.分布調整方案

針對上面提出的問題,我們提出了一系列的解決方案,這些方案可以比較好地解決線上線下不一緻的情況,也是我們上分的關鍵點。

3.3.1.采樣

新使用者與老使用者之間特征分布的差異性,可以很簡單地用采樣的方式來緩解。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

右圖是随機采樣之後的特征分布情況,新老使用者之間的差異被明顯降低了。當然,随機采樣會導緻嚴重的資訊丢失,是以我們最後采用的是負采樣。僅僅使用負采樣+多折驗證的方式,就可以在初賽A榜到達接近0.8的分數。需要注意的是,負采樣在這裡并不是為了解決類别不平衡問題,而是為了緩解分布不一緻問題。

3.3.2.特征調整

我們還對所使用的四個特征分别進行特定的調整,來減少每一個特征帶來的gap。

3.3.2.1.分布遷移

對于曝光特征和交叉特征,我們提出一種非常簡單的分布遷移方案。這兩個特征的機率分布均為長尾分布,無法用特定表達式的參數來拟合,是以我們簡單地認為可以用均值和标準差來大緻表示分布情況。然後,樣本均值為機率分布均值的無偏估計,修正樣本标準差為機率分布标準差的無偏估計(直接用無修正的樣本标準差也行,畢竟樣本标準差是漸進無偏估計),我們對樣本計算這兩個統計量,然後簡單地歸一化。注意,我們隻對測試集的新使用者進行該操作。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後
華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

可以看到,經過分布遷移之後,新使用者的特征分布已經基本拟合前七天了。這個操作背後的想法是測試集的新使用者本來應該是老使用者,而我們要恢複這部分使用者原本的特征。這一個簡單的操作,可以給我們帶來不止一個百的提升。

3.3.2.2.特征映射&特征弱化

針對CTR特征,我們首先提出特征映射的方案。之前對于冷啟動使用者的曆史點選率,我們使用均值點選率來填充,但是這種操作會帶來不少的資訊丢失。更為嚴重的是,模型看到使用者曆史點選率為均值的樣本,會認為是新使用者并且給出比較高的點選率預測,然而實際上應該是低點選率的老使用者。是以,我們這裡将測試集冷啟動使用者的點選率根據當天曝光量映射為前七天同一日曝光量使用者的點選率的均值。這樣子可以得到一個相對準确的CTR特征。這一操作也會有百分位的提升,并且僅用這個操作就可以在初賽A榜達到0.812的分數,預測在B榜應該是10名左右的成績。

但是由于CTR特征是很強的特征,在訓練的時候順位很高,也就是說會在樹模型靠前的地方劃分分支。我雖然沒有打開看過,但是劃分出來的效果應該是一條分支是均值,然後另外很多條分支是基于點選率細緻的劃分。在推理的時候,如果樣本的CTR特征進入了這些細緻劃分的支路,那麼後面出來的預測結果基本跟這個點選率差不多,不會再根據其他特征有較大的調整。這就是一種強特掩蓋其他強特的現象,本質上是因為樹模型劃分節點時分而治之的思想。是以,經過特征映射之後的CTR特征會極大影響最後的輸出結果,但是這個特征映射并不能得到絕對準确,不能和前面提出的分布遷移方案相容,是以我們最後放棄了這個方案。

但是我們反其道而行之,提出一種特征弱化的方案。具體來說,就是将第七天30%的老使用者CTR改為均值填充,讓模型學會在CTR較弱的時候更加依賴其他特征。換一種說法,就是構造出了一部分點選率是均值的老使用者樣本,和測試集中的新使用者樣本對應,讓模型學習如何處理這一類樣本。這個特征弱化的方案有千分位的提升,并且可以與分布遷移相容,是最後采用的方案。

3.3.2.3.GNN傳遞

針對embedding特征,我們發現它其實也帶來了線上線下的gap。這個主要是因為使用者的embedding是由廣告的embedding平均而來的,但是第八天的新使用者隻有第八天的廣告曝光資訊,而第八天的廣告分布和前七天的有差别,是以得到的使用者embedding也會和老使用者有差别。為了解決這一個問題,我們參考GNN中GraphSAGE的消息傳遞思路,将特征在使用者與廣告之間再傳播一輪,進而聯系上前7天的其他廣告特征。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

操作其實非常簡單,就是使用者的embedding再次平均到廣告,然後廣告再次平均到使用者。當然,大家都知道GNN有非常嚴重的特征平滑問題,而且我們這裡與普通的GNN比隻有聚合沒有特征映射,平滑更嚴重了。是以,最後這個方案是隻有萬分位提升,幅度并不大。

3.3.3.特征調整效果

上面我們針對如何調整新使用者分布的問題提出了一些方案,包括負采樣、分布遷移、特征弱化和GNN傳遞。它們在初賽A榜的上分曲線如下所示。

華為digix算法大賽2020機器學習賽道-ctr預估初賽/決賽rank1寫在前面1.比賽成績2.基礎方案3.冷啟動探索3.總結&不足寫在最後

可以看到我們針對性提出的方案都是有提升的,而其中提升最多的是負采樣和分布遷移。

3.總結&不足

3.1.總結

我們的方案僅包括四大基礎特征:曝光特征、交叉特征、CTR特征和embedding特征,亮點在于針對新使用者的分布問題提出了兩大方案:負采樣和特征調整,其中特征調整又分為三個方案:分布遷移、特征弱化和GNN傳遞。

3.2.不足

其實我們工作比較明顯的不足,一個是沒有用深度模型(沒有做出好效果),一個是模型差異度不夠,融合上分很少。

然後是一些沒有做出來的東西,首先是我們一直以來就有的想法,那就是既然新老使用者的特征分布差異巨大,那麼是否分别用不同的模型來處理兩批使用者。但是由于最後的名額AUC是一個排序名額,兩個模型可能可以使得兩批使用者的内部排序更優,卻很難解決互相排序的問題。決賽有其他隊伍采用了兩個模型的方案,通過折線映射來使得兩個模型的輸出平衡,但是我覺得這種方案應該不太穩定。一個可能的方案是還需要第三個整體效果比較好的模型,用它來指導兩個模型的融合。

上面也提到了GNN的平滑性問題,我們在後面有想過用self-attention代替均值聚合,似乎可以緩解一下平滑情況,但是後面沒有時間和機會去嘗試了。除此之外,還有嘗試增量訓練,點選率貝葉斯平滑、graph embedding等,都沒有做出來。答辯的時候跟其他隊伍交流,點選率的貝葉斯平滑在除了使用者以外的特征上做就會有提升,可能這也是我們沒有做出來的原因。

寫在最後

曆時好多個月的華為賽終于結束了,這次的時間線拖得真是長,當然最後得收獲也是滿滿的。我覺得這次比賽能有這個成績,主要是因為一個思維的轉變。剛開始遇到線上線下不一緻的時候,我們先嘗試的是不管怎麼樣把線下弄高再說,結果收效甚微;然後回過頭來研究減少線上線下的gap,發現這才是上分的重點。當然也可能是我們參賽經驗比較少,是以會有一些比較奇怪的想法哈哈哈。當然最重要的還是好隊友,多進行思維的碰撞才會産生新的想法🧐。

繼續閱讀