python的auto.arima()等价物
我试图用ARMA-ARIMA模型预测每周销售额。我在python的auto.arima()等价物,python,r,time-series,statsmodels,forecasting,Python,R,Time Series,Statsmodels,Forecasting,我试图用ARMA-ARIMA模型预测每周销售额。我在statsmodels中找不到用于调整顺序(p、d、q)的函数。目前R有一个函数forecast::auto.arima(),它将调整(p,d,q)参数 如何为我的型号选择正确的订单?python中是否有用于此目的的库?您可以实现多种方法: 包括aic和bic。根据它们的定义,(请参见和),这些标准会对模型中的参数数量进行惩罚。因此,您可以使用这些数字来比较模型。此外,scipy还具有对指定参数空间进行网格搜索的功能。因此,这样的工作流应该可以
statsmodels
中找不到用于调整顺序(p、d、q)的函数。目前R有一个函数forecast::auto.arima()
,它将调整(p,d,q)参数
如何为我的型号选择正确的订单?python中是否有用于此目的的库?您可以实现多种方法:
aic
和bic
。根据它们的定义,(请参见和),这些标准会对模型中的参数数量进行惩罚。因此,您可以使用这些数字来比较模型。此外,scipy还具有对指定参数空间进行网格搜索的功能。因此,这样的工作流应该可以工作:
def objfunc(order, exog, endog):
from statsmodels.tsa.arima_model import ARIMA
fit = ARIMA(endog, order, exog).fit()
return fit.aic()
from scipy.optimize import brute
grid = (slice(1, 3, 1), slice(1, 3, 1), slice(1, 3, 1))
brute(objfunc, grid, args=(exog, endog), finish=None)
确保使用finish=None
调用brute
ARIMAResults
获取pvalues
。因此,一种阶跃算法很容易实现,其中模型的阶数在整个维度上增加,从而为添加的参数获得最低的p值def objfunc(order,*params ):
from statsmodels.tsa.arima_model import ARIMA
p,d,q = order
fit = ARIMA(endog, order, exog).fit()
return fit.aic()
from scipy.optimize import brute
grid = (slice(1, 3, 1), slice(1, 3, 1), slice(1, 3, 1))
brute(objfunc, grid, args=params, finish=None)
我编写了这些实用函数来直接计算pdq值 get_PDQ_parallel需要三个以时间戳(datetime)为索引的串行输入数据。n_作业将提供多个并行处理器。输出将是数据帧,aic和bic值在索引中的顺序=(P,D,Q) p和q范围为[0,12],而d范围为[0,1]
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'])
可能的解决办法
df=pd.read_csv("http://vincentarelbundock.github.io/Rdatasets/csv/datasets/AirPassengers.csv")
# Define the p, d and q parameters to take any value between 0 and 2
p = d = q = range(0, 2)
print(p)
import itertools
import warnings
# Generate all different combinations of p, q and q triplets
pdq = list(itertools.product(p, d, q))
print(pdq)
# Generate all different combinations of seasonal p, q and q triplets
seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]
print('Examples of parameter combinations for Seasonal ARIMA...')
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1]))
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))
Examples of parameter combinations for Seasonal ARIMA...
SARIMAX: (0, 0, 1) x (0, 0, 1, 12)
SARIMAX: (0, 0, 1) x (0, 1, 0, 12)
SARIMAX: (0, 1, 0) x (0, 1, 1, 12)
SARIMAX: (0, 1, 0) x (1, 0, 0, 12)
y=df
#warnings.filterwarnings("ignore") # specify to ignore warning messages
for param in pdq:
for param_seasonal in seasonal_pdq:
try:
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))
except:
continue
ARIMA(0, 0, 0)x(0, 0, 1, 12)12 - AIC:3618.0303991426763
ARIMA(0, 0, 0)x(0, 1, 1, 12)12 - AIC:2824.7439963684233
ARIMA(0, 0, 0)x(1, 0, 0, 12)12 - AIC:2942.2733127230185
ARIMA(0, 0, 0)x(1, 0, 1, 12)12 - AIC:2922.178151133141
ARIMA(0, 0, 0)x(1, 1, 0, 12)12 - AIC:2767.105066400224
ARIMA(0, 0, 0)x(1, 1, 1, 12)12 - AIC:2691.233398643673
ARIMA(0, 0, 1)x(0, 0, 0, 12)12 - AIC:3890.816777796087
ARIMA(0, 0, 1)x(0, 0, 1, 12)12 - AIC:3541.1171286722
ARIMA(0, 0, 1)x(0, 1, 0, 12)12 - AIC:3028.8377323188824
ARIMA(0, 0, 1)x(0, 1, 1, 12)12 - AIC:2746.77973129136
ARIMA(0, 0, 1)x(1, 0, 0, 12)12 - AIC:3583.523640623017
ARIMA(0, 0, 1)x(1, 0, 1, 12)12 - AIC:3531.2937768990187
ARIMA(0, 0, 1)x(1, 1, 0, 12)12 - AIC:2781.198675746594
ARIMA(0, 0, 1)x(1, 1, 1, 12)12 - AIC:2720.7023088205974
ARIMA(0, 1, 0)x(0, 0, 1, 12)12 - AIC:3029.089945668332
ARIMA(0, 1, 0)x(0, 1, 1, 12)12 - AIC:2568.2832251221016
ARIMA(0, 1, 0)x(1, 0, 0, 12)12 - AIC:2841.315781459511
ARIMA(0, 1, 0)x(1, 0, 1, 12)12 - AIC:2815.4011044132576
ARIMA(0, 1, 0)x(1, 1, 0, 12)12 - AIC:2588.533386513587
ARIMA(0, 1, 0)x(1, 1, 1, 12)12 - AIC:2569.9453272483315
ARIMA(0, 1, 1)x(0, 0, 0, 12)12 - AIC:3327.5177587522303
ARIMA(0, 1, 1)x(0, 0, 1, 12)12 - AIC:2984.716706112334
ARIMA(0, 1, 1)x(0, 1, 0, 12)12 - AIC:2789.128542154043
ARIMA(0, 1, 1)x(0, 1, 1, 12)12 - AIC:2537.0293659293943
ARIMA(0, 1, 1)x(1, 0, 0, 12)12 - AIC:2984.4555708516436
ARIMA(0, 1, 1)x(1, 0, 1, 12)12 - AIC:2939.460958374472
ARIMA(0, 1, 1)x(1, 1, 0, 12)12 - AIC:2578.7862352774437
ARIMA(0, 1, 1)x(1, 1, 1, 12)12 - AIC:2537.771484229265
ARIMA(1, 0, 0)x(0, 0, 0, 12)12 - AIC:3391.5248913820797
ARIMA(1, 0, 0)x(0, 0, 1, 12)12 - AIC:3038.142074281268
C:\Users\Dell\Anaconda3\lib\site-packages\statsmodels\base\model.py:496: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals
"Check mle_retvals", ConvergenceWarning)
ARIMA(1, 0, 0)x(0, 1, 0, 12)12 - AIC:2839.809192263449
ARIMA(1, 0, 0)x(0, 1, 1, 12)12 - AIC:2588.50367175184
ARIMA(1, 0, 0)x(1, 0, 0, 12)12 - AIC:2993.4630440139595
ARIMA(1, 0, 0)x(1, 0, 1, 12)12 - AIC:2995.049216326931
ARIMA(1, 0, 0)x(1, 1, 0, 12)12 - AIC:2588.2463284315304
ARIMA(1, 0, 0)x(1, 1, 1, 12)12 - AIC:2592.80110502723
ARIMA(1, 0, 1)x(0, 0, 0, 12)12 - AIC:3352.0350133621478
ARIMA(1, 0, 1)x(0, 0, 1, 12)12 - AIC:3006.5493366627807
ARIMA(1, 0, 1)x(0, 1, 0, 12)12 - AIC:2810.6423724894516
ARIMA(1, 0, 1)x(0, 1, 1, 12)12 - AIC:2559.584031948852
ARIMA(1, 0, 1)x(1, 0, 0, 12)12 - AIC:2981.2250436794675
ARIMA(1, 0, 1)x(1, 0, 1, 12)12 - AIC:2959.3142304724834
ARIMA(1, 0, 1)x(1, 1, 0, 12)12 - AIC:2579.8245645892207
ARIMA(1, 0, 1)x(1, 1, 1, 12)12 - AIC:2563.13922589258
ARIMA(1, 1, 0)x(0, 0, 0, 12)12 - AIC:3354.7462930846423
ARIMA(1, 1, 0)x(0, 0, 1, 12)12 - AIC:3006.702997636003
ARIMA(1, 1, 0)x(0, 1, 0, 12)12 - AIC:2809.3844175191666
ARIMA(1, 1, 0)x(0, 1, 1, 12)12 - AIC:2558.484602766447
ARIMA(1, 1, 0)x(1, 0, 0, 12)12 - AIC:2959.885810636943
ARIMA(1, 1, 0)x(1, 0, 1, 12)12 - AIC:2960.712709764296
ARIMA(1, 1, 0)x(1, 1, 0, 12)12 - AIC:2557.945907092698
ARIMA(1, 1, 0)x(1, 1, 1, 12)12 - AIC:2559.274166458508
ARIMA(1, 1, 1)x(0, 0, 0, 12)12 - AIC:3326.3285511700374
ARIMA(1, 1, 1)x(0, 0, 1, 12)12 - AIC:2985.868532151721
ARIMA(1, 1, 1)x(0, 1, 0, 12)12 - AIC:2790.7677149967103
ARIMA(1, 1, 1)x(0, 1, 1, 12)12 - AIC:2538.820635541546
ARIMA(1, 1, 1)x(1, 0, 0, 12)12 - AIC:2963.2789505804294
ARIMA(1, 1, 1)x(1, 0, 1, 12)12 - AIC:2941.2436984747465
ARIMA(1, 1, 1)x(1, 1, 0, 12)12 - AIC:2559.8258191422606
ARIMA(1, 1, 1)x(1, 1, 1, 12)12 - AIC:2539.712354465328
从
另请参见现在有一个合适的python包来执行自动arima 文件: 示例用法:
def evaluate_arima_模型(X,arima_顺序):
#准备培训数据集
列车尺寸=整数(长度(X)*0.90)
列车,测试=X[0:列车尺寸],X[列车尺寸:]
历史=[x代表列车中的x]
#预测
预测=列表()
对于范围内的t(len(测试)):
模型=ARIMA(历史,顺序=ARIMA_顺序)
模型拟合=模型拟合(disp=0)
yhat=model_fit.forecast()[0]
预测。追加(yhat)
history.append(测试[t])
#计算样本外误差
误差=均方误差(测试、预测)
返回错误
#评估ARIMA模型的p、d和q值组合
def评估_模型(数据集、p_值、d_值、q_值):
dataset=dataset.astype('float32')
最佳分数,最佳cfg=浮动(“inf”),无
对于p_值中的p:
对于d in d_值:
对于q_值中的q:
顺序=(p,d,q)
尝试:
mse=评估arima模型(数据集,顺序)
如果mse<最佳分数:
最佳分数,最佳cfg=mse,顺序
打印('ARIMA%s MSE=%.3f%'(顺序,MSE))
除:
持续
打印('Best ARIMA%s MSE=%.3f%'(Best\u cfg,Best\u分数))
#加载数据集
def解析器(x):
return datetime.strtime('190'+x',%Y-%m')
导入日期时间
p_值=[4,5,6,7,8]
d_值=[0,1,2]
q_值=[2,3,4,5,6]
警告。过滤器警告(“忽略”)
评估_模型(训练、p_值、d_值、q_值)
这将为您提供p、d、q值,然后使用ARIMA模型的值。从现在起,我们可以直接使用PyPI的软件包。在conda中,使用
conda安装-c saravji pmdarima
进行安装
用户saravji
已将其放入蟒蛇云中
然后用,
from pmdarima.arima import auto_arima
(请注意,名称
金字塔arima
已更改为pmdarima
)。master中已经有一个包装函数为您执行此操作。这是我们现在最接近auto.arima的地方了。@jseabold您知道源代码,但名称表明它是arma而不是arimaYes,它只用于订单选择。现在还没有任何自动的集成检查。两年后很难回答这个问题,但是在代码示例的最后一行中exog和endog会有什么值呢?他们贡献了什么?不要紧,对于那些同样对此感到困惑的人来说,exog/endog是数据拟合的结果。Brute会自动使用其第二个参数作为函数的第一个参数,然后按其列出的顺序使用其他参数。虽然此代码段可以解决此问题,但确实有助于提高文章的质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满你的代码,这会降低代码和解释的可读性!可以在这里查阅库文档:仅供参考,python auto arima已经移到了pmdarima,因此它可能不会与另一个更受欢迎的库发生冲突,使用相同名称的Old thread,但这可能不是选择d的最佳方式。传统上,这是通过使用单位根测试(如KPSS测试)来完成的。
from pmdarima.arima import auto_arima