python - 确定 ARIMA 中网格搜索的参数范围 (p,d,q)
问题描述
我正在尝试用 Python 为房屋做一个月度价格预测模型。我现在正在使用网格搜索配置超参数。根据附加的 ACF/PACF,p/d/q_values 的范围应该是多少?
实例为 299 个月。我目前正在测试 p(0;13)、d(0;4)、q(0;13)。但它永远需要
# evaluate an ARIMA model for a given order (p,d,q) and return RMSE
def evaluate_arima_model(X, arima_order):
# prepare training dataset
X = X.astype('float32')
train_size = int(len(X) * 0.50)
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()
yhat = model_fit.forecast()[0]
predictions.append(yhat)
history.append(test[t])
# calculate out of sample error
rmse = np.sqrt(mean_squared_error(test, predictions))
return rmse
# 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:
rmse = evaluate_arima_model(dataset, order)
if rmse < best_score:
best_score, best_cfg = rmse, order
print('ARIMA%s RMSE=%.3f' % (order,rmse))
except:
continue
print('Best ARIMA%s RMSE=%.3f' % (best_cfg, best_score))
# evaluate parameters
p_values = range(0,13)
d_values = range(0, 4)
q_values = range(0, 13)
warnings.filterwarnings("ignore")
evaluate_models(df.values, p_values, d_values, q_values)
解决方案
高阶 ARIMA 模型将永远进行计算并且有过度拟合的趋势。它们的总和不应超过 10 (p + d + q <= 10)。我不建议使用 GridSearch,你最好使用auto_arima()
fom 之类的函数pmdarima
:
https://alkaline-ml.com/pmdarima/modules/generated/pmdarima.arima.auto_arima.html https://towardsdatascience.com/time-series-forecasting-using-auto-arima-in-python-bb83e49210cd
如果您想使用 ACF/PACF 估算订单,可以在此处进行操作: https ://people.duke.edu/~rnau/411arim3.htm
如果 ACF 正在下降并且 PACF 在滞后后急剧下降,则将此滞后用作 AR 分量 (p)。如果 PACF 正在下降并且 ACF 在滞后后急剧下降,则将此滞后用作 MA 分量 (q)。差分组件 (d) 取决于您的数据是否静止,您可以使用 ADF 测试进行检查: https ://www.statsmodels.org/stable/generated/statsmodels.tsa.stattools.adfuller.html https: //machinelearningmastery.com/time-series-data-stationary-python/
在您的情况下,您可能需要类似ARIMA(3, d, 3)
但最好使用auto_arima()
.
推荐阅读
- c# - Google 身份验证 Android 应用和 C# 后端
- objective-c - 使用 LSSharedFileListInsertItemURL 在 ObjC 中重新排序 Finder 最喜欢的项目会引发异常
- php - Google Drive Api V3 - 如何获取存储配额
- json - Pentaho DI - JSON 嵌套文件输出
- javascript - 是否可以识别节点中哪些客户端/服务器 TCP 套接字相互连接?
- docker - 如何将大量文件挂载到远程 docker 守护进程?
- spring-boot - 带有 Spring boot 和 eureka 的 Resttemplate
- php - 减少一级数组并获得类似 laravel paginate 的响应
- sql - SQL JOINS详解
- c - 如何将数组指针作为参数传递给函数