如何合并多列训练的ARIMA模型并用于测试集预测?
多列时间序列ARIMA模型训练与预测问题解决
问题描述
我有一个包含100行、1000+列的时间序列DataFrame,各列相互独立。我需要为每一列训练ARIMA模型,但当前代码在循环训练时,模型会被不断覆盖,最终仅保留最后一列的训练模型,用它做测试集预测导致过拟合。希望能保存所有训练好的模型,并基于这些模型完成测试集预测。
示例DataFrame
date Col 1 Col 2 Col 3 Col 4 2001-07-21 10:00:00+05:00 45 51 31 3 2001-07-21 10:15:00+05:00 46 50 32 3 2001-07-21 10:30:00+05:00 47 51 34 7 2001-07-21 10:45:00+05:00 50 50 33 9 2001-07-21 11:00:00+05:00 55 51 32 8 2001-07-21 11:15:00+05:00 52 73 34 11 2001-07-21 11:30:00+05:00 51 72 30 14
原代码问题
原代码中循环训练时,每次都将model变量覆盖为当前列的模型,最终仅保留最后一列的训练结果,导致预测仅依赖该模型:
# training set inclues all columns except the last and test set includes only last column. train = df.iloc[:, :-1] test = df.iloc[:,-1:] order = (1,2,3) # <- plug-in p, d, q here for col in train.columns: model = ARIMA(train[col], order = order) #training every column in training set model = model.fit() model.summary() predictions = model.predict(len(test))
解决方法
1. 修正数据集拆分方式(时间序列专用)
时间序列不能按列拆分训练集和测试集,应按时间轴划分(比如取前80%数据训练,后20%测试):
import pandas as pd from statsmodels.tsa.arima.model import ARIMA # 按时间划分训练集和测试集 train_size = int(len(df) * 0.8) train = df.iloc[:train_size, :] test = df.iloc[train_size:, :]
2. 存储所有训练好的模型
用字典存储每列对应的ARIMA模型,键为列名,值为训练完成的模型:
order = (1, 2, 3) models = {} # 遍历所有列训练模型 for col in df.columns: arima_model = ARIMA(train[col], order=order) models[col] = arima_model.fit() # 可查看任意列的模型摘要 # models['Col 1'].summary()
3. 基于所有模型生成测试集预测
遍历测试集的每一列,用对应模型生成预测结果,合并为完整的预测DataFrame:
predictions = pd.DataFrame(index=test.index) for col in test.columns: # 生成对应列的测试集预测,typ='levels'保证输出原始尺度值 pred = models[col].predict( start=len(train), end=len(train) + len(test) - 1, typ='levels' ) predictions[col] = pred # 查看预测结果 print(predictions)
说明
- 由于各列相互独立,无需合并模型本身,只需分别存储每个列的模型,再分别预测后合并结果即可。
- 原代码的过拟合问题源于仅用单一列的模型预测,现在每个测试列都用对应训练列的模型预测,结果更合理。
内容的提问来源于stack exchange,提问作者Newlearner
相关产品推荐
相关产品推荐

