知乎地址: https://zhuanlan.zhihu.com/p/71609590
github地址: https://github.com/jiaweitao/2019-tencent-ad-competition-Rank16-solution
寫在前面
這次騰訊的第三屆廣告算法大賽,是我第一次參加,取得了初賽與復賽均為23名的成績,決賽16名 ,畢竟我只是初打比賽不久的小白。我想在此分享下我的基本解題思路。
賽題背景:
廣告曝光預估如何應用在實際業務中?
騰訊的效果廣告主要是展示類廣告,其背后的算法引擎本質上是一個推薦框架。當新增一條廣告請求時,系統會自動執行召回候選廣告和排序篩選兩個步驟。
召回的條件是判斷廣告自身的定向設置、時段設置、素材尺寸是否和當前請求的用戶屬性、請求時間、廣告位規格相匹配。召回之后的候選廣告隊列會按照一定規則排序。為平衡平台收益和用戶體驗,排序使用的是廣義的eCPM(千次曝光消耗)指標來排序,其中包括:直接與bid(廣告主願意為每次點擊付出的錢)、pctr(廣告的預估點擊率)相關的basic_eCPM;以及和用戶體驗相關的quality_eCPM。所以易知,同一個廣告bid越大,total_eCPM越高,排第一的可能性越高,獲得曝光的機會越大。這也是競價廣告機制的特性之一。
因此,當廣告的出價、定向、投放時段和素材被設定好之后,它覆蓋的人群范圍和實際競爭環境、自身競爭能力就能夠大致確定,也就基本決定了廣告的日曝光量級。假設我們的廣告主投放相對穩定,沒有突然出現大廣告主出高價競爭,流量也無特別大的波動(比如節假日、購物節等)。這樣我們就可以據此預估廣告每日曝光。
這樣的預估結果能夠在實際場景中為廣告主服務。廣告主可以根據曝光預估結果提前調整出價、定向、時段等設置,結合自身的投放預期選擇最適合自己的設置,而不是投放幾天之后再去修改,從而減少廣告主的試錯時間和成本。場外Tips?
本次賽題是從實際的業務問題中做了簡化,同時也盡量保留了一些業務問題的原貌。樣本和特征維度需要大家從不同部分的數據文件中清洗、提煉、拼接,定義出樣本和特征維度以及訓練的目標Label。而上述步驟,其實也是實際工作中的一個小縮影。實際廣告投放中涉及多流量頻道,多廣告類型,並會包含不同的計費模式、不同的出價模式(如oCPA智能出價),以及復雜的定向方式(自動定向、lookalike等)。
本次的賽題中,測試集中的廣告選取了簡單定向設置的傳統CPC出價廣告。傳統CPC出價,即為廣告主給每個廣告一個出價bid,其代表了願意為每次廣告點擊支付的費用(做gsp二階機制里實際單次點擊扣費要低於bid),對每次廣告請求,廣告都以這個bid去參與競爭排序,直到廣告主主動修改出價。當然,CPC出價的廣告會和其他不同類型(包括智能出價等)廣告一同去搶曝光,所以歷史曝光日志里的廣告和廣告靜態數據里的廣告不光是傳統CPC出價廣告。
為了降低大家的理解難度和干擾,在不影響建模的情況下,我們在提供初賽數據時有意做了刪減。初賽數據可以理解為只有和測試集中同類型的廣告才能得到全部的完整廣告設置。
關於初賽階段最終的評估指標,除了數值預估問題最常用的准確性指標以外,出於業務場景的實際需要,我們還加入了出價相關性的評估指標,也就是出價和預估曝光的正相關。這意味着,選手們需在滿足相關性的基礎上同時最大化預估的准確性,這也是此次賽題和其他CTR預估或者推薦問題最大的差異和挑戰。
初賽復賽任務解釋
和初賽數據相比,復賽數據有不小的改變。其中最大的變化是測試集上的 變化,線下了解到選手們對此也有不同的看法和困惑。因此,從出題者的角度 來說說這樣做的考慮。 首先,就是測試集給了預估當天的日志明細(當然隱去了待預估廣告的信 息), 以及預估廣告實際觸發的請求列表。這和初賽只給了待預估廣告的定向 時段等設置是不同的,有些同學認為是 leak 特征,即用未來的數據用於未來 目標的預測。我們內部一般稱之為“穿越”。
在真實業務場景中當然無法直接用未來的特征來預估,更不會用 leak 或穿 越的特征去訓練模型直接應用到線上(要么無法構造真實樣本要么做各種近似 后效果大打折扣)。但在特定工作場景中,使用"穿越"特征在做特征類和算法 調研上仍有用武之地。
回到我們的曝光預估問題本身, 它的核心問題有兩個:一是預估廣告的競 爭環境和覆蓋能力;二是預估自身的競爭力以及在競爭環境中的勝出能力。更通俗一點, 一是要估計廣告在未來可能會被哪些用戶的請求觸發,這些請求同 時觸發的競爭對手水平如何; 二是要估計廣告自己在這些請求中競爭里如何, 以及能勝出的比例。而在實際工作中,為提升整體的研發效率,整個曝光預估 的任務是可以按上述一分為二的並行去做的。而且二個子任務的側重和瓶頸各 不相同,抽象而成的建模問題也是有差異的。
第一個子任務就是用廣告的定向時段等設置來用預估未來的觸發請求數和 曝光分數分布情況,它也可拆分兩個更小的目標,一是用定向時段素材尺寸這 些來召回歷史匹配的請求數據,這部分主要是業務規則的匹配,瓶頸主要在於 運行的效率和復雜業務規則的適配及可擴展問題(實際業務中的定向維度遠比 初賽中使用的定向維度復雜的多,不同廣告位的業務匹配邏輯也更加復雜), 二是用歷史請求數據預估未來的請求數據,這更像是一個時間序列建模問題, 即用歷史的變化趨勢預估未來。
第二個子任務是預估廣告的相對競爭水平以及基於此的勝出比例,它的前 提是觸發的請求和競價隊列已知(這是第一個子任務的預估結果)。此時,我 們如果使用當天已知的觸發請求和競價隊列去抽取特征建模預估當天的曝光 (即使用所謂”穿越“特征),這里得到的評估結果必然是高估的(和實際業務 效果對比),因為這實際上是基於第一個子任務預估百分百准確的前提。 但這 不妨礙基於此去做特征構建和模型算法的調研選擇(基於同樣假設的評估結果 橫向比較)。 而經調研優選得到的最優的特征和模型,同樣可以結合第一個子 任務的結果重新進行評估(相同的特征計算方式和模型從未來數據遷移到歷史 數據),最終得到真實的模型整體預估效果。 綜上,大家已經可以看出,初賽是完整的業務問題抽象, 而復賽數據其實 就是第二個子任務的抽象。
賽題分析:
騰訊效果廣告采用的是GSP(Generalized Second-Price)競價機制,廣告的實際曝光取決於廣告的流量覆蓋大小和在競爭廣告中的相對競爭力水平。其中廣告的流量覆蓋取決於廣告的人群定向(匹配對應特征的用戶數量)、廣告素材尺寸(匹配的廣告位)以及投放時段、預算等設置項。而影響廣告競爭力的主要有出價、廣告質量等因素(如pctr/pcvr等), 以及對用戶體驗的控制策略。 通常來說, 基本競爭力可以用ecpm = 1000 * cpc_bid * pctr = 1000 * cpa_bid * pctr * pcvr (cpc, cpa分別代表按點擊付費模式和按轉化付費模式)。綜上,前者決定廣告能參與競爭的次數以及競爭對象,后者決定在每次競爭中的勝出概率。二者最終決定廣告每天的曝光量。
本次競賽將提供歷史n天的曝光廣告的數據(特定流量上采樣), 包括對應每次曝光的流量特征(用戶屬性和廣告位等時空信息)以及曝光廣告的設置和競爭力分數;測試集是新的一批廣告設置(有完全新的廣告id, 也有老的廣告id修改了設置), 要求預估這批廣告的日曝光 。(出於業務數據安全保證的考慮,所有數據均為脫敏處理后的數據。)
此次問題有兩個評判標准,1 准確性相關指標 2單調性指標。 准確性指標采用SMAPE,出價單調性指標指對待預估廣告 ad, 除出價 bid 外其他設置不變,任意變化 n 個 bid 取值,得到對應
的 n 個曝光預估值 ,滿足單調性,為此可采用兩步走,第一步預測保證單個廣告的預估曝光量相同,也就是相同廣告id的特征相同。第二步調整廣告id預估曝光量的單調性,這里要盡量保證
預估曝光量的穩定性,由於不知道真實出價,可對bid進行排名,此外由於要求保留四位小數,單調性調整可使用基准曝光量+0.0001*出價排名。
問題建模:
由於此次比賽只提供了歷史廣告曝光日志,與廣告靜態屬性以及廣告操作屬性,所以需要自己構造訓練集與驗證集。
廣告操作數據處理:
由於廣告的操作屬性如狀態取值,出價,投放時段,以及定向人群每天的值是不同的,所以可采用兩種方案:第一種是直接取創建時的屬性,第二種是利用請求時間以及修改創建時的時間進行匹配得到廣告的操作屬性,經試驗, 線上差距不大
訓練集與驗證集生成:
初賽提取方案:以請求時間,廣告id為主鍵,對request-id求count,就得到了某個廣告某一天的曝光量。
復賽提取方案: 對競價隊列進行展開,同樣以請求時間,廣告id為主鍵,對曝光量標志位求sum,就得到了某個廣告某一天的曝光量。
廣告id的選取:直觀來看訓練集樣本數量越多,但是仔細讀題后發現初賽測試集預測的主要是CPC類廣告,所以對於無法在廣告操作數據表中匹配到的數據都可以舍棄,這樣清洗下來的數據量又明顯小了一大截,只剩下十幾萬了。 采用同樣的方法訓練,雖然數據量變小了,但線上成績提高了。同時由於0曝光量數量太多,會導致模型學到很多負值,所以可過濾掉請求次數小於特定值,仍舊是0曝光的廣告,留下很不容易的曝光廣告。
特征工程:
初賽方案:
規則: 可采用測試集前兩天的歷史曝光量均值:
模型:
初賽主要圍繞兩方面來考慮: 一是用定向時段素材尺寸這 些來召回歷史匹配的請求數據, 二是用歷史請求數據預估未來的請求數據。
采用廣告特征有兩方面,第一個是基本靜態特征如廣告id,廣告賬戶id等屬性,第二個是投放時段以及定向人群。對於投放時段以及定向人群,一方面可以看做是多值特征,利用CountVectorizer進行詞頻統計,第二個是計算投放時 長,第二個是將定向人群特征進行拆分成用戶屬性,如年齡,性別,地域,婚戀狀態,學歷,消費能力,設備,工作狀態,連接類型,行為興趣等等。利用user_data日志文件構建字典,通過拆分后的人群屬性計算各個字段人群數量。拆分后的定向人群屬性同樣是多值屬性,仍舊采用CountVectorizer進行詞頻統計。 如果想要得到更精確地人群定向屬性,可利用深度優先搜索暴力枚舉定向人群屬性完整的用戶屬性,不過復雜度太高。
這樣就通過定向和用戶匹配、廣告位和素材匹配等規則估算了廣告的覆蓋范圍
初賽A的時候大部分人模型都干不過規則,從這方面可以考慮歷史曝光量相關特征。由於測試集中有完全新的廣告id,所以可以考慮歷史平移構造廣告id、廣告賬戶id、廣告行業id、商品id、的歷史曝光量,保證新舊廣告的預測准確度。進一步可以考慮二階,三階等。初賽B的時候發現了以下規律,
測試集a中的舊廣告大多能在操作數據中找到對應數據,但是測試集b中有很多舊廣告找不到對應的操作數據。基於這樣的情況,出題方可能提供了一種新類型的廣告,
那么可以利用創建時間,請求時間,請求時間減去創建時間作為特征。
初賽模型方案是舊廣告用規則(采用前兩天廣告id的歷史曝光量均值),新廣告用模型預測。
復賽方案:
規則:采用廣告id的歷史獲勝概率(廣告id的曝光量除以廣告id的請求次數)乘以測試集當天的請求次數,這里需要注意一點的是如果直接用測試集前一天的獲勝概率乘以測試集當天的請求次數,效果並不好,原因是
測試集廣告在前一天的廣告id較少,采用歷史均值是較好的方案。此外由於不同廣告在不同廣告位上的請求分布也是不一樣的,那么通過求廣告id在某一廣告位的獲勝概率是比較有效地,線上相比單單采取廣告
id的獲勝概率,規則提升了0.2,然而模型並沒有提升,這可能是累積導致誤差增大的緣故。
模型:
對於預測類問題來說,一般時間越接近的特征,越准確,復賽提供了測試集當天信息,那么我們就必須要充分利用。所以特征按照時間主要分為兩方面,第一個是歷史特征,第二個是當天特征,
當天特征主要有當天的請求次數,當天的失效率,
歷史特征主要有歷史曝光量,未曝光量,曝光比例,可采用五折交叉統計以及歷史平移統計,廣告id的pctr,quality_ecpm,total_ecpm等競爭力特征,這部分采用歷史平移效果較好。
由於模型主要針對新廣告,所以需要利用廣告的靜態屬性構造上述特征。如廣告賬戶id,廣告行業id,商品id,等等二階甚至三階都是可以做的。
上述構造特征采用的主要手段有五折交叉,歷史平移,CountVectorizer下面分別介紹。
目標編碼,一切問題都可以考慮根據目標變量進行有監督的構造特征。此題也不例外,目標變量為廣告日曝光值,那么我們就可以構造與目標有關的特征。然而這會存在一個問題,特別容易過擬合。
CTR比賽中歷史點擊率無疑是一個強特,但是往往會造成過擬合。究其原因是進行目標編碼的時候沒有防過擬合處理,導致數據泄露。有效的辦法是采用交叉驗證的方式,比如我們將將樣本划分為5份,對於其中每一份數據,我們都用另外4份數據來構造。簡單來說未知的數據在已知的數據里面取特征。
統計特征,一切皆可統計,類別特征可以計數統計,可以nunique統計,數值特征可以均值統計,最大最小,中位數等。官方解釋把該問題抽象成一個符合正相關性的CTR預估問題,也就是說pctr越大,其曝光量就應該越大。既然廣告曝光預測問題不好理解,我們可以將其轉為CTR問題。這樣就可以根據相關賽題,聯想到很多特征。
歷史平移,對於這種包含時間的時序問題,測試集的具體數據是不知道的,我們可以使用前n天來曝光量,或者是pctr作為測試集的特征。如下圖,d-1天的信息作為d天的特征,這種相近日期的數據相關性是非常大的。在群里也能看到很多人直接用前一天的曝光量才填充,這種規則就能得到很高的分數。
CountVectorizer是屬於常見的特征數值計算類,是一個文本特征提取方法,屬於詞袋模型,進一步地有TF-IDF模型。對於每一個訓練文本,它只考慮每種詞匯在該訓練文本中出現的頻率。對於多值特征,最方便的展開方式就是使用CountVectorizer。
模型評估與驗證:
交叉驗證。這里有兩個驗證方案,1.由於是時序問題,為了避免數據泄露,常選擇訓練集最后一天進行線下驗證。2.K-folds交叉驗證,這個線下應該會比方案1線下好些。
模型融合:
新舊廣告定義: 未在訓練集中出現的廣告id為歷史舊廣告,否則為新廣告,歷史舊廣告采用規則,新廣告采用模型
規則融合:規則一采用廣告id在某個廣告位的歷史獲勝概率乘以廣告id當天在這個廣告位的請求次數,規則二采用廣告id在某個廣告位的單次歷史獲勝概率乘以廣告id當天在這個廣告位競爭對手的個數, 采用加權融合
模型融合:模型一使用lightgbm訓練,模型二使用xgboost訓練,特征方面的差異主要有lightgbm使用廣告id在某個廣告位的歷史獲勝概率以及廣告id當天在這個廣告位的請求次數構造特征,模型二采用廣告id在某個
廣告位的單次歷史獲勝概率以及廣告id當天在這個廣告位競爭對手的個數構造特征, 最終采用加權融合。
參考文獻:
1 https://zhuanlan.zhihu.com/p/63718151
2 https://algo.qq.com/application/home/information/info.html