疫情背景下的中長期月度預測方案
?作者 | 曉雯,攜程高級算法工程師,關注時間序列預測;Bluewind,關注時間序列預測。
一、摘要
本文將分享一個基于疫情情況下的中長期月度間夜數據預測方法。傳統的時間序列模型通過學習歷史數據中趨勢性和季節性的特征,能對月度數據做出相對有效的預測。而自從2020年以來,不時發生的疫情影響了歷史數據相對規律的趨勢性和季節性特征,也給基于傳統時間序列模型的預測帶來了難度。
本文考慮到上述情況,針對疫情,給出了一個改進預測方案,來更好地對數據進行預測,使其能更好地運用于預算、規劃、決策等管理目的。
二、背景
中長期月度間夜預測,主要是預測未來公司1-6月內的間夜,可以幫助公司進行預算、規劃、決策等管理行為。
然而,在目前的疫情背景之下,中長期預測面臨著新的問題:一方面預測變得更加困難,另一方面預測也變得更加重要。由于疫情的存在,增加了很多未來的不確定性,導致模型的預測困難進一步增加;同時也是因為疫情不確定性的存在,更需要預測相關的手段來幫助獲得更多的未來信息,以更好的對未來進行預測、規劃和決策。
因此,在疫情背景下的中長期預測變成了一個困難但是重要的問題。
三、面臨問題
概括而言,在疫情背景下的中長期預測面臨如下問題:
3.1 被預測時間長,導致預測難度增加?
由于中長期預測的時間最近是未來一個月,最遠是未來半年。而在疫情背景之下,未來是否會發生疫情,是會對實際的間夜產生影響的。但是站在當前節點,是無法預測到未來一個月,甚至半年后的疫情情況的,這就會給預測增加許多的難度。
3.2 數據量少,導致模型可學習模式少
對月度數據而言,一年只有12個數據。而在疫情情況下,不同的月份還面臨這不同的疫情影響程度。這就會給模型的學習帶來難度。
3.3 疫情影響的量化比較困難
疫情對間夜的影響是一個多方面復合的影響,和確診人數、當地政策、以及當時的季節都有相關關系,無法簡單使用確診人數來進行評估。比如,疫情之前每年的八月都是間夜高峰,但是疫情之后,隨著部分地區中小學要求學生開學前14天不能離開當地,導致疫情之后的八月下半旬的間夜增長就會比往年放緩,這部分的影響是和政策密切相關的,而不會直接體現在確診人數上。另外,疫情對間夜的影響還存在著滯后性的問題,一個地區可能在最近只有一天出現確診,但是這一天的確診可能會持續影響其未來的14天甚至更遠。
四、問題定義
4.1 口徑定義
我們定義預測的目標值為:全國酒店的月度間夜,并且不包含中途取消的訂單。
4.2 問題拆解
我們認為對于未來6個月的月度間夜預測,可以拆解為兩個問題。
問題一是中期預測,即只預測未來一個月的月度間夜,即當前為9月份時,預測10月份;當前為10月份時,預測11月份,以此類推。
問題二是長期預測,即預測未來兩個月到6個月的月度間夜,即當前為9月份時,預測未來11月份、12月份、來年1月份、來年2月份、來年3月份的月度間夜。
之所以做這種拆解的原因是未來一個月的間夜相對來說和目前的間夜有更強的關聯性,將它單獨做預測可以提升預測精度。
五、中期預測方案
5.1 問題處理
在中期預測方案之中,主要面對的問題是數據量少導致模型可學習模式少和疫情影響的量化比較困難。針對這兩個問題,我們的處理方案如下:
首先,將問題修正為預測未來30天內平均間夜,這樣就可以通過滑動窗口來構造數據,從而增加數據的數量。即原來每個月只能有一個樣本,現在每個月的每一天到未來30天都是一個樣本,可以提升整體的數據數量。
這里可能存在的問題是每個月的天數有些是28天,有些是31天,有些是30天。所以,我們對可能因為天數產生的數據偏差做了計算,結果如下表,可以看到偏差都在千分之三以下,不是很大,所以我們認為這種處理對預測的影響較小。
月份 | 當月平均值與30天平均值的mape |
22-7月 | 0.20% |
22-8月 | 0.21% |
22-10月 | 0.03% |
22-12月 | 0.27% |
其次,使用搜索引擎提供的疫情指數數據來作為疫情影響的衡量依據。參考下圖的確診人數和搜索指數的關聯關系圖可見,在疫情開始初期,指數數據會有一個比較集中的反饋,在疫情確診人數回落之后,搜索指數也不是馬上回落,而是逐漸下降。這比較符合我們對疫情的認知:當它開始的時候會對間夜馬上產生影響,但是等到清零之后,由于14天潛伏期的考慮,其實間夜的影響是逐步恢復的。?

5.2 使用特征
在中期預測之中使用的特征可以主要分為三個部分:
第一部分是時間相關的固定性信息:比如做出預測的日期的星期,做出預測的月份,被預測周期之內是否有節假日,有幾天節假日。舉例來說,如果是在2022年4月30日預測22年5月1日到5月30日的間夜平均值,那么被預測周期內的節假日就是五一,一共有4天(不包含4月30日)。
第二部分是間夜數據無關的外部信息,包含截止到預測日期的最新日uv以及疫情指數數據等信息,比如在2月11日做對3月份的預測,那么能拿到的數據就是2月10日的uv數據以及疫情指數數據等信息。
第三部分是和間夜數據相關的特征構建,包含去年同期的間夜情況,前年同期的間夜情況,被預測周期的上單情況等。比如在在2022年2月11日做對3月份的預測,那么對應的特征就分別為2021年3月的間夜情況,2020年3月的間夜情況,以及截止2022年2月11日時已有的3月的間夜。
5.3 模型介紹
中期預測使用的預測模型是LSTM,是在RNN基礎上的擴展。RNN是基于序列形式構建的神經網絡結構,每個神經元的計算元素都是上一個神經元的隱層以及該神經元的輸入。如果用時間序列來理解這個問題的話,RNN的每個神經元,都代表一個時間點,每個神經元的輸入都是上個時間點(神經元)計算得到的信息+這個時間點的信息。而LSTM則是在RNN的基礎上,對每個神經元內部的計算進行了優化,增加了輸入門、遺忘門以及輸出門機制,來輔助神經元能夠更有效的獲得傳遞過來的序列信息。
5.4 評價指標
模型的衡量指標我們采用的是mape,即平均絕對百分誤差,計算公式如下:
mape值越大,模型誤差就越大,效果就越不好。
5.5 模型訓練與結果
模型訓練需要注意防止數據泄露,也就是驗證集和訓練集之間的時間需要隔開一定時間。比如,訓練集是2022年3月1日之前的數據,驗證集需要隔開30天,即2022年3月31日才可以。原因是,我們的目標值是未來30天的平均值,所以如果直接拿2022年3月1日之前的數據訓練,那么在訓練集的目標值中就會包含未來30天的信息,而這部分信息其實是驗證集之中需要預測的信息,因此構成了一定程度的信息泄露,所以訓練集需要隔開30天。
模型效果如下表展示:
月份 | mape |
21年9月 | 12% |
21年10月 | 0.08% |
21年11月 | 4.33% |
21年12月 | 3.25% |
可以看到,模型在21年9月到12月的預測之中都表現出了比較好的準確率。
六、長期預測方案
6.1 問題處理
在長期預測方案之中,主要面對的問題是預測周期長,導致間夜極大程度上受到疫情的影響,但是由于疫情不可預測,導致長期預測的難度較高。對此,我們采取的處理方案是使用情景預測的方案,針對不同的疫情情景,給出不同的預測值。
6.2 使用特征
在長期預測方案之中,我們采取的特征如下:
- 去年同期間夜的對數值。比如,預測2023年4月的間夜,那么2022年4月的間夜取對數,就可以得到這個特征。
- 每個被預測月的上單對數值,計算包含取消單的全量單。比如,在2月的時候預測4月的間夜,那么這個數值就是在2月的時候,我們已經有的下單的4月訂單之和,并對這個值取對數。
- 按照去年同期上單間夜比構造今年間夜量的對數值。計算公式如下:

- 搜索引擎指數:以“疫情”為關鍵字的搜索引擎搜索指數平均值,具有滯后性,衡量大眾對疫情的關注度。計算公式如下:

這里需要注意的是,在訓練背景下可以獲得這個搜索數據,但是在預測場景下,是沒有實際的搜索數據的,我們將在d部分介紹這部分的變動。
- 每個月總本土確診人數的天數平均:舉例來說,假如3月有31天一共確診了62名病例,那么這個特征數值就是62/31=2
- 就地過年政策特征:0~1之間的連續值,根據每年春節期間情況設定,1代表嚴格執行就地過年,0代表完全取消就地過年政策,目前2021年2月該值為1,2022年2月該值為0.5。
6.3 模型步驟介紹
整體預測的邏輯如下:先基于歷史沒有疫情的情況下學習一個SARIMA模型,這個模型主要是學習在疫情前數據表現出的周期性季節性表現,給出一個假如沒有疫情的時候的預測間夜。然后,使用lasso模型來擬合沒有疫情時的預測間夜和實際間夜之間的比例,從而得到最終的預測間夜。這樣分開預測的好處是可以將疫情的影響比較具象的表現出來。具體分為下面五個步驟:
- 步驟一:對2018/2019兩年的數據構造SARIMA模型。
- 步驟二:按照上一步得到的SARIMA模型預測2020起的每月間夜量,記為normal_forecast。
- 步驟三:構造modify_rate,即normal_forecast/真實間夜量。
- 步驟四:利用前面列出的特征擬合modify_rate。
- 步驟五:列出不同疫情情境下的疫情數值,并基于此來預測modify_rate,最后通過normal_forecast/modify_rate計算間夜量預測值。
6.4 模型預測與結果?
在預測階段,我們通過輸入高中低三種疫情情景下的特征數值,得到不同疫情情景之下modify_rate預測值,然后通過normal_forecast/modify_rate得到計算的間夜預測值。
目前在特征中,使用到的疫情特征包含兩個:每個月總本土確診人數的天數平均和搜索引擎指數。通過計算這兩個特征的歷史分位數情況,我們可以得到不同疫情情況下,這兩個特征的分布情況,將指定的分位數閾值作為不同情景劃分標準。
具體如下表所示,最大值、最小值、60%分位數和90%分位數將產生了三個風險區,低風險代表疫情基本不影響間夜表現的情況,中風險表示有疫情一定程度上產生間夜表現影響,高風險代表疫情極大的影響到了間夜的表現。
低風險下限 | 低風險上限/中風險下限 | 中風險上限/高風險下限 | 高風險上限 | |
平均搜索指數 | 最小值 | 60%分位數 | 90%分位數 | 最大值 |
本土確診人數 | 最小值 | 60%分位數 | 90%分位數 | 最大值 |
我們用21年7月到21年12月這個區間,對這個預測方案進行驗證,結果如下表,可以看到,所有區域的實際值都在預測區域之中,并且所屬的預測風險區也基本和當時的疫情情況吻合。
月份 | 實際值是否在預測區域中 | 所屬預測風險區 |
21年7月 | 是 | 低疫情風險區 |
21年8月 | 是 | 高疫情風險區 |
21年9月 | 是 | 中疫情風險區 |
21年10月 | 是 | 中疫情風險區 |
21年11月 | 是 | 高疫情風險區 |
21年12月 | 是 | 中疫情風險區 |
七、總結與展望
本文主要基于中期預測和長期預測兩個方案介紹了在疫情背景下間夜的預測。在之后的工作中,我們將會從以下幾個方向對預測進行進一步的優化:
首先,將會進一步細化疫情量化信息,由于現在的指數數據是使用確診人數與搜索引擎指數,而這兩者在一些特定的情況下不能直接反應疫情影響,比如對于不同的人口密度和旅游需求的省份同樣的確診人數可能帶來的影響是不同的。又比如每年年終都會有大量的總結性話題,這個也有可能導致指數信息的計算偏差。所以,后續可以考慮基于這些情況做進一步優化。
其次,考慮基于歷史疫情信息,對疫情做預測之后再進行間夜預測。隨著疫情常態化的到來,歷史已有的疫情變化數據都可以作為我們的參考數據來對未來數據做出預測。所以,我們之后會考慮先判斷疫情之后可能的發展方向,基于此來優化我們情景預測的部分。

























