1. 程式人生 > >天池大賽O2O新手賽解題思路分享

天池大賽O2O新手賽解題思路分享

(作者:陳玓玏)

這個比賽我參加的時間稍微有點久遠了,有些思路可能都不是特別清楚了,可以自己再好好細化、補充一下。

賽題中一共有四個檔案,分別是線下測試集資料,線下訓練集資料,線上訓練集資料,以及最後需要提交的結果的格式。我其實在比賽時候只用了線下訓練集的資料,已經是夠用的了。

那麼建模肯定需要確定幾個大的方向點:1、label怎麼定義?2、時間視窗怎麼劃分?3、變數怎麼延伸?4、用什麼演算法?5、過擬合了怎麼辦?

1、label怎麼定義?

因為題目已經要求過了,需要預測的是客戶在15天內的優惠券使用率,所以我們把領取優惠券以後15內使用定為1,即我們要尋找的正樣本,15內不使用的定為0,即負樣本。

2、時間視窗怎麼劃分?

原始資料集中包括的資料是2016年1月1日到2016年6月30日的樣本,那麼在這幾個月內,x值和y值我們都是已知的,然後要通過這之前的行為預測出七月份的y,但是沒有七月的資料,所以我們需要給七月留出一個觀察視窗,也就是造x變數的視窗。最後劃分視窗的結果如下:
——————————————————————————————————————————————————
訓練樣本
x值產生區間:2016.01~2016.03,y值產生區間:2016.04
預測樣本
x值產生區間:2016.04~2016.06,y值產生區間:無,是我們最終需要預測的結果
———————————————————————————————————————————————————
正好就是用三個月來預測一個月,因為這裡也不去考慮模型穩定性的問題,因為只預測一個月嘛,不是長期使用這個模型,所以我們也就不會去考慮這些,也就沒有通過客戶表現的穩定性來確定時間視窗,而是選擇了一個可以充分利用樣本資料,又能夠儘可能長地拉昇觀察視窗的劃分方法。

3、變數怎麼延伸?

初始資料其實就只有幾列嘛,如下圖所示:
這裡寫圖片描述
但是這幾個變數可用度實在太低,比如使用者id和商戶id這種變數根本就無效嘛,所以必須要延伸變數,分模組來細化變數,其實就是在細化使用者的行為,初期延伸變數的時候肯定是分析得越細越好的。

那麼我的思路是比較傻的方法,就是先單變數延伸,再組合延伸。
1、先延伸使用者相關的變數,比如通過使用者的消費頻率、消費最大距離、最小距離、平均距離等來刻畫使用者的消費習慣;
2、再延伸商戶變數,比如商家釋出優惠券的頻率、商家釋出優惠券的最大、最小、平均折扣率等等,而且要區分是滿減還是直接打折;
3、再延伸優惠券的變數,比如優惠券的折扣率;
4、接著延伸交叉變數,比如使用者在每個商家的消費頻率、使用優惠券的消費頻率、使用優惠券的比例等等。

感覺延伸變數反正是一個比較噁心的過程,但是也比較有意思,噁心是因為它既感性又理性,可能還要憑一些經驗,有意思是因為它其實就是一個刻畫行為的過程,值得玩味。

4、用什麼演算法?

這就是一個二分類問題,可以用的演算法多了去了,邏輯迴歸、決策樹、SVM、XGBoost、隨機森林,blahblahblah……最後用的是XGBoost,因為它很省心啊,又可以自己靈活抽樣,又可以很方便地調參來防止過擬合,而且是整合學習,預測精度高,還能幫你選特徵。

5、怎麼防止過擬合?

很多方法了,調參啦,控制樹深、樹的分裂條件,葉子節點權重等,還可以自己選變數,把那些不重要的變數都篩掉。最後我的結果AUC是在0.799的樣子,因為我電腦比較挫,跑不了所有的資料,只能跑一部分,不然肯定能到0.8以上,然後當季排名是15,現在大家更牛了,第一名已經到0.81+了。