天天看點

寫于京東賽(JData)----如期而至,使用者購買日期預測----之後

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/sinat_32502811/article/details/80878146

京東賽告一段落。作為一個菜菜鳥,雖然無緣前十,但是也算是有一點小感悟和一些對資料挖掘的認知。畢竟這是第一次接觸比較接近實際工程中的資料,而且是時間序列相關的資料。

一. 資料集的劃分

在做京東賽的時候,第一眼看到資料集就是懵的,感覺和房屋預測的咋一點都不一樣·········訓練集也沒有,測試集也沒有,而且還有好多個表,咋往一塊拼呢·········後來看了wepon在天池優惠券核銷預測的代碼後,才漸漸有了一點思路,在這裡感謝wepon大神,代碼在

這裡

對于我過去接觸過的機器學習問題,訓練集就是原始資料,測試集就是新資料。我在原始資料和新資料中,挖掘出相同維的特征,差別就是原始資料有标簽,而新資料沒有标簽。用有标簽的資料學習出一個模型,再應用到具有相同特征維的沒有标簽的資料上,預測得到結果。

但對于時序資料來說,就不一樣了。

時間序列預測的核心思想是:用過去時間裡的資料預測未來時間裡的Target。

也就是說,在建構特征的時候,我需要所有的曆史資料建構預測特征。有時候,也會有待預測時間段的一些特征,比如在天池的O2O賽中(不過這也是一個leakage,在實際工程中,是不會得到這個資料的)。将曆史資料的預測特征,和新資料的一些預測特征結合起來,得到完整的所需要的特征,然後放到模型裡面,得到預測結果。

還有一個比較重要的部分就是,負樣本的建立。在這裡的資料,所有買過的都算是正樣本,但是還需要負樣本。我這裡就是自己造了個負樣本。按照1:1的比例,對所有資料,随機進行1-2天的前後移動,然後把這些資料裡的錯誤資料删去(錯誤資料:在這個時間裡有過購買行為的為錯誤的資料)。由此得到負樣本。

有了特征,那我們的target怎麼找?

這裡我們就要從曆史資料中建構target.

一個比較常用的方法就是滑窗。

二. 滑窗與模型建構

通過時間滑窗,人為的構造target,讓模型進行學習。也就是對于曆史資料,再人為設定曆史視窗和未來視窗。怎麼做呢?具體示意圖如下:

(圖檔來源為

,這篇講的也挺好的,對我了解時間序列起了很大幫助)

假如有1-6月的曆史資料,要預測7月份的銷售量

  • 1,2,3月份提取預測特征A,4月份提取預測特征B,并提取預測target,也就是銷售量
  • 2,3,4月份提取預測特征A,5月份提取預測特征B,并提取預測的target。

以此類推,以一個月為周期向前滾動。

最後呢,我把所有提取到的特征,也就是每個視窗的預測特征A+預測特征B作為訓練集,所有的預測target作為訓練集的target。用這些資料訓練模型。

(他們之間的連接配接是按列連接配接,并非按行連接配接。也就是說,不管是哪段時間視窗,我提取到的特征次元都是一樣的,不同的時間視窗,相當于隻是增加了我的訓練執行個體(instance))

對于新資料,我的輸入為(目前例子中)4,5,6月份的預測特征A加上7月份的預測特征B,整體構成特征集合。輸入到模型中,得到預測結果。

按我的了解,時間滑窗相當于增加了樣本量,并且通過對不同時間段的采樣,可以得到更豐富的特征。

三. 特征工程的建構

感覺在資料比賽中,最最關鍵的還是特征。有時候模型可以稍微弱一點,甚至是單模型,也可以優于xgboost這種提升模型。比如今年的IJCAI中的阿裡媽媽算法大賽,奪冠的解決方案就是單模型的·····膜拜一下大神。

在這一塊兒還差的很遠。而且,京東賽分數不高的原因也是因為特征選的太弱,不夠多。但是有幾個思路吧:

1. 皮爾森相關系數的應用,可以看看特征和target之間的相關程度。太弱的或者可以直接抛棄。

2. 選擇一些強相關性的特征,通過一些個運算啊什麼的構造一些新的特征。

3. 結合業務場景,構造一些業務中常用的一些個名額。

4. 對于一些特殊日期的關注。比如電商銷售額預測,雙十一雙十二的資料肯定是異于平常的,此時可以對他進行單獨的預測,或者和平時的進行權重,等(這可能是資料預處理階段的工作)

5. 建構了一系列的特征,其實并非所有的都那麼重要,可以對特征進行選擇,去掉備援特征。比如說,可以用xgboost方法或者GBDT這種有feature_importances方法(或者score這種)的,對訓練完的模型的特征根據評分的不同進行排序,以此選擇一些較好的特征。

大緻就是這些了。算法之路,漫漫其修遠兮,吾将上下而求索(拽一下·····)。

繼續閱讀