auto.arima()等价于python

2024-04-27 14:28:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用ARMA模型来预测周销售额。我在statsmodels中找不到用于调整顺序(p,d,q)的函数。目前R有一个函数forecast::auto.arima(),它将调整(p,d,q)参数。

如何为我的型号选择正确的订单?python中是否有用于此目的的库?


Tags: 函数订单模型目的auto参数顺序型号
3条回答

我编写这些实用函数是为了直接计算pdq值 get_PDQ_parallel需要三个输入数据,这些数据是以时间戳(datetime)为索引的序列。n_作业将提供并行处理器的数量。输出将是索引中aic和bic值为order=(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']) 

您可以实现多种方法:

  1. ^{}包括aicbic。根据它们的定义(参见herehere),这些标准会惩罚模型中参数的数量。所以你可以用这些数字来比较模型。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

  2. 您可以从ARIMAResults获得pvalues。因此,当模型的阶数在整个维数上增加时,对于增加的参数,得到的p值最小,这样一种步进算法易于实现。

  3. 使用^{}交叉验证替代模型。最好的方法是将时间序列的尾部(比如最近5%的数据)保留在样本之外,并使用这些点获得拟合模型的检验误差

相关问题 更多 >