概要
- 基本的には既存の(s)ARIMAモデルでデータを予測
- オプションとして30分に1度学習範囲をシフトさせてモデルを再構築し、再予測
- とある実績データを用いて予測精度を確認
条件
項目 | 内容 |
---|---|
時系列データ | 30分周期の計測データ |
予測期間 | 2day(30min更新) / 2day |
学習期間 | 3day / 1week / 1month / 1Q |
モデル評価指標 | aic |
予測値評価指標 | RMSE |
- データ
- 平日では下記のような傾向が見られる。
- 1日のデータ推移
- 季節によって上下にシフト
- 夜間少なく昼間に多いデータ
- 6時に急激に増え、18時に急激に減る
- 11時、14時頃に急激に少なくなる
- 平日では下記のような傾向が見られる。
検証
このあたりで作成した、力業でp,d,qの準最適なパラメータを求める。
予測期間2day(1hour更新)の場合
- 特殊条件
- 30分ごとに学習期間を30分シフトさせモデル構築
- ハイパーパラメータの更新の有無で分岐
30分毎に学習時間をシフトさせて、モデルを更新する関数
下記の関数で、ぐるぐる回して最新の値だけDataframeにする。
本当に意味があるのだろうか?
TrainSARIMA
def TrainSarima(df,Start,End,Order,SOrder,ShiftM = 0):
TrainResultsSARIMA = sm.tsa.statespace.SARIMAX(df.loc[pd.to_datetime(Start) + ShiftM:pd.to_datetime(End) + ShiftM- pd.offsets.Hour(1)],
enforce_stationarity=False,
enforce_invertibility=False,
order=Order,
seasonal_order=SOrder
).fit()
TrainResultsSARIMA.aic
return TrainResultsSARIMA
ForecastSARIMA=[]
PredictTerm = 48
# Fitting
for Minute in np.arange(0,PredictTerm * 2,30):
# for Minute in np.arange(0,PredictTerm * 30,30):
FitSARIMA = TrainSarima(S_MinamiDF,TrainStartDate,TrainEndDate,SARIMAorder,SARIMAORDER,Shift_minute(Minute))
ForecastSARIMA = ForecastSARIMA.append(pd.DataFrame(FitSARIMA.predict(SARIMAEndDate - pd.offsets.Minute(60),SARIMAEndDate + pd.offsets.Day(1) + Shift_minute(Minute)).iloc[-1:]))
以上のプログラムから算出される予測値と実績データを使用して精度の評価をした結果を下記に示す。
なお、今回は1日分のデータを使用する。
項目 | 内容 |
---|---|
RMSE(学習:1month) | 8.762% |
予測期間2day先の場合(検証中)
- 特殊条件
- なし
先程のTrainSARIMA
のコードを改良して、ループさせずに1回で2day先までのデータを予測させる。
結果は下記のようになる。なお、この結果も1日分のデータを使用した。
項目 | 内容 |
---|---|
RMSE |
まとめ
- 30min毎に更新をかけて意味があるか検証要
- そもそも周期性が見られるデータを簡易に予測するのにSARIMAモデルが妥当かどうかの検証が必要