pmdarima.auto_arima中start_p与start_q参数设置未生效问题咨询
关于pmdarima auto_arima中start_p/start_q参数未生效的问题
问题场景
使用pmdarima的auto_arima方法寻找ARIMA最优参数时,期望p和q从1开始(而非默认0),最大值设为3,因此设置了start_p=1、start_q=1,但测试结果中仍出现了p=0或q=0的模型,怀疑参数未生效。
复现代码
import pandas as pd import numpy as np import pmdarima as pm from statsmodels.tsa.arima.model import ARIMA # 生成日期序列 dates = pd.date_range(start='2021-01-31', periods=16, freq='M') # 生成随机数据 data = np.random.rand(16) # 创建DataFrame df = pd.DataFrame(data, index=dates, columns=['Value']) pm.auto_arima(df['Value'], start_p=1, start_q=1, test='adf', max_p=3, max_q=3, seasonal=False, d=1, max_d=3, trace=True, error_action='ignore', suppress_warnings=True, stepwise=False)
输出结果
ARIMA(0,1,0)(0,0,0)[0] intercept : AIC=18.978, Time=0.01 sec ARIMA(0,1,1)(0,0,0)[0] intercept : AIC=inf, Time=0.02 sec ARIMA(0,1,2)(0,0,0)[0] intercept : AIC=inf, Time=0.02 sec ARIMA(0,1,3)(0,0,0)[0] intercept : AIC=inf, Time=0.02 sec ARIMA(1,1,0)(0,0,0)[0] intercept : AIC=17.548, Time=0.01 sec ARIMA(1,1,1)(0,0,0)[0] intercept : AIC=inf, Time=0.02 sec ARIMA(1,1,2)(0,0,0)[0] intercept : AIC=inf, Time=0.03 sec ARIMA(1,1,3)(0,0,0)[0] intercept : AIC=inf, Time=0.04 sec ARIMA(2,1,0)(0,0,0)[0] intercept : AIC=18.669, Time=0.01 sec ARIMA(2,1,1)(0,0,0)[0] intercept : AIC=inf, Time=0.04 sec ARIMA(2,1,2)(0,0,0)[0] intercept : AIC=inf, Time=0.03 sec ARIMA(2,1,3)(0,0,0)[0] intercept : AIC=inf, Time=0.04 sec ARIMA(3,1,0)(0,0,0)[0] intercept : AIC=20.073, Time=0.01 sec ARIMA(3,1,1)(0,0,0)[0] intercept : AIC=inf, Time=0.03 sec ARIMA(3,1,2)(0,0,0)[0] intercept : AIC=inf, Time=0.04 sec Best model: ARIMA(1,1,0)(0,0,0)[0] intercept Total fit time: 0.362 seconds Out[13]: ARIMA(order=(1, 1, 0), scoring_args={}, suppress_warnings=True)
原因分析
当设置stepwise=False时,auto_arima会启用暴力搜索模式,遍历所有可能的p、q组合。此时start_p和start_q参数会被忽略,搜索范围自动变为从0到max_p/max_q的所有整数,因此会出现p=0或q=0的模型。
解决办法
方法1:使用默认的逐步搜索模式
移除stepwise=False参数(默认就是stepwise=True),此时start_p和start_q参数会生效,搜索会从指定的起始值开始,通过逐步筛选的方式寻找最优模型,不会遍历0值的情况。
修改后的调用代码:
pm.auto_arima(df['Value'], start_p=1, start_q=1, test='adf', max_p=3, max_q=3, seasonal=False, d=1, max_d=3, trace=True, error_action='ignore', suppress_warnings=True)
方法2:暴力搜索时手动指定参数范围
如果必须使用暴力搜索,可以手动生成所有符合要求的p、q组合(p从1到3,q从1到3),逐个拟合模型并比较AIC值来选出最优模型:
import itertools from statsmodels.tsa.arima.model import ARIMA # 指定p和q的范围 p_options = range(1, 4) q_options = range(1, 4) best_aic = float('inf') best_order = None # 遍历所有组合 for p, q in itertools.product(p_options, q_options): try: model = ARIMA(df['Value'], order=(p, 1, q)) result = model.fit() # 更新最优模型 if result.aic < best_aic: best_aic = result.aic best_order = (p, 1, q) except Exception as e: continue print(f"最优模型参数: {best_order}, 对应AIC值: {best_aic:.3f}")
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

