1.评估ARIMA模型
分为训练集合测试集,在测试集上比较预测值和真实值的mse
注意:因为ARIMA只能预测一步,所以多一步预测,我们要滚动着来,建立了很多同参数的ARIMA模型,这体现在代码的history.append()
# evaluate an ARIMA model for a given order (p,d,q)
def evaluate_arima_model(X, arima_order):
# prepare training dataset
train_size = int(len(X) * 0.66)
train, test = X[0:train_size], X[train_size:]
history = [x for x in train]
# make predictions
predictions = list()
for t in range(len(test)):
model = ARIMA(history, order=arima_order)
model_fit = model.fit(disp=0)
yhat = model_fit.forecast()[0]
predictions.append(yhat)
history.append(test[t])
# calculate out of sample error
error = mean_squared_error(test, predictions)
return error
2.找最优参数
用户必须指定一个包含p、d和q ARIMA参数的网格来迭代。
通过调用上一节中描述的evaluate_arima_model()函数,为每个参数及其性能评估创建一个模型。该函数必须跟踪观察到的最低错误分数以及导致错误的配置。这可以在函数结束时总结出来,用标准打印出来。
我们可以将这个称为evaluate_models()的函数实现为四个循环。
还有两个需要考虑的问题。第一个是确保输入数据是浮点值(与整数或字符串相反),因为这会导致ARIMA过程失败。其次,statsmodels ARIMA程序内部使用数值优化程序为模型找到一组系数。这些过程可能会失败,从而引发异常。我们必须捕获这些异常并跳过那些导致问题的配置。这种情况发生的频率比你想象的要高。
此外,建议忽略此代码的警告,以避免在运行过程中产生大量噪音。这可以做到以下几点:
import warnings
warnings.filterwarnings("ignore")
# evaluate combinations of p, d and q values for an ARIMA model
def evaluate_models(dataset, p_values, d_values, q_values):
dataset = dataset.astype('float32')
best_score, best_cfg = float("inf"), None
for p in p_values:
for d in d_values:
for q in q_values:
order = (p,d,q)
try:
mse = evaluate_arima_model(dataset, order)
if mse < best_score:
best_score, best_cfg = mse, order
print('ARIMA%s MSE=%.3f' % (order,mse))
except:
continue
print('Best ARIMA%s MSE=%.3f' % (best_cfg, best_score))
举个例子:
import warnings
from pandas import read_csv
from pandas import datetime
from statsmodels.tsa.arima_model import ARIMA
from sklearn.metrics import mean_squared_error
# evaluate an ARIMA model for a given order (p,d,q)
def evaluate_arima_model(X, arima_order):
# prepare training dataset
train_size = int(len(X) * 0.66)
train, test = X[0:train_size], X[train_size:]
history = [x for x in train]
# make predictions
predictions = list()
for t in range(len(test)):
model = ARIMA(history, order=arima_order)
model_fit = model.fit(disp=0)
yhat = model_fit.forecast()[0]
predictions.append(yhat)
history.append(test[t])
# calculate out of sample error
error = mean_squared_error(test, predictions)
return error
# evaluate combinations of p, d and q values for an ARIMA model
def evaluate_models(dataset, p_values, d_values, q_values):
dataset = dataset.astype('float32')
best_score, best_cfg = float("inf"), None
for p in p_values:
for d in d_values:
for q in q_values:
order = (p,d,q)
try:
mse = evaluate_arima_model(dataset, order)
if mse < best_score:
best_score, best_cfg = mse, order
print('ARIMA%s MSE=%.3f' % (order,mse))
except:
continue
print('Best ARIMA%s MSE=%.3f' % (best_cfg, best_score))
# load dataset
def parser(x):
return datetime.strptime('190'+x, '%Y-%m')
series = read_csv('shampoo-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser)
# evaluate parameters
p_values = [0, 1, 2, 4, 6, 8, 10]
d_values = range(0, 3)
q_values = range(0, 3)
warnings.filterwarnings("ignore")
evaluate_models(series.values, p_values, d_values, q_values)
打印出来结果如下:
ARIMA(0, 0, 0) MSE=52425.268
ARIMA(0, 0, 1) MSE=38145.167
ARIMA(0, 0, 2) MSE=23989.567
ARIMA(0, 1, 0) MSE=18003.173
ARIMA(0, 1, 1) MSE=9558.410
ARIMA(0, 2, 0) MSE=67339.808
ARIMA(0, 2, 1) MSE=18323.163
ARIMA(1, 0, 0) MSE=23112.958
ARIMA(1, 1, 0) MSE=7121.373
ARIMA(1, 1, 1) MSE=7003.683
ARIMA(1, 2, 0) MSE=18607.980
ARIMA(2, 1, 0) MSE=5689.932
ARIMA(2, 1, 1) MSE=7759.707
ARIMA(2, 2, 0) MSE=9860.948
ARIMA(4, 1, 0) MSE=6649.594
ARIMA(4, 1, 1) MSE=6796.279
ARIMA(4, 2, 0) MSE=7596.332
ARIMA(4, 2, 1) MSE=4694.873
ARIMA(6, 1, 0) MSE=6810.080
ARIMA(6, 2, 0) MSE=6261.107
ARIMA(8, 0, 0) MSE=7256.028
ARIMA(8, 1, 0) MSE=6579.403
Best ARIMA(4, 2, 1) MSE=4694.873
当然在做这些之前,你要有点先验知识:
1.种子网格。ACF和PACF图的经典诊断工具仍然可以用于搜索ARIMA参数网格的结果。
2.替代措施。搜索的目的是优化样本外平均平方误差。这可以更改为另一个样本外统计量,一个样本内统计量,如AIC或BIC,或两者的某种组合。您可以选择对项目最有意义的度量。
3.残留的诊断。统计数据可以自动计算的剩余预测误差,以提供一个额外的指示质量的适合。例如,统计检验残差的分布是否为高斯分布,残差是否存在自相关。更新模型。ARIMA模型是为每个一步预测从头创建的。通过仔细检查API,可以使用新的观察更新模型的内部数据,而不是从头重新创建它。
4.先决条件。ARIMA模型可以对时间序列数据集进行假设,如正态性和平稳性。可以检查这些数据集,并在训练给定模型之前对给定数据集发出警告。
https://machinelearningmastery.com/grid-search-arima-hyperparameters-with-python/