:::

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

9月 26, 2017 , 19 Comments Edit Copy Download 6722 Characters, 19 Images, 2 Embed Iframes

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. 回覆刪除
    回覆
    1. 回覆刪除
    2. 回覆刪除
    3. 回覆刪除
  2. 回覆刪除
  3. 回覆刪除
    回覆
    1. 回覆刪除
  4. 回覆刪除
  5. 回覆刪除
  6. 回覆刪除
    回覆
    1. 回覆刪除
    2. 回覆刪除
    3. 回覆刪除
    4. 回覆刪除
    5. 回覆刪除