03.03 「競賽」2019JDATA店鋪購買預測大賽冠軍方案


來源 | 學點詩歌和AI知識

作者 | xiaoxiaoyuererer

原文:https://blog.csdn.net/qq632683582/article/details/104111432

前言:趁著這次春節呆在家的日子整理一下CSDN。感謝19年JDATA比賽中李哥,曹哥的帶領,以及和俞兄,室友共同努力下取得不錯的成績(雖然本人後期因為有實習任務只是打打輔助了)。這也是筆者第一次體驗面向業務的數據挖掘流程,學習如何結合業務去做數據分析和建模,感覺和在實驗室跑UCI數據集區別挺大的。寫這篇文章好好覆盤一下比賽的經歷,為感興趣的小夥伴提供一些參考,也是對自己的一個總結。



文章主要包括賽題解讀數據探索(為了保證能讓讀者更加清楚瞭解數據特點,數據探索部分有引用了其他隊伍的比較具有參考價值的數據圖並給出了引用鏈接),數據集劃分特徵構建解題方案,模型設計賽後總結


注:賽題方要求不能公開代碼,關於代碼部分其實參考現有的幾個top10的開源方案已經足夠,這個比賽的得分點是在數據集構建方式和一些強特徵的挖掘,然後模型CV集成會影響到模型穩定性和泛化性能,這些點是更加核心的部分,當然文末也會給出一些不錯的工具,比如特徵篩選,調參工具。


比賽鏈接:https://jdata.jd.com/html/detail.html?id=8

一、賽題解讀:


目標

提供 2018-02-01 到 2018-04-15 用戶行為數據。需要對 2018-04-16 到 2018-04-22 用戶對品類下店鋪的購買進行預測。以 user_id, cate 和 user_id(用戶id), cate(商品種類), shop_id(店鋪id) F-SCORE 的加權組合作為最終評分。


評估指標


「競賽」2019JDATA店鋪購買預測大賽冠軍方案


F11是對user_id, cate組合進行評估,F12是對user_id, cate,shop_id組合進行評估


業務場景及其幾種解決方案

根據賽題描述和業務場景可推測,在目標區間購買的行為應該由兩部分組成:一部分為復購行為,一部分為即時性購買。


解題思路有如下幾種:

1. 直接對 user_id, cate, shop_id, sku_id 進行建模得到 user_id, cate, shop_id 組合。

2. 直接對 user_id, cate, shop_id 建模。

3. 對 user_id, cate 進行建模,也對 user_id,cate,shop_id 進行建模,組合兩個結果得到最後的結果。

4. 先對 user_id, cate 組合建模進行召回再對 user_id, cate, shop_id 建模。

在後續過程中會介紹模型選擇的思路並給出我們選擇方案4的理由


二、數據探索

用戶行為序列分析

(1瀏覽,2下單,3關注,4加購,5評論)

「競賽」2019JDATA店鋪購買預測大賽冠軍方案


春節時段用戶行為數據是有異常的(比如瀏覽,下單數減少,推測是用戶春節聚會活動使用app時間減少,在春節前年貨促銷活動時已經完成了大部分購買等原因導致),出於分佈一致性考慮,在後面建模中會避免使用到這段數據

3月27日和3月28日兩天瀏覽數據異常低而購買量增加(推測瀏覽數據沒有正常採集和有一波小促銷活動),這一點在構建特徵時需要特別考慮

用戶行為中的type=5的情況(加入購物車)僅在4.08之後出現,這個是一個難點,影響到後面特徵和數據集的構建


有交互行為用戶佔全部購買比

(該圖引用自 https://github.com/DuncanZhou/jdata2019)


「競賽」2019JDATA店鋪購買預測大賽冠軍方案


藍色表示每天的產生下單的購買數。B040?表示那天有行為的用戶的每天的下單樣本數,可以發現的是存在大量的用戶是缺少歷史行為的。召回率存在上限。


注:就我們看來,在本次比賽中缺少歷史交互的購買行為幾乎是無法預測到的(如果有更多場景下的數據其實也可以考慮嘗試協同過濾等基於相似度推薦的做法),我們的目的是儘可能地捕捉到到目標區間前發生交互行為的用戶的購買可能性,而這個用戶候選集的區間選擇要結合購買趨勢來分析,在A榜前期我們嘗試了購買區間前1,3,5,7天等時間段的候選區間,將1天變為3天線上排名上升不少,但是繼續增多反而下降,這其實就是關於precision和recall指標的一個權衡,增加候選集recall會升高但是precision會下降。當然區間覆蓋度也會影響到模型的泛化性能,有候選時間區間比較小的隊伍A榜在前10,B榜翻車了,所以一定要注意過擬合問題


「競賽」2019JDATA店鋪購買預測大賽冠軍方案


不同的類別在復購率上具有明顯的差異,這驗證了我們在上面對於業務場景的推測,即存在著即時購買(復購率低)和日用購買(復購率高)的行為。


用戶購買累計分佈圖

(同日購買同一商品超過2次按刷單用戶過濾後統計得到)


「競賽」2019JDATA店鋪購買預測大賽冠軍方案

大部分用戶購買次數在4次以內,基本符合普通消費習慣。我們還發現一些特點,例如對於一個月內每天購買不多,但是總購買次數很多的用戶可能是剁手黨或者炒信用戶,這種特徵在建模的時候可以考慮進來。


用戶平均商品復購的時間

「競賽」2019JDATA店鋪購買預測大賽冠軍方案


用戶平均復購時間為14天,這一點為候選區間的選擇提供了一定的參考,候選區間不能設置太小,不然很多用戶會覆蓋不到


在目標區間購買樣本在目標區間前的交互情況

「競賽」2019JDATA店鋪購買預測大賽冠軍方案


在目標區間點購買由兩部分組成一部分為復購,一部分為即時性購買並且即時性購買遠多於復購行為。

復購和及時性購買增長不一致。從re_shop該曲線在目標區間10多天時已經達到0.6可得知及時性購買以近期的交互為主。

user_id, cate 和 user_id, cate, shop_id 的增長情況非常一致,統計發現許多用戶在目標類目選擇了前面有交互的店鋪進行購買,但是仍然存在換店鋪購買的情況。


目標區間未交互的店鋪購買分析

「競賽」2019JDATA店鋪購買預測大賽冠軍方案


可以看到仍然有相當的品類,用戶在購買前是沒有過店鋪交互行為,通過這個現象加上上面客戶換店鋪購買的可能性,我們在F12指標上提出了top店鋪召回策略,正樣本數量得到明顯增加,並且該策略被證實是有效的。


異常數據分析

「競賽」2019JDATA店鋪購買預測大賽冠軍方案


用戶短時間內對一個產品重複下單,在type=2的數據中這種出現還比較多。我們對於這種情況復購率進行了統計,復購率在1.5%。考慮到這種情況的影響,一方面會影響到後續購買時間間隔和復購率的計算,另外如果時針對sku建模,那麼這種復購很低的sku會使模型偏向於即時購買,接下來我們統計了cate和shop的復購率,在10%左右,根據這個情況,我們決定取消針對sku_id進行建模,把重點放在cate和shop上面,去掉sku_id後,cate直接變成了強特,模型線上性能有所提升。





三、數據集劃分

「競賽」2019JDATA店鋪購買預測大賽冠軍方案


關於時序數據,一定要注意好數據穿越數據洩露的問題,比如在比賽前期我們有對3,4月份的數據採用sklearn進行交叉驗證,這使得訓練集和驗證集會同時包含3,4月份數據,線下效果不錯,線上效果下降,這個原因可能就是4月份的數據穿越到了訓練集導致過擬合問題,更加科學的做法是要訓練集和驗證集“分離”,比如訓練用3月,驗證用4月就不會出現上述問題。




四、特徵構建

「競賽」2019JDATA店鋪購買預測大賽冠軍方案


「競賽」2019JDATA店鋪購買預測大賽冠軍方案


這裡要說明的是,前期通過實驗提取出來比較強的特徵有用戶評論,商品品類,漲粉速度這些,後期沒有多餘時間做特徵篩選和交叉,應該也有比較大的提升空間。

五、解題方案

「競賽」2019JDATA店鋪購買預測大賽冠軍方案


使用未交互的店鋪進行召回這一策略受到評委老師的好評,因為相當於對目標區間未交互過的user,shop對提出了購買的推測,而且根據日常經驗,會存在著人們瀏覽了一些店鋪,然後過兩天選另外的優質店鋪購買的情況(對應於賽題場景就是用戶在目標區間前沒有互動過,但是在目標區間內購買了)


六、模型設計

「競賽」2019JDATA店鋪購買預測大賽冠軍方案


「競賽」2019JDATA店鋪購買預測大賽冠軍方案


「競賽」2019JDATA店鋪購買預測大賽冠軍方案


模型的融合就是圖中的,採用了stakcing的方案,不過最後的權重沒有足夠的時間去優化,應該還有提升空間。


七、比賽總結



1. 一定要構建合理的數據劃分方式(考慮好分佈差異,數據穿越,特徵洩露等問題),模型穩定性很重要(CV調優,集成基本是必備),能做到線上線下的得分趨勢一致(比賽中做的比較好的隊伍甚至可以在提交前預測線上得分大概在多少)是一個很大的優勢。


2. EDA很重要,不要憑主觀臆測,比如比賽時有想過利用目標區間前更多的天數(不包括春節)來擴充訓練集,但是效果不太好,經過分析後發現,和目標區間越接近的數據分佈和目標區間越一致,所以並不是數據越多泛化性能越好,一定要保證分佈的一致性。


3. 分析好優化目標,對於預測變量組合(user,cate,shop),可以考慮拆分的做法(即先對user,cate召回,再預測user,cate,shop)有以下優點:a.從指標層面來說便於指標的優化,在實際比賽中,經常出現F11和F12此升彼降的情況,這其實可以從precision,recall的角度來解釋,我們選擇將F11優化到最高然後再對F12進行優化,這種做法可能不是最優的,因為這種做法有可能會限制F12的上限,但是在有限的時間和技術限制下,這是一種比穩妥的做法。b.從訓練層面,這種拆解的形式也有利於實驗的優化,比如user,cate的召回過程可以大大降低樣本不平衡比率,有利於模型學習)


4. 善用指標曲線評估樣本,例如利用precision,recall曲線來選擇比較有把握的樣本, 在嘗試建立短期購車模型時,我們只選取方框中的結果加入到現有預測,不過受時間限制,沒有調出很好的效果


「競賽」2019JDATA店鋪購買預測大賽冠軍方案

5. 小tricks


對lgb幾個重要參數做一下擾動,訓練多個模型然後取平均(比如學習率和迭代次數建立一個函數使得學習率大了迭代步數減少,然後擾動學習率)

因為比賽提交的結果是預測一週購買情況,我們統計了現有數據集用戶的周平均購買數量,並且用來作為TOP-N對測試集結果進行過濾,在A榜取得了很好的效果,但是這種策略僅僅適合衝一下分,模型泛化性能得不到保證。


6. 關於不同的場景需要制定不同的策略


比如在商品購買的場景,商品和類別很多,瀏覽記錄很多,正負樣本比例差距太大,所以需要採用召回的策略。而在別的場景,比如遊戲道具購買的場景,採用的策略可能會有所不同,需要具體問題具體分析。


7. 比賽中有一些想法但是沒有時間做,在覆盤時看到別的隊友有這麼做的而且有一定效果的,例如單獨利用購物車信息建立模型(舉個例子,我們現在手上只有8天的購物車記錄,那麼可以利用這8天數據建立一個有加購行為但是在當天沒有購買的用戶是否會在接下來x天內購買sku_id的短期模型,也可以按照賽季1的思路建立迴歸模型預測加購後的購買時間和現有結果融合),此外也有利用LSTM對時序行為提取特徵的思路覺得很有想法(見https://github.com/DuncanZhou/jdata2019),關於模型融合的權值也有優化的空間


8. 關注比賽群的信息和官方回覆會有不少收穫,比如老師在群裡面會給出一些tips,例如對cate分開建模來防止類別干擾(比如有的cate是高奢,有的是日用,這樣會使模型學不到正確的參數)


最後是工具推薦:

特徵篩選:

https://github.com/duxuhao/Feature-Selection

調參參考:https://blog.csdn.net/gdh756462786/article/details/79268685


The End


分享到:


相關文章: