概要
とある電力データを分析を行う際、「AR,MA,ARIMA,SARIMAモデルを用いて電力需要を予測してほしい。」と依頼がありました。
初Pythonで初予測手法だったので、パラメータを総当たりで探すことにしました。
パラメータは、order=(p,d,q)とseasonal_order=(p,d,q)で、aicが最小のパラメータを採用することにしました。
ソース
stackoverflowで見つけたものをいじって組み込みました。ソースを拾ったときにはsが12となっていました。月次データだったのかな?
今回は、1ヵ月の学習データで1週間の電力データを予測するため、sが24で最小のaicになりました。
なぜだろう・・・
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels
import time
p = d = q = range(0,3)
import itertools
pdq = list(itertools.product(p, d, q))
seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
y=TargetData
minaic = 999999
minparam = 0
starttime = time.time()
for param in pdq:
for param_seasonal in seasonal_pdq:
try:
print('fitting開始')
mod = sm.tsa.statespace.SARIMAX(y,
order=param,
seasonal_order=param_seasonal,
enforce_stationarity=False,
enforce_invertibility=False)
results = mod.fit()
print('ARIMA{}x{}12 - AIC:{}'.format(param, param_seasonal, results.aic))
if minaic > results.aic:
minaic = results.aic
minparam = param
minparams = param_seasonal
print('aic最小値{} - aic最小値のp,d,q{} - aic最小値のp,d,q,s{}'.format(minaic, minparam,minparams))
except:
continue
duration = time.time() -starttime
print('p,d,qの推定終了\n計測時間:{}'.format(duration))
f = open('results_param(SARIMA).txt','w')
f.write('aic最小値{} - aic最小値のp,d,q{} - aic最小値のp,d,q,s{}'.format(minaic, minparam,minparams))
f.close()
課題
- 力業で最適化できたかどうかわからない
- 最適かどうかの評価要
- 力業のため速度が劇的に遅いため、速度改善