2020MathorCup數學建模比賽A題D題思路

賽題一覽

A題分析

首先我只做數據挖掘的題,因此有 A 題和 D 題可供我選。什麼?A 題是研究生組的,沒關係,我照樣淦。

首先 A 題是無人承運的定價分析的。問題是根據附件1(附件1是個 xlsx表格,裏面有詳細的數據,光特徵就68個),確線路定價的影響因素,在根據這些影響因素,評價定價的效果。此是一二問。

第一問看起來不難,但是複雜就複雜在,定價是什麼鬼(我不是白癡,請往下看)?我看到附件1後面還有一個叫“線路成本”的東西。然後我用定價減去成本,得到的幾乎是負數。好的,如果定價是無人承運商給予司機的報酬,那麼線路成本又是什麼呢?難道是司機的花費嗎?不可能,因爲只有傻子纔會接虧本的單。有人可能會反駁,司機事前不知道成本啊。但即便如此,也不會有司機經常去當冤大頭把。那麼線路成本是什麼呢?是無人承運商所要支付的費用嗎?如果是,那麼定價首先是一個成本吧?因爲要支付給司機的報酬嘛,所以肯定是成本。這麼算下來,爲什麼成本還會比定價低了呢?按理說,應該高出很多或是一點點纔對呀?那麼線路成本究竟是什麼呢???
在這裏插入圖片描述
拋開這個不談,因爲如果要分析線路的定價,成本肯定是不用考慮的。但是時間呢?(@ο@) 哇~看到這麼多時間,我真的崩潰了,何況我 datetime 模塊用得不熟。

不過當初我想到了一個好辦法,就是直接從附件2的特徵找相關的不就行了嗎?因爲附件2是要我們預測的嘛,這樣可以省去一大筆功夫。如果要分析線性性,對於無序類別變量,可以用單因素方差分析,或卡方檢驗來檢驗有無相關性。如果是連續特徵,我考慮用遞歸特徵刪除解決。

但第二問就有點難了,評價定價,嗚呼~~ 由於題目要保證成本交易時間最低,因此我覺得可以從這兩個方面下功夫。給出一個定價,首先他要低於成本,這樣就可賺更多的錢(這裏我懷疑成本和定價都是“成本”,不過他們分開算的)。而且,交易時間也要儘量少才行。

因此,我考慮把定價低於成本很多,交易時間很短的數據提取出來,構成一個新的數據集。再在第一問的基礎上,訓練一個用來預測新數據集定價的模型。由於訓練集的定價低、時間短,因此該模型預測出來的定價大概率是最優定價。於是,把這個機器學習模型用在其他數據中,然後根據預測定價和實際定價,來定義它的評分就行了。

第三問根據附件2的表格,給出三個調價。首先,我考慮上述的定價低、時間短模型的預測輸出作爲第一定價。之後,在用附件1訓練一個定價高,時間短模型,作爲第二定價;再用整個附件1訓練模型,作爲第三定價。至於成本,有個耐人尋味的地方,就是題目稱成本爲成本定價。這讓我有些擔憂,居然成本也是一個定價??????不管了,直接考慮整個附件1與成本訓練一個模型,預測、得了!! A題搞定。

D題分析

同樣是數據挖掘,D題實際上更有難度。爲什麼?因爲年輕人往往比老年人更厲害,此是其一,賽題組怕研究生做不出來,進而懷疑人生也是有的。其二,D題的數據量龐大,大概有70 W條,一個計算機的內存纔多大。其三,數據是時序的,小類套着 skc,skc旗下全都是時序數據,城市套路深,你說呢?其四,我感覺數據庫是從某家企業的數據庫收集過來的,爲什麼這麼說呢?主鍵的痕跡很明顯,這些表格明顯是爲數據庫設計的。因此,這道題真的很貼近實際!!!

綜上,D題實際上非常、非常難。比起 A 題這種靠概念的小兒科題目,D題更具有挑戰性,而且直擊機器學習的難題——序列預測!!

D題做法

第一問是怎麼做的?

第一問:找出節假日內,影響目標 skc 銷量的諸多因素。包括:庫存、銷售方式、折扣等。

對於庫存,只要將 附件3 追加進 附件1 中就可以了,這是數據庫的連接操作。一個方法是用 mysql,先保存到數據庫,再用查詢語句。或者是用萬能的 Python,其 Pandas 模塊的 join merge concat 函數,都是數據表格進行聯接操作的絕佳選擇。

對於銷售方式,我這裏考慮:銷售方式與所屬小類掛鉤。不同所屬小類的銷售方式不同,屬於同一小類的銷售方式一樣。於是,爲了判斷所屬小類與銷量是否有關,可以採用單因素方差分析的方法。

對於折扣,可以考慮將 附件2 使用 數據庫操作,追加到附件1中,得到標價。再用銷售流水裏的銷售額,除以銷售量,得到平均售價。最後,根據售價和標價,求出折扣。從而完成數據的整理。部分數據如下所示:
在這裏插入圖片描述

之後,可以得出 skc 的銷售特徵,包括:庫存、所屬小類、標價、平均售價、折扣。當然,裏面包含缺失項,這是很正常的,不可能每個表格都有相應的 庫存、標價、所屬小類數據。因此,對於缺失項,我考慮進行按行刪除

前面已經用單因素方差分析,得出所屬小類對銷量有影響。這裏,用遞歸特徵刪除的方法,使用線性迴歸模型,結合庫存、標價、售價、折扣來預測銷量。之後,每次刪除一個特徵,如果模型擬合效果降低,則回滾刪除操作。直到每個特徵都被遍歷過爲止。最後得出:售價可以刪除。除此之外,還得到了一個關於銷量(因變量)和庫存、標價、折扣(自變量)的線性迴歸模型。(可以說是完成了如何影響的研究吧!)

第二問、第三問是怎麼做的?

第二問、第三問是要求目標小類在 10月 01 日 三個月後(13周,其實就是到 12月 31日啦),預測銷量的 MAPE。筆者根據 MAPE 公式,最後推導出第二問、第三問要求的,其實是一個問題:根據 10月 01日之前的數據,預測 之後的周銷量。這不,又是一個機器學習問題

但是,這個機器學習可比 A 題難了好幾倍。A題的難點在於特徵的處理,至少它的數據是靜態的。某條數據總不可能與隔壁老王,不,隔壁的數據有關係吧。但是 D 題就不同啦,你細品。根據 10月01日之前的數據,預測之後的數據。這不是序列學習還會是什麼?但是,除了這點以外,他的難點在於,每個 skc 都是一個子序列呀!而且數據實在太多了、太散了呀。如果用 Python 來整理數據,可以想象,要花費多少精力和精神!!!!

根據問題一,預測銷量可以用小類、折扣、標價、庫存,另外,還外帶了一個當天是否屬於節日(這個也可以分析出來,是對銷量有影響的。)怎麼弄呢?對於小類,用 One-hot 編碼。 是否屬於節日是一個二值變量,可以不用預處理。其餘的數值連續型變量,可以用 Zscore 標準化。

之後,就是訓練模型咯~

首先,一開始由於缺失數據太多了,我刪了很多,導致時序性被破壞得不成樣子。因此,我就把數據以周爲單位整理了,對於節日,只要該周內包含一天的節假日,就設爲1。經過如此,處理過後,數據還是有 1 W。

一開始,我還天真地想着是否可以忽略這種時序性(熬夜熬傻了吧)。然後就用便了幾乎所有的機器學習模型呀,注意是幾乎所有的機器學習(不包括神經網絡)。最終得出決策樹效果最好,但MAPE 大於 1,呵呵。

那麼神經網絡呢?用了一個非常複雜的,神經節點數大約 2000 個的 BP神經網絡,跑呀跑呀。結果出來,MAPE 還是 1點多,比決策樹好那麼一點點,一點點!

最後,我開竅了,用了時序神經網絡 LSTM,結果呢?用了節點數爲30 的、只包含一層隱藏層的 LSTM,得出來 MAPE 爲 0.0013,幾乎沒有誤差呀。天呀!!!!!!!!

最終小結

筆者認爲,D 題作爲研究生的題目,其實會更好。雖然世界上的“菸酒生”非常多,但大佬型的研究生,是我們本科生難以比擬的。不讓他們寫 D 題,實在有點可惜了,是真的可惜了。 我感覺 A 題作爲一道數據挖掘的題,是不合格的。首先他集合了太多專業知識,不是這個領域,或對這個行業沒有了解的人,是做不來的。就比如我吧,一開始看到這題以爲多難,其實細細分析,出了裏面模棱兩可的什麼成本、定價、成本定價這些搞不懂外,其餘的思路倒是一望而知,洞燭無疑。

雖然我很想寫一下 A 題,讓改卷老師吃驚一下,但是 D 題的難度吸引了我。 人總是要挑戰的。D題看似簡單,其實很貼近實際。如同上面分析的,它的數據好像是直接從企業的數據庫挖出來的。就比如只會 Matlab 和 SPSS 的小白,這種題絕對是做不來的。另外,D題的表格非常多,這很考驗大家的數據的組織能力。如果沒有學過數據庫(沒學過數據庫就別選數據挖掘啦),恐怕要花費很多功夫,才能把數據拼接成一個表格。另外,D題不是靜態數據,這一點與傻瓜 A 題不同。他直擊當前的機器學習比較新的領域——序列預測(2015年開始熱門起來)。對於 A 題,雖然沒做過,但是我相信,如果我要做,除了特徵預處理難住我以外,那種程度的數據挖掘,我絕對沒有問題的(無外乎機器學習,不行就 BP 神經網絡,再不行?CNN,再不行?特徵預處理再來一下)。

因此,我感覺 A 題像考 概念,考知識儲備,考無中生有(就比如第二問叫你評價,評價指標得自己定吧)。D題考技術、操作,考的是技術儲備,耐心和毅力(編程中會有很多困難,而且神經網絡也很難訓練,並且要注意底層實現,不然內存說不定就爆了,我本人就爆了大約3次左右,中間一次藍屏,傷啊!)因此,希望 Mathorcup 賽題方,好好研究賽題。最好是實現做一下,不然就會出現本屆的笑話了。賽方的各位,不要把專科、本科看得比研究生還厲害呀!!! A 題這麼簡單,居然,╮(╯▽╰)╭。

最後,希望大家像我一樣,追逐困難。不要輕易向 容易妥協。也不要相信權威,自己分析一下,纔會知道什麼是難、什麼是不難。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章