天天看點

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

作者:樓觀白樓

寫在前面

在本次比賽中,我們團隊惡魔媽媽買面膜(經主辦方建議,決賽時隊名修改為秋名山車神)在初賽A榜,初賽B榜,複賽A榜,複賽B榜分别取得2,4,1,3的名次,并在最終決賽中逆襲拿到冠軍(1/3000)。

本來複賽B榜是rank 4。由于有一個隊伍由于使用小号被取消資格,一個隊伍放棄複現,決賽逆襲一個隊伍,最終拿到了冠軍。說實話,運氣非常好。

曆時四個月,從多次想要放棄(中間有一個月放棄了沒有做)到最終奪冠,真的十分感謝隊友!

團隊介紹

秋名山車神

梁晨 重慶郵電大學 研一

陳暄群 華南理工大學 研二

梁汐然 北京大學 大四

徐巍 重慶郵電大學 研二

王猛旗 重慶郵電大學 研一

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

如你們所見,我們來自三個不同的學校,通過本次比賽聚集在一起,在此也十分感謝DF平台與主辦方CCF。

我們團隊中大多數人都是第一次參加資料科學競賽。

感謝開源

本次比賽要特别感謝的人是魚佬,他的架構太強了。換成是我我不一定會在比賽中開源這麼強的思路,從某種層面上來說這可能會坑到自己。是以敢于開源的人都應該值得稱贊,開源與分享可以讓整個環境進步。

另外還要感謝月月鳥,阿道,煥明(校友,就是54的那個規則開源,實際上我發現很多隊伍的規則都是基于他做的),他們的開源也讓我們學習到了很多。

代碼

我們本次的方案一共約500行代碼,主要的工作在于特征工程與規則構造,思路,代碼都很簡單,運作隻需3min,請放心使用。

​​https://github.com/cxq80803716/2019-CCF-BDCI-Car_sales​​

接下來我會詳細介紹一下本次的賽題與解決方案。

實測(8g記憶體,CPU:i5-8500,耗時132秒):

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

賽題介紹

CCF大資料與計算智能大賽(CCF Big Data & Computing Intelligence Contest,簡稱CCF BDCI)是由中國計算機學會大資料專家委員會于2013年創辦的國際化智能算法、創新應用和大資料系統大型挑戰賽事,是全球大資料與人工智能領域最具影響力的活動之一。

深瞳是一家大資料與行業智能應用解決方案營運商,為各行業客戶提供資料分析與政策咨詢服務,幫助行業客戶進行資料資産化,為客戶提供資料處理、模組化分析服務。汽車行業是深瞳所重點服務的核心行業之一,長期服務于國内外知名汽車品牌客戶。

近幾年來,國内汽車市場由增量市場逐漸進入存量市場階段,2018年整體市場銷量首次同比下降。在市場整體趨勢逐漸改變的環境下,消費者購車決策的過程也正在從線下向線上轉移,我們希望能在銷量資料自身趨勢規律的基礎上,找到消費者在網際網路上的行為資料與銷量之間的相關性,為汽車行業帶來更準确有效的銷量趨勢預測。

​​https://www.datafountain.cn/competitions/352​​

備注:(原始資料下載下傳位址,github已經有資料,可以不用下載下傳)

連結:https://pan.baidu.com/s/1Zs5d9CWJuUoX7AmIKAoYmg

提取碼:frqb

賽題需要參賽隊伍根據給出的60款車型在22個細分市場(省份)的銷量連續24個月(從2016年1月至2018年12月)的銷量資料,建立銷量預測模型;基于該模型預測同一款車型和相同細分市場在接下來一個季度連續4個月份的銷量;除銷量資料外,還提供同時期的使用者網際網路行為統計資料,包括:各細分市場每個車型名稱的網際網路搜尋量資料;主流汽車垂直媒體使用者活躍資料等。參賽隊伍可同時使用這些非銷量資料用于模組化。

簡單來說,本次賽題給出2016.1~2017.12的省份,車型,車身,銷量,搜尋量,評論量,評價量等,要求預測2018.1~2018.4的銷量。

評價名額是歸一化均方根誤差的均值

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

資料分析

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

通過初步分析資料可以發現省份-車型所組成的類别特别多,并且對于同一車型,波動也挺大的,銷量的範圍較大等。

順便說一下,我們經過多次嘗試發現評論量與評價量幾乎起不到作用,是以這兩個特征我們并沒有使用,如果你有辦法處理這兩個特征,歡迎評論讨論。

資料預處理

為了使資料分布更加符合高斯分布,對資料做了log1p的預處理。

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

算法整體方案

我們在初賽的時候嘗試了xgb,lgb,cat,prophet,rule,lstm,cnn,并且初賽的最終結果是由lgb,prophet,rule與lstm融合而來。但是後來我們發現就算隻用lgb和rule也能得到差不多的分數,時序模型與深度學習模型在這道小資料時序問題上并不适用,又考慮到工業環境中模型越少,越簡單越好,是以複賽時,我們隻使用了差異性足夠大的lgb與rule兩個模型。

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

抑制誤差傳遞

直接使用魚佬的架構能帶來相當不錯的效果,但是可以發現,越往後的月份誤差的累計會越來越嚴重,是以在模型中,我們隻拼接了1月份預測出來的值。

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

特征分析

在構造特征之前,對特征一些分析。

畫出省份銷量的熱力圖可以發現銷量與省份的發達程度,臨海程度是成一定正相關的,這與我們的直覺相符。是以各省份銷量的差異明顯,模組化時必須對省份進行差別。

對于同一個月份,2016年與2017年的銷量類似,即銷量有周期性變化的特性。而且對于宏觀變化而言,2017年的銷量較2016年銷量呈現下降趨勢。

春節月的銷量較低,春節後逐漸上升,年末達到最高。

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

特征工程

這一塊是本次工作的重頭戲,也是我們花費了最多時間的地方,最終,我們的模型特征由以下幾部分組成。

考慮到春節等節假日,我們構造了與節假日相關的一些特征。

考慮到每個月的天數,工作日不同,我們構造了相關的特征。

由于是個時序問題,是以曆史銷量與銷量的變化趨勢是我們應該考慮的重點。針對此,我們在多個不同粒度下構造了曆史平移特征,差分特征,同比/環比特征與趨勢特征。

不過經過我們的嘗試,同比的效果不怎麼好。

更加詳細的内容請看代碼。

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

特征選擇

我們所構造的特征實際上不止這些,不過由于資訊重疊與毒特等原因,我們使用了一些方法對特征進行篩選。

我們使用了樹模型的特征重要性排序,均值判斷與SHAP進行特征篩選。

特征重要性排序:根據樹模型輸出的特征重要性進行篩選,去掉重要性低的特征。

均值判斷:由于本道賽題中,1234月具有相對固定的均值比例與均值大小,是以可以通過添加/删除特征後1234月的平均均值來大概判斷特征的好壞。

SHAP:利用了組合博弈論的知識,防止因為資訊重疊而導緻的特征重要度不公平的情況。

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

初賽LGB的建構流程

初賽時lgb做的一些操作與對應的分數如下

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

統計規則

規則部分的架構是使用曆史同期銷量,曆史最近銷量與指數平滑進行權重得到一個初步預測銷量,然後用上下半年的銷量變化趨勢與平滑構造年度銷量變化趨勢,最後兩者相乘即可得到規則的預測結果。

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案
開源!2019CCF BDCI 乘用車銷量預測 冠軍方案
開源!2019CCF BDCI 乘用車銷量預測 冠軍方案
開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

由此可見,規則帶有相當多的超參數。據我了解不少團隊複賽時規則血崩,這也是時序題裡面規則的泛性問題。我們初賽時規則可以達到0.633,是一個絕對的主力,複賽送出次數太少,最終規則也隻有0.598,隻能以lgb為主,規則為輔。

模型融合

因為隻有兩個模型,是以模型融合基本上不用考慮太多,直接進行簡單的算數/幾何權重即可,由于幾何權重可以使預測值偏小,而2018年的銷量理應是較之前低的,是以我們使用了幾何權重進行融合。

另外1234月分開進行融合,可以帶來微小的提升。

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案

總結

這裡特别提一下模型的數量與運作時間的優點,據我們決賽觀察,大多數隊伍都有超過2個的模型,而且有的隊伍需要超過一個小時的運作時間。從工業角度來講,我們的方案應該是更加适用的。

開源!2019CCF BDCI 乘用車銷量預測 冠軍方案