這樣模型構建的優勢在于自動化參數選擇:利用 AutoARIMA 自動選擇最佳參數,減少了模型調參的時間和復雜度,處理非線性趨勢和季節性:通過 Prophet 的組件,模型可以有效處理復雜的趨勢和季節性模式,魯棒性:結合兩種方法的優點,能夠在多種時間序列數據上表現良好

代碼構建

數據讀取

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False

df = pd.read_excel('AutOARIMA-Prophet.xlsx')
df['數據時間'] = pd.to_datetime(df['數據時間']) # 把日期列轉換為datetime格式
plt.figure(figsize=(15, 5))
plt.plot(df['數據時間'], df['data'], color='b', alpha=0.6)
plt.title('時序圖')
plt.grid(True)
plt.show()

數據準備

# 準備數據,確保日期列名為 'ds',值列名為 'y', 這里主要是去適應模型輸入格式
df = df.rename(columns={'數據時間': 'ds', 'data': 'y'})

from sklearn.model_selection import train_test_split
X = df['ds']
Y = df['y']
# 分割訓練集和測試集,保留時間序列的順序shuffle=False
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,test_size = 0.05,
random_state = 0,shuffle=False)
# 合并成一個 DataFrame
train_data = pd.DataFrame({'ds': X_train, 'y': Y_train})
test_data = pd.DataFrame({'ds': X_test, 'y': Y_test})
# 確保索引排序正確
train_data = train_data.sort_index()
test_data = test_data.sort_index()

修改時間序列數據以適應Prophet模型的輸入格式,首先將數據框中的日期列名改為’ds’,將值列名改為’y’。然后使用train_test_split函數將數據分割成訓練集和測試集,保持時間序列的順序(即shuffle=False),并將它們組合成兩個新的數據框,最后確保了兩個數據框的索引排序正確

模型訓練

from statsforecast.adapters.prophet import AutoARIMAProphet
from tqdm import tqdm
from datetime import datetime

# 初始化 AutoARIMAProphet 模型配置
model_config = {
"growth": "linear", # 設置增長類型線性增長。適用于數據呈線性增長趨勢的情況。
"yearly_seasonality": True, # 啟用年度季節性
"seasonality_mode": "multiplicative", # 季節性成分的模式為乘法模式
"seasonality_prior_scale": 10, # 季節性先驗尺度
"holidays_prior_scale": 10, # 節假日效應的先驗尺度
"changepoint_prior_scale": 0.05, # 變化點的先驗尺度
"interval_width": 0.75, # 預測間隔的寬度
"uncertainty_samples": 100 # 用于預測不確定性的樣本數量
}
# 實例化模型
model = AutoARIMAProphet(**model_config)

start = datetime.now()
with tqdm(total=1, desc="Fitting Model") as pbar:
autoarimaprophet = model.fit(train_data, disable_seasonal_features=False)
pbar.update(1)
print("Training time:", datetime.now() - start) # 計算訓練時間

periods = len(test_data)+30
future_data = autoarimaprophet.make_future_dataframe(periods=periods)
# 進行預測
forecast = model.predict(future_data)
forecast.head()

這里的模型預測將會從測試集的起點開始進行預測,直到定義的往后預測點數量,yhat是預測結果,yhat_lower和yhat_upper是置信區間,下面給出參數解釋,具體的參數可參考原文鏈接

這里模型采用的增長類型是linear如果采用logistic需要指定預測值的上下限,具體代碼如下

# 初始化 AutoARIMAProphet 模型配置
model_config = {
"growth": "logistic", # 設置增長類型為邏輯斯蒂增長,適用于 S 形增長的數據
"yearly_seasonality": True, # 啟用年度季節性
"seasonality_mode": "multiplicative", # 季節性成分的模式為乘法模式
"seasonality_prior_scale": 10, # 季節性先驗尺度
"holidays_prior_scale": 10, # 節假日效應的先驗尺度
"changepoint_prior_scale": 0.05, # 變化點的先驗尺度
"interval_width": 0.75, # 預測間隔的寬度
"uncertainty_samples": 1000 # 用于預測不確定性的樣本數量
}

cap = train_data['y'].max() # 預測值的上限,這里采用測試集的最大值最小值,可根據實際數據進行調整
floor = train_data['y'].min() # 預測值的下限
model = AutoARIMAProphet(**model_config)
# 為訓練數據添加 cap 和 floor 列
train_data['cap'] = cap
train_data['floor'] = floor
# 訓練模型
start = datetime.now() # 使用datetime模塊中的函數獲取當前時間
with tqdm(total=1, desc="Fitting Model") as pbar:
autoarimaprophet = model.fit(train_data, disable_seasonal_features=False)
pbar.update(1)
print("Training time:", datetime.now() - start) # 計算訓練時間

# 預測未來30天
periods = len(test_data)+30 # 這里時間上是在測試集上進行預測后在往后預測未來30天
future_data = autoarimaprophet.make_future_dataframe(periods=periods)
future_data['cap'] = cap
future_data['floor'] = floor
# 進行預測
forecast = model.predict(future_data)

模型可視化

# 獲取最后 30 個預測值
pred = forecast.tail(30)
# 測試集預測
start_date = test_data['ds'].iloc[0]
end_date = test_data['ds'].iloc[-1]
test_pred = forecast[(forecast['ds'] >= start_date) & (forecast['ds'] <= end_date)]
# 訓練集預測
start_date = train_data['ds'].iloc[0]
end_date = train_data['ds'].iloc[-1]
train_pred = forecast[(forecast['ds'] >= start_date) & (forecast['ds'] <= end_date)]

plt.figure(figsize=(15, 5))
plt.plot(train_data['ds'], train_data['y'], color='r', alpha=0.3, label='訓練集真實值')
plt.plot(test_data['ds'], test_data['y'], color='r', alpha=0.8, label='測試集真實值')

plt.plot(train_pred['ds'], train_pred['yhat'], color='blue', linestyle='--', label='訓練集預測值')
plt.fill_between(train_pred['ds'], train_pred['yhat_lower'], train_pred['yhat_upper'], color='blue', alpha=0.2)

plt.plot(test_pred['ds'], test_pred['yhat'], color='green', linestyle='--', label='測試集預測值')
plt.fill_between(test_pred['ds'], test_pred['yhat_lower'], test_pred['yhat_upper'], color='green', alpha=0.2)

plt.plot(pred['ds'], pred['yhat'], color='orange', linestyle='--', label='未來預測值')
plt.fill_between(pred['ds'], pred['yhat_lower'], pred['yhat_upper'], color='orange', alpha=0.2)
plt.title('預測')
plt.legend()
plt.grid(True)
plt.show()

文章轉自微信公眾號@Python機器學習AI

上一篇:

決策樹和隨機森林的決策過程路徑可視化解讀

下一篇:

數據分布與變化:從理論到實踐指南

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費