Auto ARIMA处理多时间序列遇ValueError,求解决及批量建模方案
问题背景
我有一个109行96列的时间序列DataFrame,尝试循环每列运行Auto ARIMA获取模型参数时,出现如下报错:
ValueError: Encountered exception in stationarity test ('adf'). This can occur in seasonal settings when a large enough
mcoupled with a large enoughDdifference the training array into too few samples for OLS (input contains 109 samples). Try fitting on a larger training size (raised from LinAlgError: Singular matrix)
使用的代码如下:
series = df_main_scaled.columns for col in series: print("Auto Arima for : ",{col}) model = pm.auto_arima(df[col], start_p=1, start_q=1, test='adf', max_p=4, max_q=4, m=1, d=None, trace=True, error_action='ignore', suppress_warnings=True, stepwise=True) print(model.aic()) model.summary()
疑问:
- 改为基于序列而非DataFrame建模是否可行?
- 若可行,如何基于全部数据而非逐列建模?
问题解答
1. 基于序列而非DataFrame建模的可行性
完全可行。pm.auto_arima(pmdarima库的方法)本身就是为单变量时间序列设计的,你之前的循环逐列操作,本质就是把DataFrame的每一列当作独立序列来建模,两者逻辑一致,不存在技术障碍。
2. 基于全部数据而非逐列建模的实现
这里的“基于全部数据”指多变量时间序列建模,但pm.auto_arima仅支持单变量ARIMA模型。如果要同时利用所有列的信息建模,有两种可行思路:
思路一:单变量模型结合外部协变量
如果有明确的目标列,其他列作为辅助输入(外部协变量),可以通过pm.auto_arima的exogenous参数传入其余列数据,示例代码:
# 假设第1列是目标变量,剩余列为协变量 target_series = df_main_scaled.iloc[:, 0] exogenous_vars = df_main_scaled.iloc[:, 1:] model = pm.auto_arima(target_series, exogenous=exogenous_vars, start_p=1, start_q=1, test='adf', max_p=4, max_q=4, m=1, d=None, trace=True, error_action='ignore', suppress_warnings=True, stepwise=True)
这种方式以单变量预测为核心,其他变量作为补充信息,适合有明确预测目标的场景。
思路二:使用多变量时间序列模型
如果需要同时分析所有变量的相互滞后关系,可以用VAR(向量自回归)模型,示例代码(基于statsmodels库):
import statsmodels.api as sm from statsmodels.tsa.vector_ar.var_model import VAR # VAR模型要求数据平稳,可先做ADF检验或差分处理 model = VAR(df_main_scaled) # 自动选择最优滞后阶数 lag_order = model.select_order(maxlags=4) print(lag_order.summary()) # 拟合模型 var_model = model.fit(lag_order.selected_orders['aic']) # 查看模型结果 print(var_model.summary())
VAR模型会同时建模所有变量的滞后关联,适合无单一目标、需要分析变量间相互影响的场景。
原报错的额外解决建议
原报错是因为ADF检验时,自动差分后的样本量过少导致OLS矩阵奇异,可尝试:
- 手动指定
d值(如d=0或d=1),跳过自动ADF检验,避免过度差分; - 减小
max_p/max_q的取值,降低模型复杂度,减少计算所需样本量; - 若业务允许,补充更多时间序列样本数据。
内容的提问来源于stack exchange,提问作者A Newbie

