:::

AI能夠告訴你未來?用Weka實作多變項時間序列預測 / Time Series Forecasting with Weka

image

這是本學期我在政大圖檔所專題討論課程中介紹的內容,主題是「用Weka實作多變項時間序列預測」。傳統的時間序列分析(time series analysis)著重於以統計為主的ARIMA模型,分析過程著重於模型的選擇與判斷,一般僅以時間變項進行預測。Weka則是從資料探勘中迴歸(regression)的角度來實作時間序列預測(time series forecasting),使用的預測演算法可以是線性迴歸(Linear Regression)、類神經網路預測(MultilayerPerceptron)、或支持向量機迴歸(SMOreg),甚至可以加入疊加變項(overlay),就能實作多變項的時間序列預測。

本文除了放上我在專題演講的投影片之外,也將使用Weka進行時間序列預測的做法整理出來,供大家一步一步操作、學習。


投影片 / Slide

環境配置 / Environment

weka[3]

本投影片全部採用Weka進行。Weka是免費的自由軟體,而且可以跨平臺運作。

練習資料 / Practice data sets

投影片中使用到了三個時間序列資料,你可以從以下連結下載:


時間序列資料格式 / Time series data format

image

在研讀時間序列分析的介紹時,我發現許多程式對時間序列的資料格式都沒有比較統一的做法。因此我根據Weka在時間序列預測上能夠使用的功能,將資料分成四種欄位:時間欄位(date或timestamp)、略過資料(skip)、疊加資料(其他的名稱)、觀察值與預測目標(target)。

你可以參考這份Google試算表來看看格式的內容:readers_i1-8_p9

  • 時間欄位:可以是日期,以「date」命名,格式是「yyyy-MM-dd」,例如今天是「2017-09-26」;也可以是時間,以「timestamp」命名,格式是「yyyy-MM-dd HH:mm:ss」,例如現在是「2017-09-26 20:42:05」。資料必須以日期由早到晚依序排列。
  • 略過資料:以「skip」命名,如果這一天不要納入分析或預測,則設為「true」(大小寫皆可),此時日期之外的其他欄位都不會納入分析;若這一天需要納入分析或預測,則設為「false」。如果每一天都要納入分析,那麼可以不加入此欄。
  • 疊加資料:以除了「date」、「timestamp」、「skip」、「target」之外的任意名稱命名,例如我用「in_semster」來表示是否是在學期中。資料格式必須是類別變項(nominal),也可以是「true」跟「false」這種二元變項,但是Weka在預測的時候會將之視為類別變項。
  • 觀察值與預測目標:以「target」命名。資料格式必須是連續變項(numeric)。最後要預測的日期對應的「target」請寫入「?」,表示這是等待預測的欄位。

時間序列預測步驟 / Timeseries forecasting procedure

操作步驟還蠻多的,讓我們一步一步來看看怎麼做吧。

1. 準備CSV試算表資料 / Prepare CSV timeseries data set

2017-09-25_094622

請自行準備上述格式的時間序列資料,或是下載範例檔:

2. 試算表轉換ARFF / Convert timeseries data set into ARFF format

(另開新視窗)

請在上面的轉換工具中上傳CSV試算表資料,透過網頁程式的轉換,取得以下四種資料:

  • 下載訓練集資料:按下Train Data Set按鈕下載,你會得到「train_set-…」開頭的ARFF檔案。
  • 複製向前預測步數:複製Number of time units to forecast欄位的數字。
  • 下載略過資料:按下Skip List按鈕下載名為「skip_list-…」的TXT文字檔,或是在Skip list preview欄位中複製資料。
  • 下載疊加資料:按Periodic按鈕下載,你會得到「periodics_set-…」為檔案名稱開頭的檔案。
3. 使用Weka / Open Weka and load data

image

開啟Weka的Explorer,在Preprocess頁籤中按下「Open file」載入剛剛下載的訓練集資料(以train_set-開頭的檔案)。

4. 時間序列預測設定:基本設定 / Forecast: Basic configuration

image

請切換到「Forecast」頁籤,進入基本設定「Basic configuration」頁籤,然後進行以下設定:

  • Number of time units to forecast:輸入從上面得到的向前預測步數設定。
  • Periodicity: 依照你的日期資料,選擇每天(Daily)或每小時(Hourly)。
  • Skip list: 貼上略過資料的內容。
  • Perform evaluation: 打勾,這樣才會顯示評估結果。
5. 時間序列預測設定:進階設定 / Forecast: Advanced configuration

進入到進階設定「Advanced configuration」頁籤之後,這邊有蠻多需要設定的地方,我們一個一個來看。

5-1. 預測演算法 / Base learner

image

從Base learner頁籤這裡可以設定預測演算法。這邊我介紹了三種演算法:

  • 線性迴歸 LinearRegression:以統計的多元迴歸預測的預測演算法,是迴歸預測的基本做法。
  • 類神經網路預測 (多層次感知機) MultilayerPerceptron:現今人工智慧、深度學習為基礎的多層次感知機。如果能夠仔細調教隱藏層的神經網路結構,理論上可以做到最佳預測。
  • 支持向量機迴歸 SMOreg:支持向量機的迴歸版本,它使用核技法(kernel trick)將非線性呈現的資料轉換成容易區隔的分佈。支持向量機演算法的特色是計算速度快、預測成效也挺不錯的。
5-2. 載入疊加變項 / Load periodic attributes

image

來到Periodic attributes頁籤中,先打勾「Customize」選項,然後按「Load」載入前面下載的疊加變項。疊加變項的檔案名稱開頭會是「periodics_set-…」。

5-3. 繪製預測的建模過程 / Graph target at steps

image

在Output頁籤中,將「Graph target at steps」打勾即可。這樣Weka會顯示向前預測1步的圖形。

6. 預測結果 / Forecasting result

image

按下下方的「Start」之後,右下角的「Output/Visualization」就會顯示三個頁籤,包括「Output」(文字報表)、「Train pred. at steps」(訓練預測結果)以及「Train futre pred.」(預測未來)。個別敘述如下:

6-1. 文字報表 / Output

Output是以文字輸出完整報表,主要包括了:

image

預測結果數字:日期後面有「*」標示就是預測結果。

image

預測模型呈現:如果是線性迴歸則會以 y = a*x + b 這種公式呈現,我們可以分析各個變數前面的權重來分析那種變數最重要。不過其他預測演算法的模型不見得可以這樣直接解釋。

image

評估預測殘差值(MAE):數字越小,表示預測的越準。但是數字太小,可能是表示過度擬合(overfitting)。預測殘差值可以用來比較不同預測結果之間的優劣,Weka提供7種評估指標,包括:

  1. 絕對標準誤差 Mean absolute error (MAE): sum(abs(predicted - actual)) / N
  2. 絕對平方誤差 Mean squared error (MSE): sum((predicted - actual)^2) / N
  3. 開根平均平方誤差 Root mean squared error (RMSE): sqrt(sum((predicted - actual)^2) / N)
  4. 平均絕對誤差百分比 Mean absolute percentage error (MAPE): sum(abs((predicted - actual) / actual)) / N
  5. 方向精度 Direction accuracy (DAC): count(sign(actual_current - actual_previous) == sign(pred_current - pred_previous)) / N
  6. 相對絕對誤差 Relative absolute error (RAE): sum(abs(predicted - actual)) / sum(abs(previous_target - actual))
  7. 相對開方誤差 Root relative squared error (RRSE): sqrt(sum((predicted - actual)^2) / N) / sqrt(sum(previous_target - actual)^2) / N)

詳細請看Pentaho的說明

6-2. 訓練資料預測結果 / Train prediction at steps

image

在訓練資料預測結果中可以看到時間序列的折線圖。紅色是真實的觀測值,藍色是Weka依照預測演算法預測的結果。如果藍色很貼近紅色,表示預測效果準確。但是完全跟紅色一致的話,就有可能是過度擬合的情況。過度擬合的模型只能適用於已知的資料,預測未知的未來成效不彰。

6-3. 訓練資料預測未來 / Train future prediction

image

最後的Train future pred.頁籤則可以看到預測未來的資料。靠近左邊的折線以方塊表示實際的觀測值,右邊以圓形表示的就是Weka計算後得到的預測值。上圖的例子中,因為本來的預測模型就不是很好,而Weka使用這個錯誤的預測結果進行後面的預測,在錯誤累增(errors propagate)效果的影響下,預測值就以指數暴增。

就目前我的觀察來看,我們可以從這張圖簡單地評估這個預測結果是否合宜:

  • 預測值如果以指數成長或遞減,那就是錯誤累增效應,這應該是錯誤的預測結果。
  • 預測值跟過去的觀測值相比,如果出現了異常高或異常低的情況,那也很可能是錯誤的預測結果。

當然,預測結果的好或不好,實際上還是要以資料本身來決定。上面的說法僅供參考而已。

7. 改善預測 / Improve prediction

image

我歸納了三種常用的改善預測的方法:

  1. 更換預測演算法:預設演算法是線性迴歸(LinearRegression),你可以試試看類神經網路預測(MultilayerPerceptron)或支持向量機迴歸(SMOreg)等其他預測演算法,通常預測結果會大幅改變。
  2. 增加更多觀察值:以更多的觀察值來預測未來。但若觀察值本身的資料就相當不穩定,沒有呈現一致的趨勢性、週期性的話,那很可能會讓預測結果更差。
  3. 增加疊加變項(overlay data):將其他可能影響的因素以疊加變項的形式加入預測。例如「是否開學」會大幅影響「圖書館入館人次」,這個變項並不能單純從時間看到,所以就需要視為疊加變項一併納入預測。但因為是否開學也大致上以一年一年為週期,若輸入資料有多年的觀察值,那Weka在拆解時間序列特徵的時候也會自動發掘這個隱含的變項。

請先以上面的三種方法來試著改善預測結果看看,或是繼續深入瞭解Weka時間序列預測的其他功能來做調整吧。


結語 / Conclusion

「這個預測值準嗎?」

專題演講之後,大家最常問的問題就是這個。老實說,我只能說有一定程度的準確性,但不能完整保證。畢竟我不是天上的神,Weka也只是個工具,預測數值高低這種做法通常不可能完美精準。

儘管如此,比起要你直接茫然地面對未知的未來,透過上述做法,利用Weka快速產生一個預測值,這樣就可以讓你在決策的時候獲得更多判斷的依據。只要有幫助,這就是一個好方法。

限制 / Limitation

我花了很多時間在整理使用Weka進行時間序列預測的操作,但是這個做法並不完美。這是因為Weka原本提供的疊加變項功能(overlay data)不能用於預測未來,所以我才改用週期變項(periodic attributes)來作為疊加變項使用。兩者皆會被用於預測結果,但是週期變項只能用類別資料類型,而疊加變項則是使用連續資料類型。大部分財經或社會統計預測都用後者,不過若疊加變項是事件、行為等類型資料,那像這篇這樣用週期變項則是比較合適的。

時間序列的預測或分析 / Difference between Time Series Forecast and Time Series Analysis

image

最後要跟大家說明的是時間序列預測跟時間序列分析的差別。大部分在大學開設的課程都是時間序列分析,是以ARIMA模型為主的教學內容,大多會使用SAS、SPSS Trend,或是R來進行建模。我之前花了不少時間在研讀時間序列分析的內容,不得不說這真的是一塊入門門檻相當高的領域。儘管基本的自迴歸、移動平均、差分等概念不難理解,但是要評斷使用何種模型時需要計算多種指標,計算過程不但複雜,而且指標的解讀也需要有相當的先備知識。

「為什麼不能直接產生個模型,簡單地告訴我預測值就好呢?」

後來我在王者歸來:WEKA機器學習與大數據聖經這本書中發現到Weka竟然採用了機器學習的角度來實作時間序列預測,而且康奈爾大學心理系教授Darlington也認為機器學習用來連續變項的迴歸方法會比傳統的ARIMA來的好,理由如下:

  • 迴歸比ARIMA更有彈性、更強力、而且可以產生更好的模型。這點已經有許多研究證實。
  • 迴歸比ARIMA更容易理解,至少對那些已經熟悉迴歸的使用者來說很容易懂。
  • 迴歸使用「有限」(closed)計算方法,基本上已經比較過所有可行的結果。而ARIMA以及其他許多方法使用迭代演算法(iterative algorihms),常常難以得到好的解決方案。Darlington教授常常看到ARIMA算到卡關,但用迴歸就能輕鬆克服的資料。

image

經過一番研究,Weka用來預測時間序列的方法上的確是很好理解。但可惜的是,原本的做法並不好使用,而且對很多人來說也很難立即搞懂原理。因此我改良了Weka Spreadsheet to ARFF工具,並在投影片中將時間序列預測的基本原理作了一番介紹。這個做法並不是正統時間序列分析的教學內容,而是我用自己的角度來介紹時間序列預測,所以對接受時間序列分析課程訓練的人來說,應該會覺得非常奇怪吧。

weka logo_thumb

不管怎樣,就結果來看,這方法的確簡單又可以使用。Weka不僅可以作基本的分類分群關聯式規則,還能作文本自動評分圖片辨識,以及這篇的時間序列預測。Weka真的很強大,感恩Weka!讚歎Weka!

0 意見:

留言工具: