如何为SARIMAX模型预测值绘制95%置信区间带
SARIMAX模型预测值95%置信区间带绘制方案
- 核心误区:直接调用
results.conf_int(alpha=0.05)返回的是模型拟合系数的置信区间(包含AR项、MA项、残差方差等参数的估计区间),并非预测值的置信区间,无法用于绘制预测带。
现有代码梳理
模型拟合代码
model=sm.tsa.statespace.SARIMAX(data_df['Net Sales'],order=(1, 1, 1),seasonal_order=(1,1,1,12)) results=model.fit() print(results.summary())
原有绘图代码
fig, ax = plt.subplots(figsize=(15,5)) ax.ticklabel_format(useOffset=False, style='plain') data_df['Net_Sales forecast'] = results.predict(start = 48, end = 60, dynamic= True) data_df[['Net Sales', 'Net_Sales forecast']].plot(ax=ax, color=['blue', 'orange'], marker='o', legend=True)
正确实现代码
需要改用get_prediction()方法生成带完整统计信息的预测对象,从中提取预测值对应的置信区间,再通过fill_between绘制半透明区间带:
fig, ax = plt.subplots(figsize=(15,5)) ax.ticklabel_format(useOffset=False, style='plain') # 生成包含置信区间信息的预测结果对象 pred_res = results.get_prediction(start=48, end=60, dynamic=True) # 提取95%置信区间,返回值第一列为区间下界,第二列为上界 pred_ci = pred_res.conf_int(alpha=0.05) # 提取预测均值 data_df['Net_Sales forecast'] = pred_res.predicted_mean # 绘制原始序列与预测序列 data_df[['Net Sales', 'Net_Sales forecast']].plot(ax=ax, color=['blue', 'orange'], marker='o', legend=True) # 绘制置信区间带 ax.fill_between( x=pred_ci.index, y1=pred_ci.iloc[:, 0], y2=pred_ci.iloc[:, 1], color='orange', alpha=0.2, label='95% 置信区间' ) ax.legend() plt.show()
关键参数说明
get_prediction():和仅返回预测值的predict()不同,该方法返回的结果对象包含预测均值、预测标准误、置信区间等全量预测统计信息fill_between():用于在两个y值之间填充色块,alpha=0.2设置色块透明度,避免遮挡底层折线- 若需要调整置信水平,修改
conf_int()的alpha参数即可,例如90%置信区间设置alpha=0.1
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

