我有一個包含 4 年銷售額的資料集,并試圖預測未來五年的銷售額。我將資料集分為 36 個月作為訓練集和 12 個月作為測驗集。我選擇了 Holt Winter 的方法并撰寫了以下代碼來測驗模型。
from statsmodels.tsa.api import ExponentialSmoothing
holt_winter = ExponentialSmoothing(np.asarray(train_data['Sales']), seasonal_periods=12, trend='add', seasonal='add')
hw_fit = holt_winter.fit()
hw_forecast = hw_fit.forecast(len(test_data))
plt.figure(figsize=(16,8))
plt.plot(train_data.index, train_data['Sales'], "b.-", label='Train Data')
plt.plot(test_data.index, test_data['Sales'], "ro-", label='Original Test Data')
plt.plot(test_data.index, hw_forecast, "gx-", label='Holt_Winter Forecast Data')
plt.ylabel('Score', fontsize=16)
plt.xlabel('Time', fontsize=16)
plt.legend(loc='best')
plt.title('Holt Winters Forecast', fontsize=20)
plt.show()
代碼似乎作業正常,并且可能正確預測測驗資料集的結果。但是,如果我想預測未來五年的銷售額,我正在努力弄清楚如何編碼?
uj5u.com熱心網友回復:
hw_fit.predict(start, end)
將從 step start到 step end進行預測,其中 step 0 是訓練資料的第一個值。
預測進行樣本外預測。所以這兩個是等價的:
hw_fit.forecast(steps)
hw_fit.predict(len(train_data), len(train_data) steps-1)
因此,由于您的模型是按月進行訓練的,如果您想在訓練資料后預測n個月,則可以使用steps=n呼叫上述方法
uj5u.com熱心網友回復:
您還可以嘗試 ARIMA 模型,它通常會提供更好的性能,并且此代碼組合了不同的 ARIMA 引數(AR,自回歸引數;I,差分引數;MA,移動平均引數;分別為 - p,d,q)并找到通過降低 Akaike 資訊標準 (AIK) 來優化它們的最佳組合,該標準懲罰具有引數數量的最大似然(即找到具有最少引數數量的最佳似然):
from statsmodels.tsa.arima_model import ARIMA
import itertools
# Grid Search
p = d = q = range(0,3) # p, d, and q can be either 0, 1, or 2
pdq = list(itertools.product(p,d,q)) # gets all possible combinations of p, d, and q
combs = {} # stores aic and order pairs
aics = [] # stores aics
# Grid Search continued
for combination in pdq:
try:
model = ARIMA(train_data['Sales'], order=combination) # create all possible models
model = model.fit()
combs.update({model.aic : combination}) # store combinations
aics.append(model.aic)
except:
continue
best_aic = min(aics)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323192.html
上一篇:AttributeError:'LogisticRegressionTrainingSummary'物件沒有屬性'areaUnderROC'
