:::

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!

總共19 則留言 ( 我要發問 , 隱藏留言 顯示留言 )

  1. 您好,想請教您疊加資料只能是類別變項,如果我的類別變項是以數值代表這樣可以嗎?例如說,人員編號001、002或是房號01、02又或者是性別0、1...這類可以嗎?這兩天試著跑自己的資料,光是要開啟train data就卡關了,實在找不出是哪裡出問題,會一直出現nominal value not declared in header ,read Token[M3AO],line 19的提示,能否指點可能是哪個部分出錯了呢?(哭)謝謝您~~

    回覆刪除
    回覆
    1. To linlin,

      Weka預設會把數字當成連續數值類型
      所以你必須要把「001」改成「_001」,讓它看起來不是數字
      同樣地,性別也不能用1跟2

      看起來你是用CSV格式開啟
      我建議你把它改成ODS格式,整理好之後再用Weka開啟
      要記得安裝WekaODF套件

      刪除
    2. 布丁您好:
      了解!謝謝您的回覆,我剛剛試過了上傳ODS檔沒辦法用試算表轉換工具下載訓練、略過、疊加資料,因為上傳後就沒動靜了。另外想請問若是疊加資料中有部分遺漏值是否也會影響呢?

      刪除
    3. To linlin,

      Oops
      我忘記早期做的工具沒有支援ODS了

      那最簡單的方式,就是乖乖把數字換成字串,然後再來處理吧
      有缺失值也會有影響沒錯

      刪除
  2. 大大您好,
    您所推薦的書籍"王者歸來:WEKA機器學習與大數據聖經"似乎已經絕版,還有其他的書籍可以介紹嗎?謝謝!

    回覆刪除
    回覆
    1. To xiaoluo,

      https://www.cs.waikato.ac.nz/ml/weka/mooc/dataminingwithweka/
      可以看作者的線上課程,有提供字幕

      刪除
  3. 我預測值出來有小數可調整為整數嗎

    回覆刪除
    回覆
    1. To jason,

      把演算法的numDecimaPlaces改成0,它在輸出計算結果時,會四捨五入為整數。
      https://lh3.googleusercontent.com/-JWKZlHnM42I/YP6YPQYooWI/AAAAAAAFBDk/j7-hAFoDyucfxQw7QQ9oWIq-eeM3DMhPACLcBGAsYHQ/s1600/2021-07-26_190913.png

      刪除
  4. 最近有網友詢問為什麼原本Weka的疊加變項功能(overlay data)不能用於預測未來。
    這是Weka的限制。

    你應該也可以用其他程式語言來達到這個目的。
    例如多變項時間序列分析:
    https://bookdown.org/singh_pratap_tejendra/intro_time_series_r/neural-networks-in-time-series-analysis.html

    回覆刪除
  5. 有網友在詢問為什麼Weka裡面沒有出現Forecast頁籤。

    根據文中的環境配置一節:
    https://blog.pulipuli.info/2017/09/aiweka-time-series-forecasting-with-weka.html#postcataaiweka-time-series-forecasting-with-weka.html0_anchor1

    這是因為沒有在Package Manager安裝timeSeriesForecasting套件。
    https://lh3.googleusercontent.com/-eNnjGEbrhNE/Yed1gBjz-HI/AAAAAAAFFvs/9Qvyqy3kfZ0Gk1Dgznulrz0y5Irs_vcJQCNcBGAsYHQ/s1600/20220119-101800-32.png

    請參考這篇安裝套件的做法來安裝timeseriesForecasting套件。
    https://blog.pulipuli.info/2017/06/weka-how-to-download-weka-and-install.html#postcataweka-how-to-download-weka-and-install.html0_anchor2

    回覆刪除
  6. 關於製作Periodic attributes的 load file 那一段教學有些隱晦...格式應該是甚麼樣子呢?

    回覆刪除
    回覆
    1. To Dalton,

      以這個檔案為例:
      Part 4-2. 1月到8月→預測9月到館人數
      https://docs.google.com/spreadsheets/d/1862Jwj-Zkw43o34RhTxcQWx2F18h3WdvRdDlA8bX3Vg/edit?usp=sharing

      https://blogger.googleusercontent.com/img/a/AVvXsEgwG-RyWj6n8Z6WHLCM7NU3EGMlVcp8Z7_28Nj2PJUdbc46tRNtY9c_04nofrXHunIAsJi0mk1WwCPhmEiTnIf95qKKCu9Fpof9ugakWSFBgvpvhQ2OilLNKbUEulYQdajICc9dC8JLhTFB0hOD161KY7duLd4_6dyPQLB2zGgWQpn6dy5oU8M
      用in_semester裡的TRUE或FALSE來表示。

      https://blogger.googleusercontent.com/img/a/AVvXsEhG89WNmop7owrBzIc8Y8z0KZDMzQj2ucquohTZFLkXWYAYDfItmdMT6VuM2RDtcRU1wOane2PBEcpdS3a_15IyAsRsAbMgXzvMg4kNtQtszHN5F3_rwI7MoAb0PVdP2uM8LsV7duvfcCltnQ3CJLThd-HtT9kGO_KqWznZsnragNJUejBqRZg
      網頁程式會根據skip來製作對應的Periodic attributes

      Periodics data檔案內容像是這個樣子:
      ````
      time-series-periodics
      *pre-defined*:AM
      *pre-defined*:DayOfWeek
      *pre-defined*:DayOfMonth
      *pre-defined*:NumDaysInMonth
      *pre-defined*:Weekend
      *pre-defined*:Month
      *pre-defined*:Quarter
      *custom*:in_semester
      =2017:jan:*:*:*:1:*:*:*:*/TRUE
      =2017:jan:*:*:*:2:*:*:*:*/TRUE
      =2017:jan:*:*:*:3:*:*:*:*/TRUE
      =2017:jan:*:*:*:4:*:*:*:*/TRUE
      =2017:jan:*:*:*:5:*:*:*:*/TRUE
      =2017:jan:*:*:*:6:*:*:*:*/TRUE
      =2017:jan:*:*:*:7:*:*:*:*/TRUE
      =2017:jan:*:*:*:8:*:*:*:*/TRUE
      =2017:jan:*:*:*:9:*:*:*:*/TRUE
      =2017:jan:*:*:*:10:*:*:*:*/TRUE
      =2017:jan:*:*:*:11:*:*:*:*/TRUE
      =2017:jan:*:*:*:12:*:*:*:*/TRUE
      =2017:jan:*:*:*:13:*:*:*:*/FALSE
      =2017:jan:*:*:*:14:*:*:*:*/FALSE
      =2017:jan:*:*:*:15:*:*:*:*/FALSE
      =2017:jan:*:*:*:16:*:*:*:*/FALSE
      ````

      手動建立這個文件不太容易,所以我才用程式來處理。

      刪除
    2. Sorry, 那個 Spreadsheet to ARFF 的介面跟您的講義不一樣, 沒看到Periodics那一部分. 可以繼續解疑嗎? 謝謝!

      刪除
    3. To Dalton,

      https://docs.google.com/presentation/d/1K_-dZEjIuM8ZH-nOcp4uOZEnH5uRnQJVrUz6Ov_FgvA/edit#slide=id.g27585d64c5_10_366
      在投影片第87頁「2. 試算表轉換ARFF」,右邊網頁往下捲就會看到一樣的內容。
      您也可以用文字編輯器開啟疊加變項看看裡面的內容。

      如果您只看投影片的話,那我會建議您實際操作看看。
      操作有問題再提問。

      刪除
    4. 老師, 因為無法貼圖. "Weka Spreadsheet to ARFF"裡面的下載疊加變項真的是沒看到.

      刪除
    5. To Dalton,

      嗯...

      疊加資料:以除了「date」、「timestamp」、「skip」、「target」之外的任意名稱命名,例如我用「in_semster」來表示是否是在學期中。資料格式必須是類別變項(nominal),也可以是「true」跟「false」這種二元變項,但是Weka在預測的時候會將之視為類別變項。

      你的資料有「in_semster」這個欄位嗎?

      請看看這個檔案,跟這個檔案對應的投影片章節:
      Part 4-2. 1月到8月→預測9月到館人數:CSV輸入資料 (Google試算表)
      https://docs.google.com/spreadsheets/d/1862Jwj-Zkw43o34RhTxcQWx2F18h3WdvRdDlA8bX3Vg/edit?usp=sharing

      刪除