import statsmodels
from statsmodels import api as sm
from sklearn.metrics import r2_score,mean_squared_error
from sklearn.utils import check_array
from functools import partial
from multiprocessing import Pool
def get_aic_bic(order,series):
aic=np.nan
bic=np.nan
#print(series.shape,order)
try:
arima_mod=statsmodels.tsa.arima_model.ARIMA(series,order=order,freq='H').fit(transparams=True,method='css')
aic=arima_mod.aic
bic=arima_mod.bic
print(order,aic,bic)
except:
pass
return aic,bic
def get_PDQ_parallel(data,n_jobs=7):
p_val=13
q_val=13
d_vals=2
pdq_vals=[ (p,d,q) for p in range(p_val) for d in range(d_vals) for q in range(q_val)]
get_aic_bic_partial=partial(get_aic_bic,series=data)
p = Pool(n_jobs)
res=p.map(get_aic_bic_partial, pdq_vals)
p.close()
return pd.DataFrame(res,index=pdq_vals,columns=['aic','bic'])
我编写这些实用函数是为了直接计算pdq值 get_PDQ_parallel需要三个输入数据,这些数据是以时间戳(datetime)为索引的序列。n_作业将提供并行处理器的数量。输出将是索引中aic和bic值为order=(P,D,Q)的数据帧 p和q的范围是[0,12],而d是[0,1]
您可以实现多种方法:
^{} 包括} 在指定的参数空间上进行网格搜索。所以这样的工作流应该可以工作:
aic
和bic
。根据它们的定义(参见here和here),这些标准会惩罚模型中参数的数量。所以你可以用这些数字来比较模型。scipy还有^{确保用
finish=None
调用brute
。您可以从
ARIMAResults
获得pvalues
。因此,当模型的阶数在整个维数上增加时,对于增加的参数,得到的p值最小,这样一种步进算法易于实现。使用^{} 交叉验证替代模型。最好的方法是将时间序列的尾部(比如最近5%的数据)保留在样本之外,并使用这些点获得拟合模型的检验误差。
现在有一个合适的python包来完成auto arima。https://github.com/tgsmith61591/pmdarima
文件: http://alkaline-ml.com/pmdarima
示例用法:https://github.com/tgsmith61591/pmdarima/blob/master/examples/quick_start_example.ipynb
相关问题 更多 >
编程相关推荐