筆者在本系列的上一篇文章提到,產品生命週期曲線的重要功能之一,是作為中長期需求走勢觀測的基準線。對於許多公司的營運管理、決策規劃單位而言,藉由未來半年甚至一整年的需求預測結果,來制定相對應的中長期營運計畫,是十分常見的事情,但這與中長期預測的難易是兩碼子事。固然我們能參考產品生命週期,來抓出個大概,但實務上,仍需搭配其他輔助方法與資訊,才能讓中長期的預測結果具有參考價值。而這篇文章就是要來分享筆者實際在 3C 電子代工廠建構中長期需求預測模型的相關作法。
1. 為歷史趨勢加掛衰退係數
方法 1. 就是先從歷史資料當中抓出一條筆直的趨勢線,然後針對未來各期的趨勢值,乘上一組衰退係數。例如:我們要產出的是未來半年的預測值,最小的時間顆粒度是 by week(也就是總共要產出未來 26 週的預測值),並且我們假設採用最簡單的線性衰退函數,那麼我們就在這條趨勢線上的未來第一週的趨勢值乘上 26/26;第二週的趨勢值乘上 25/26,依此類推,到了第二十六週的趨勢值則乘上 1/26。藉由該調整方法,讓「根據歷史資料而產生出來的趨勢線」的影響比例,隨著距今時間拉長而降低。該作法便是假設「根據歷史資料而產生出來的趨勢線」,對時間上距今越近的預測值越管用。若時間上距今越遙遠,那麼參考性理當會越來越低。
至於這個衰退係數一定要線性的嗎?我能不能用指數衰退?對數衰退?或者其他非線性的衰退方式?我一定要對全部的預測值都乘上衰退係數嗎?能不能在未來的第 N 期的預測值才開始乘上這組衰退係數?筆者的看法是,採用全段未來趨堅的線性衰退,當然是最簡單的作法。但若您有足夠的時間進行相關比較實驗,仔細瞭解手頭上的資料樣貌、以及自己所面臨的預測情境後,再來決定要採用哪種比例衰退方式,一定不會錯。
而讀者們一定還會再問,照上述說法,距今最遙遠那一期的調整後趨勢值,不就一定會很小嗎?沒錯,如果你的最終預測結果,就真的只有這一條「根據歷史資料產生出來的趨勢線」,沒有再加上其他東西或者其他調整程序了,那麼採用這種比例衰退方法,自然會讓越遙遠的未來預測值看起來小得不合理。所以這時候,就要跟筆者在上述提到的方法 2. 來相互搭配。
2. 採用不只一種的趨勢線進行比例調和
方法 2. 的概念也十分容易理解,就是我透過混合不只一條的趨勢線,來產生未來的趨勢參考線。而需要特別留意的是,每一條趨勢線的資料來源必須不同,且這些資料又都必須跟預測目標(就是預測模型的 Y 變數)具有實質上的業務關聯性才行。否則便失去了採用不同趨勢線的意義。例如:以電子代工廠而言,我們經常會拿到來自於上游客戶給出來的未來半年的預期需求,這些預期需求可能是來根據他們的 ERP & MRP 產出的數字,也有可能是客戶的業務單位用他們的預測方法給出的預期需求。而這道未來半年的預期需求,本身就是一項可參考的趨勢線。既然客戶都有給出未來的預期需求了,那為什麼不照客戶給出的需求數字來生產備料就好?啊如果客戶給出的預期需求跟他們的實際下單真那麼一致的話,我也就不用這麼辛苦幫公司刻這個通靈預測模型了啊 XD
咳咳。回歸正題,當我們有了不同來源的未來趨勢,我們就能將其與上述方法 1. 的趨勢線進行比例調和。至於,要採用怎麼個比例混合方法?筆者認為,只要在業務情境當中說得通,那麼都沒啥大問題。惟須提醒的是,這樣的比例混合方法,只是讓我們採用的趨勢線所隱含資訊更加多元,但不代表這麼做就一定會使預測值變得更加精準。同時必須留意,我們不該同時採用太多的不同來源的趨勢線來進行比例調和。因為,「如何決定多條趨勢線的混合比例」會是個大問題。
看到這裡,熟悉 Machine Learning 建模流程的讀者們可能會說「那我就每一次做預測的時候都跑個 Grid Search,跟其他預測演算法的參數組合一起都跑過一遍,讓模型自動找個最合適的混合比例不就好了?」。筆者的看法是,單純的 Machine Learning 模型建構,或許可以這樣搞。但我們這裡處理的是趨勢線,其在業務層面的意涵代表的是 baseline,穩健且可靠的參考性,才是 baseline 的重點。今天你跟工廠的 planner 說,我三種趨勢線的混合比例是 5:4:3、下禮拜說混合比例是 6:1:4、再下禮拜又變成 3:6:9,planner 不覺得你在搞他才怪。除此之外,當我們採用越多不同來源的趨勢線,實質上就是讓我們最終獲得的那條趨勢線,越來越趨向一條平均線,如此一來,原本這些不同來源的資訊特徵,很可能就在平均的過程當中被稀釋掉了。
3. 不同的未來區間,採用不同的預測方法
方法 3. 則是從另外一種方法來處理不同未來區間的預測值產出。方法 1. 跟 2. 是從同一組未來預測值當中去進行加權修正,那麼方法 3. 則是一開始就使用不同方法來產生不同未來區間的預測值。以筆者的專案為例,我們的預測模型的前四期預測值,是以 user 指定的特定業務邏輯與資料來源,以 rule-base 的數量整併方式所產生出來的預期需求;第五期之後,才是包含了上述方法 1. 與方法 2. 所產生出來的 model base 的預測結果。是否適合採用這種方法,一樣得看實際面對的預測場景、業務邏輯、以及資料樣貌而定。
4. 參考產品生命週期曲線
方法 4. 其實就是筆者於本系列的上一篇文章提到的一系列方法。相關內從請直接參考該文章的內容,筆者便不再贅述。但值得特別一提的是,在參考產品生命週期曲線來產生或者調整短中長期的預測值的時候,經常會需要與方法 3 . 相互搭配。因為不同的生命產品生命週期階段,適用的預測情境原本就會不同。以新產品導入時期為例,我們如果在產品上市不到一個月的時候,需要做出未來半年甚至一年的需求預測,假設預測的時間顆粒度為週(by week),那麼顯而易見的,前幾週的預測所關注的因素,與 26 週(即半年)的條件一定差異甚大。這也是新手資料分析師在進行相關模型建構時,很可能忽略的細節!
5. 參考事件影響因子
方法 5. 則是要複習到本系列的第三篇文章所提到的內容。這也是個容易理解的情境,假設我們每週都要給出特定產品的未來半年的預期需求,而我們明確地知道,三個月後是聖誕節,且我們的產品在聖誕節時也是相對的旺季,聖誕節就是個明確的事件影響因子,我們就能依此對我們的預測值作出適當的調整。實際上,事件影響因子在需求預測模型的實作方法本身並沒有什的特定形式,只要能實際發揮作用(使預測結果確實反應事件的影響),且業務情境當中說得通,都沒問題。
6. 依照總量或數值區間的比例正規化
方法 6. 的意思是將預測結果的最大、最小值的範圍,依照比例縮放在某個特定的範圍內;或者將未來的預期需求加的總和,依照某個特定總量按比例調正到各期得預測值當中。前者其實很容易理解,例如:一般情況下,我們應該不允許預期需求當中出現負值,但可能歷史資料當中所呈現的需求趨勢就是逐步遞減,那如果我們剛好又是做中長期的預測值產出,那麼這個遞減的歷史趨勢,就有可能使較遠期的預測值變成負值。為了避免負值的產生,就需要將原始的預測值進行範圍的比例調整,這個範圍調整不僅僅是保證預測值不為負,同時也包含了最大值不會超過某個我們設定的數值上限。而上限的部份該怎麼訂?這就有賴於業務單位以及決策分析單位的相互合作了討論出來了。
前者的情況還有一種特例,就是我們根據某個基礎模型產生出來的中長期預測值當中,不僅有負值,同時也包含了 0 的存在。假若我們只是發現有負值存在,就無腦地將原本的整組預測值進行比例調整(這裡經常會採用的比例調整方式是MinMaxScaling ),雖然把處理了負值的問題,但由於原本就是 0 的預測值,經這樣的調整後依舊是 0,所以調整後的預測值趨勢樣貌(即線形的高低起伏)就會被破壞掉。為了處理初始預測值當中的負值,但同時又能保有原始預測值的趨勢線形,在進行比例縮放的同時,就需要將原本是 0 的那幾期預測值加上截距項。
而這個截距項的值該如何訂定,並沒有一定標準。以筆者的案子而言,筆者的預測模型要產出的是未來26週的預測值,若基礎模型的預測結果當中有上述情況發生(即有負值,同時又有 0),則筆者會在已經經過「0-1 正規化 」的初始預測結果當中,為原本是 0 的那幾期預測值加上 1/26,然後再進行一次 MinMaxScaling。但儒原本的預測值當中就只有負值而沒有 0,自然就不需要加上這一道截距項修正的處理程序了。
前面情況是根據整組預測值當中的最大值與最小值來進行正規化,還有一種情況是,我們所產出來的整組中長期預測值的總和必須限定在某個數量範圍內,或者直接等於該數量。這種情況是,例如:我代工廠上游客戶給出的未來半年預期需求就是這麼多(很可能是有綁合約量),我代工廠端再怎麼估算未來各期的預期需求量分配來備產能,客戶未來這段期間的需求總量也不會變多,自然就需要根據這個總量來進行比例的正規化。
而由於根據總量進行比例重分配的時候,有可能基礎模型的預測值就包含了負值或者 0 的存在。因此,根據總量重新分配比例的時候,通常需要先經上述的「附加截距項的 MinMaxScaling」,才來執行總量的比例重分配。而方法 6. 的調整,通常也是放在個調整流程當中的最後一步,即我的初始預測結果,已經考量了事件影響因子、產品生命週期、中長期的趨勢影響遞減......等等因素的調整後,才來執行整體範圍的正規化調整。