时间序列--ARIMA(寻找最优参数

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/

猜你喜欢

转载自blog.csdn.net/kylin_learn/article/details/85305891