疫情背景下的中長(zhǎng)期月度預(yù)測(cè)方案
?作者 | 曉雯,攜程高級(jí)算法工程師,關(guān)注時(shí)間序列預(yù)測(cè);Bluewind,關(guān)注時(shí)間序列預(yù)測(cè)。
一、摘要
本文將分享一個(gè)基于疫情情況下的中長(zhǎng)期月度間夜數(shù)據(jù)預(yù)測(cè)方法。傳統(tǒng)的時(shí)間序列模型通過(guò)學(xué)習(xí)歷史數(shù)據(jù)中趨勢(shì)性和季節(jié)性的特征,能對(duì)月度數(shù)據(jù)做出相對(duì)有效的預(yù)測(cè)。而自從2020年以來(lái),不時(shí)發(fā)生的疫情影響了歷史數(shù)據(jù)相對(duì)規(guī)律的趨勢(shì)性和季節(jié)性特征,也給基于傳統(tǒng)時(shí)間序列模型的預(yù)測(cè)帶來(lái)了難度。
本文考慮到上述情況,針對(duì)疫情,給出了一個(gè)改進(jìn)預(yù)測(cè)方案,來(lái)更好地對(duì)數(shù)據(jù)進(jìn)行預(yù)測(cè),使其能更好地運(yùn)用于預(yù)算、規(guī)劃、決策等管理目的。
二、背景
中長(zhǎng)期月度間夜預(yù)測(cè),主要是預(yù)測(cè)未來(lái)公司1-6月內(nèi)的間夜,可以幫助公司進(jìn)行預(yù)算、規(guī)劃、決策等管理行為。
然而,在目前的疫情背景之下,中長(zhǎng)期預(yù)測(cè)面臨著新的問(wèn)題:一方面預(yù)測(cè)變得更加困難,另一方面預(yù)測(cè)也變得更加重要。由于疫情的存在,增加了很多未來(lái)的不確定性,導(dǎo)致模型的預(yù)測(cè)困難進(jìn)一步增加;同時(shí)也是因?yàn)橐咔椴淮_定性的存在,更需要預(yù)測(cè)相關(guān)的手段來(lái)幫助獲得更多的未來(lái)信息,以更好的對(duì)未來(lái)進(jìn)行預(yù)測(cè)、規(guī)劃和決策。
因此,在疫情背景下的中長(zhǎng)期預(yù)測(cè)變成了一個(gè)困難但是重要的問(wèn)題。
三、面臨問(wèn)題
概括而言,在疫情背景下的中長(zhǎng)期預(yù)測(cè)面臨如下問(wèn)題:
3.1 被預(yù)測(cè)時(shí)間長(zhǎng),導(dǎo)致預(yù)測(cè)難度增加?
由于中長(zhǎng)期預(yù)測(cè)的時(shí)間最近是未來(lái)一個(gè)月,最遠(yuǎn)是未來(lái)半年。而在疫情背景之下,未來(lái)是否會(huì)發(fā)生疫情,是會(huì)對(duì)實(shí)際的間夜產(chǎn)生影響的。但是站在當(dāng)前節(jié)點(diǎn),是無(wú)法預(yù)測(cè)到未來(lái)一個(gè)月,甚至半年后的疫情情況的,這就會(huì)給預(yù)測(cè)增加許多的難度。
3.2 數(shù)據(jù)量少,導(dǎo)致模型可學(xué)習(xí)模式少
對(duì)月度數(shù)據(jù)而言,一年只有12個(gè)數(shù)據(jù)。而在疫情情況下,不同的月份還面臨這不同的疫情影響程度。這就會(huì)給模型的學(xué)習(xí)帶來(lái)難度。
3.3 疫情影響的量化比較困難
疫情對(duì)間夜的影響是一個(gè)多方面復(fù)合的影響,和確診人數(shù)、當(dāng)?shù)卣摺⒁约爱?dāng)時(shí)的季節(jié)都有相關(guān)關(guān)系,無(wú)法簡(jiǎn)單使用確診人數(shù)來(lái)進(jìn)行評(píng)估。比如,疫情之前每年的八月都是間夜高峰,但是疫情之后,隨著部分地區(qū)中小學(xué)要求學(xué)生開(kāi)學(xué)前14天不能離開(kāi)當(dāng)?shù)?,?dǎo)致疫情之后的八月下半旬的間夜增長(zhǎng)就會(huì)比往年放緩,這部分的影響是和政策密切相關(guān)的,而不會(huì)直接體現(xiàn)在確診人數(shù)上。另外,疫情對(duì)間夜的影響還存在著滯后性的問(wèn)題,一個(gè)地區(qū)可能在最近只有一天出現(xiàn)確診,但是這一天的確診可能會(huì)持續(xù)影響其未來(lái)的14天甚至更遠(yuǎn)。
四、問(wèn)題定義
4.1 口徑定義
我們定義預(yù)測(cè)的目標(biāo)值為:全國(guó)酒店的月度間夜,并且不包含中途取消的訂單。
4.2 問(wèn)題拆解
我們認(rèn)為對(duì)于未來(lái)6個(gè)月的月度間夜預(yù)測(cè),可以拆解為兩個(gè)問(wèn)題。
問(wèn)題一是中期預(yù)測(cè),即只預(yù)測(cè)未來(lái)一個(gè)月的月度間夜,即當(dāng)前為9月份時(shí),預(yù)測(cè)10月份;當(dāng)前為10月份時(shí),預(yù)測(cè)11月份,以此類(lèi)推。
問(wèn)題二是長(zhǎng)期預(yù)測(cè),即預(yù)測(cè)未來(lái)兩個(gè)月到6個(gè)月的月度間夜,即當(dāng)前為9月份時(shí),預(yù)測(cè)未來(lái)11月份、12月份、來(lái)年1月份、來(lái)年2月份、來(lái)年3月份的月度間夜。
之所以做這種拆解的原因是未來(lái)一個(gè)月的間夜相對(duì)來(lái)說(shuō)和目前的間夜有更強(qiáng)的關(guān)聯(lián)性,將它單獨(dú)做預(yù)測(cè)可以提升預(yù)測(cè)精度。
五、中期預(yù)測(cè)方案
5.1 問(wèn)題處理
在中期預(yù)測(cè)方案之中,主要面對(duì)的問(wèn)題是數(shù)據(jù)量少導(dǎo)致模型可學(xué)習(xí)模式少和疫情影響的量化比較困難。針對(duì)這兩個(gè)問(wèn)題,我們的處理方案如下:
首先,將問(wèn)題修正為預(yù)測(cè)未來(lái)30天內(nèi)平均間夜,這樣就可以通過(guò)滑動(dòng)窗口來(lái)構(gòu)造數(shù)據(jù),從而增加數(shù)據(jù)的數(shù)量。即原來(lái)每個(gè)月只能有一個(gè)樣本,現(xiàn)在每個(gè)月的每一天到未來(lái)30天都是一個(gè)樣本,可以提升整體的數(shù)據(jù)數(shù)量。
這里可能存在的問(wèn)題是每個(gè)月的天數(shù)有些是28天,有些是31天,有些是30天。所以,我們對(duì)可能因?yàn)樘鞌?shù)產(chǎn)生的數(shù)據(jù)偏差做了計(jì)算,結(jié)果如下表,可以看到偏差都在千分之三以下,不是很大,所以我們認(rèn)為這種處理對(duì)預(yù)測(cè)的影響較小。
月份 | 當(dāng)月平均值與30天平均值的mape |
22-7月 | 0.20% |
22-8月 | 0.21% |
22-10月 | 0.03% |
22-12月 | 0.27% |
其次,使用搜索引擎提供的疫情指數(shù)數(shù)據(jù)來(lái)作為疫情影響的衡量依據(jù)。參考下圖的確診人數(shù)和搜索指數(shù)的關(guān)聯(lián)關(guān)系圖可見(jiàn),在疫情開(kāi)始初期,指數(shù)數(shù)據(jù)會(huì)有一個(gè)比較集中的反饋,在疫情確診人數(shù)回落之后,搜索指數(shù)也不是馬上回落,而是逐漸下降。這比較符合我們對(duì)疫情的認(rèn)知:當(dāng)它開(kāi)始的時(shí)候會(huì)對(duì)間夜馬上產(chǎn)生影響,但是等到清零之后,由于14天潛伏期的考慮,其實(shí)間夜的影響是逐步恢復(fù)的。?
5.2 使用特征
在中期預(yù)測(cè)之中使用的特征可以主要分為三個(gè)部分:
第一部分是時(shí)間相關(guān)的固定性信息:比如做出預(yù)測(cè)的日期的星期,做出預(yù)測(cè)的月份,被預(yù)測(cè)周期之內(nèi)是否有節(jié)假日,有幾天節(jié)假日。舉例來(lái)說(shuō),如果是在2022年4月30日預(yù)測(cè)22年5月1日到5月30日的間夜平均值,那么被預(yù)測(cè)周期內(nèi)的節(jié)假日就是五一,一共有4天(不包含4月30日)。
第二部分是間夜數(shù)據(jù)無(wú)關(guān)的外部信息,包含截止到預(yù)測(cè)日期的最新日uv以及疫情指數(shù)數(shù)據(jù)等信息,比如在2月11日做對(duì)3月份的預(yù)測(cè),那么能拿到的數(shù)據(jù)就是2月10日的uv數(shù)據(jù)以及疫情指數(shù)數(shù)據(jù)等信息。
第三部分是和間夜數(shù)據(jù)相關(guān)的特征構(gòu)建,包含去年同期的間夜情況,前年同期的間夜情況,被預(yù)測(cè)周期的上單情況等。比如在在2022年2月11日做對(duì)3月份的預(yù)測(cè),那么對(duì)應(yīng)的特征就分別為2021年3月的間夜情況,2020年3月的間夜情況,以及截止2022年2月11日時(shí)已有的3月的間夜。
5.3 模型介紹
中期預(yù)測(cè)使用的預(yù)測(cè)模型是LSTM,是在RNN基礎(chǔ)上的擴(kuò)展。RNN是基于序列形式構(gòu)建的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),每個(gè)神經(jīng)元的計(jì)算元素都是上一個(gè)神經(jīng)元的隱層以及該神經(jīng)元的輸入。如果用時(shí)間序列來(lái)理解這個(gè)問(wèn)題的話,RNN的每個(gè)神經(jīng)元,都代表一個(gè)時(shí)間點(diǎn),每個(gè)神經(jīng)元的輸入都是上個(gè)時(shí)間點(diǎn)(神經(jīng)元)計(jì)算得到的信息+這個(gè)時(shí)間點(diǎn)的信息。而LSTM則是在RNN的基礎(chǔ)上,對(duì)每個(gè)神經(jīng)元內(nèi)部的計(jì)算進(jìn)行了優(yōu)化,增加了輸入門(mén)、遺忘門(mén)以及輸出門(mén)機(jī)制,來(lái)輔助神經(jīng)元能夠更有效的獲得傳遞過(guò)來(lái)的序列信息。
5.4 評(píng)價(jià)指標(biāo)
模型的衡量指標(biāo)我們采用的是mape,即平均絕對(duì)百分誤差,計(jì)算公式如下:
mape值越大,模型誤差就越大,效果就越不好。
5.5 模型訓(xùn)練與結(jié)果
模型訓(xùn)練需要注意防止數(shù)據(jù)泄露,也就是驗(yàn)證集和訓(xùn)練集之間的時(shí)間需要隔開(kāi)一定時(shí)間。比如,訓(xùn)練集是2022年3月1日之前的數(shù)據(jù),驗(yàn)證集需要隔開(kāi)30天,即2022年3月31日才可以。原因是,我們的目標(biāo)值是未來(lái)30天的平均值,所以如果直接拿2022年3月1日之前的數(shù)據(jù)訓(xùn)練,那么在訓(xùn)練集的目標(biāo)值中就會(huì)包含未來(lái)30天的信息,而這部分信息其實(shí)是驗(yàn)證集之中需要預(yù)測(cè)的信息,因此構(gòu)成了一定程度的信息泄露,所以訓(xùn)練集需要隔開(kāi)30天。
模型效果如下表展示:
月份 | mape |
21年9月 | 12% |
21年10月 | 0.08% |
21年11月 | 4.33% |
21年12月 | 3.25% |
可以看到,模型在21年9月到12月的預(yù)測(cè)之中都表現(xiàn)出了比較好的準(zhǔn)確率。
六、長(zhǎng)期預(yù)測(cè)方案
6.1 問(wèn)題處理
在長(zhǎng)期預(yù)測(cè)方案之中,主要面對(duì)的問(wèn)題是預(yù)測(cè)周期長(zhǎng),導(dǎo)致間夜極大程度上受到疫情的影響,但是由于疫情不可預(yù)測(cè),導(dǎo)致長(zhǎng)期預(yù)測(cè)的難度較高。對(duì)此,我們采取的處理方案是使用情景預(yù)測(cè)的方案,針對(duì)不同的疫情情景,給出不同的預(yù)測(cè)值。
6.2 使用特征
在長(zhǎng)期預(yù)測(cè)方案之中,我們采取的特征如下:
- 去年同期間夜的對(duì)數(shù)值。比如,預(yù)測(cè)2023年4月的間夜,那么2022年4月的間夜取對(duì)數(shù),就可以得到這個(gè)特征。
- 每個(gè)被預(yù)測(cè)月的上單對(duì)數(shù)值,計(jì)算包含取消單的全量單。比如,在2月的時(shí)候預(yù)測(cè)4月的間夜,那么這個(gè)數(shù)值就是在2月的時(shí)候,我們已經(jīng)有的下單的4月訂單之和,并對(duì)這個(gè)值取對(duì)數(shù)。
- 按照去年同期上單間夜比構(gòu)造今年間夜量的對(duì)數(shù)值。計(jì)算公式如下:
- 搜索引擎指數(shù):以“疫情”為關(guān)鍵字的搜索引擎搜索指數(shù)平均值,具有滯后性,衡量大眾對(duì)疫情的關(guān)注度。計(jì)算公式如下:
這里需要注意的是,在訓(xùn)練背景下可以獲得這個(gè)搜索數(shù)據(jù),但是在預(yù)測(cè)場(chǎng)景下,是沒(méi)有實(shí)際的搜索數(shù)據(jù)的,我們將在d部分介紹這部分的變動(dòng)。
- 每個(gè)月總本土確診人數(shù)的天數(shù)平均:舉例來(lái)說(shuō),假如3月有31天一共確診了62名病例,那么這個(gè)特征數(shù)值就是62/31=2
- 就地過(guò)年政策特征:0~1之間的連續(xù)值,根據(jù)每年春節(jié)期間情況設(shè)定,1代表嚴(yán)格執(zhí)行就地過(guò)年,0代表完全取消就地過(guò)年政策,目前2021年2月該值為1,2022年2月該值為0.5。
6.3 模型步驟介紹
整體預(yù)測(cè)的邏輯如下:先基于歷史沒(méi)有疫情的情況下學(xué)習(xí)一個(gè)SARIMA模型,這個(gè)模型主要是學(xué)習(xí)在疫情前數(shù)據(jù)表現(xiàn)出的周期性季節(jié)性表現(xiàn),給出一個(gè)假如沒(méi)有疫情的時(shí)候的預(yù)測(cè)間夜。然后,使用lasso模型來(lái)擬合沒(méi)有疫情時(shí)的預(yù)測(cè)間夜和實(shí)際間夜之間的比例,從而得到最終的預(yù)測(cè)間夜。這樣分開(kāi)預(yù)測(cè)的好處是可以將疫情的影響比較具象的表現(xiàn)出來(lái)。具體分為下面五個(gè)步驟:
- 步驟一:對(duì)2018/2019兩年的數(shù)據(jù)構(gòu)造SARIMA模型。
- 步驟二:按照上一步得到的SARIMA模型預(yù)測(cè)2020起的每月間夜量,記為normal_forecast。
- 步驟三:構(gòu)造modify_rate,即normal_forecast/真實(shí)間夜量。
- 步驟四:利用前面列出的特征擬合modify_rate。
- 步驟五:列出不同疫情情境下的疫情數(shù)值,并基于此來(lái)預(yù)測(cè)modify_rate,最后通過(guò)normal_forecast/modify_rate計(jì)算間夜量預(yù)測(cè)值。
6.4 模型預(yù)測(cè)與結(jié)果?
在預(yù)測(cè)階段,我們通過(guò)輸入高中低三種疫情情景下的特征數(shù)值,得到不同疫情情景之下modify_rate預(yù)測(cè)值,然后通過(guò)normal_forecast/modify_rate得到計(jì)算的間夜預(yù)測(cè)值。
目前在特征中,使用到的疫情特征包含兩個(gè):每個(gè)月總本土確診人數(shù)的天數(shù)平均和搜索引擎指數(shù)。通過(guò)計(jì)算這兩個(gè)特征的歷史分位數(shù)情況,我們可以得到不同疫情情況下,這兩個(gè)特征的分布情況,將指定的分位數(shù)閾值作為不同情景劃分標(biāo)準(zhǔn)。
具體如下表所示,最大值、最小值、60%分位數(shù)和90%分位數(shù)將產(chǎn)生了三個(gè)風(fēng)險(xiǎn)區(qū),低風(fēng)險(xiǎn)代表疫情基本不影響間夜表現(xiàn)的情況,中風(fēng)險(xiǎn)表示有疫情一定程度上產(chǎn)生間夜表現(xiàn)影響,高風(fēng)險(xiǎn)代表疫情極大的影響到了間夜的表現(xiàn)。
低風(fēng)險(xiǎn)下限 | 低風(fēng)險(xiǎn)上限/中風(fēng)險(xiǎn)下限 | 中風(fēng)險(xiǎn)上限/高風(fēng)險(xiǎn)下限 | 高風(fēng)險(xiǎn)上限 | |
平均搜索指數(shù) | 最小值 | 60%分位數(shù) | 90%分位數(shù) | 最大值 |
本土確診人數(shù) | 最小值 | 60%分位數(shù) | 90%分位數(shù) | 最大值 |
我們用21年7月到21年12月這個(gè)區(qū)間,對(duì)這個(gè)預(yù)測(cè)方案進(jìn)行驗(yàn)證,結(jié)果如下表,可以看到,所有區(qū)域的實(shí)際值都在預(yù)測(cè)區(qū)域之中,并且所屬的預(yù)測(cè)風(fēng)險(xiǎn)區(qū)也基本和當(dāng)時(shí)的疫情情況吻合。
月份 | 實(shí)際值是否在預(yù)測(cè)區(qū)域中 | 所屬預(yù)測(cè)風(fēng)險(xiǎn)區(qū) |
21年7月 | 是 | 低疫情風(fēng)險(xiǎn)區(qū) |
21年8月 | 是 | 高疫情風(fēng)險(xiǎn)區(qū) |
21年9月 | 是 | 中疫情風(fēng)險(xiǎn)區(qū) |
21年10月 | 是 | 中疫情風(fēng)險(xiǎn)區(qū) |
21年11月 | 是 | 高疫情風(fēng)險(xiǎn)區(qū) |
21年12月 | 是 | 中疫情風(fēng)險(xiǎn)區(qū) |
七、總結(jié)與展望
本文主要基于中期預(yù)測(cè)和長(zhǎng)期預(yù)測(cè)兩個(gè)方案介紹了在疫情背景下間夜的預(yù)測(cè)。在之后的工作中,我們將會(huì)從以下幾個(gè)方向?qū)︻A(yù)測(cè)進(jìn)行進(jìn)一步的優(yōu)化:
首先,將會(huì)進(jìn)一步細(xì)化疫情量化信息,由于現(xiàn)在的指數(shù)數(shù)據(jù)是使用確診人數(shù)與搜索引擎指數(shù),而這兩者在一些特定的情況下不能直接反應(yīng)疫情影響,比如對(duì)于不同的人口密度和旅游需求的省份同樣的確診人數(shù)可能帶來(lái)的影響是不同的。又比如每年年終都會(huì)有大量的總結(jié)性話題,這個(gè)也有可能導(dǎo)致指數(shù)信息的計(jì)算偏差。所以,后續(xù)可以考慮基于這些情況做進(jìn)一步優(yōu)化。
其次,考慮基于歷史疫情信息,對(duì)疫情做預(yù)測(cè)之后再進(jìn)行間夜預(yù)測(cè)。隨著疫情常態(tài)化的到來(lái),歷史已有的疫情變化數(shù)據(jù)都可以作為我們的參考數(shù)據(jù)來(lái)對(duì)未來(lái)數(shù)據(jù)做出預(yù)測(cè)。所以,我們之后會(huì)考慮先判斷疫情之后可能的發(fā)展方向,基于此來(lái)優(yōu)化我們情景預(yù)測(cè)的部分。