1. 程式人生 > >時間序列--ARIMA(尋找最優引數

時間序列--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/