<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 如何在 Python 中為時間序列預測創建 ARIMA 模型 > 原文: [https://machinelearningmastery.com/arima-for-time-series-forecasting-with-python/](https://machinelearningmastery.com/arima-for-time-series-forecasting-with-python/) ARIMA 模型是一種流行且廣泛使用的時間序列預測統計方法。 ARIMA 是 AutoRegressive Integrated Moving Average 的縮寫。它是一類模型,它捕獲時間序列數據中的一套不同的標準時間結構。 在本教程中,您將了解如何使用 Python 為時間序列數據開發 ARIMA 模型。 完成本教程后,您將了解: * 關于 ARIMA 模型使用的參數和模型所做的假設。 * 如何使 ARIMA 模型適合數據并使用它來進行預測。 * 如何根據時間序列問題配置 ARIMA 模型。 讓我們開始吧。 ## 自回歸整合移動平均模型 [ARIMA 模型](https://en.wikipedia.org/wiki/Autoregressive_integrated_moving_average)是一類用于分析和預測時間序列數據的統計模型。 它明確地迎合了時間序列數據中的一套標準結構,因此提供了一種簡單而強大的方法來進行熟練的時間序列預測。 ARIMA 是 AutoRegressive Integrated Moving Average 的縮寫。它是更簡單的 AutoRegressive 移動平均線的推廣,并添加了集成的概念。 這個首字母縮略詞是描述??性的,捕捉模型本身的關鍵方面。簡而言之,它們是: * **AR** :_ 自回歸 _。使用觀察與一些滯后觀察之間的依賴關系的模型。 * **I** :_ 綜合 _。使用差異原始觀察(例如,從前一時間步驟的觀察中減去觀察值)以使時間序列靜止。 * **MA** :_ 移動平均值 _。使用應用于滯后觀察的移動平均模型中的觀察和殘差之間的依賴關系的模型。 這些組件中的每一個都在模型中明確指定為參數。標準符號用于 ARIMA(p,d,q),其中參數用整數值代替,以快速指示正在使用的特定 ARIMA 模型。 ARIMA 模型的參數定義如下: * **p** :模型中包含的滯后觀察數,也稱為滯后順序。 * **d** :原始觀測值的差異次數,也稱為差分程度。 * **q** :移動平均窗口的大小,也稱為移動平均線的順序。 構建包括指定數量和類型的項的線性回歸模型,并且通過差分程度準備數據以使其靜止,即去除對回歸模型產生負面影響的趨勢和季節結構。 值 0 可用于參數,表示不使用模型的該元素。這樣,ARIMA 模型可以配置為執行 ARMA 模型的功能,甚至是簡單的 AR,I 或 MA 模型。 對時間序列采用 ARIMA 模型假設生成觀察結果的基礎過程是 ARIMA 過程。這似乎是顯而易見的,但有助于激發在原始觀測中確認模型假設的必要性以及模型預測的殘差。 接下來,我們來看看如何在 Python 中使用 ARIMA 模型。我們將從加載一個簡單的單變量時間序列開始。 ## 洗發水銷售數據集 該數據集描述了 3 年期間每月洗發水的銷售數量。 單位是銷售計數,有 36 個觀察。原始數據集歸功于 Makridakis,Wheelwright 和 Hyndman(1998)。 [了解有關數據集的更多信息并從此處下載](https://datamarket.com/data/set/22r0/sales-of-shampoo-over-a-three-year-period)。 下載數據集并將其放在當前工作目錄中,文件名為“ _shampoo-sales.csv_ ”。 下面是一個使用 Pandas 加載 Shampoo Sales 數據集并使用自定義函數解析日期時間字段的示例。數據集以任意年份為基線,在本例中為 1900。 ```py from pandas import read_csv from pandas import datetime from matplotlib import pyplot 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) print(series.head()) series.plot() pyplot.show() ``` 運行該示例將打印數據集的前 5 行。 ```py Month 1901-01-01 266.0 1901-02-01 145.9 1901-03-01 183.1 1901-04-01 119.3 1901-05-01 180.3 Name: Sales, dtype: float64 ``` 數據也繪制為時間序列,沿 x 軸的月份和 y 軸的銷售數字。 ![Shampoo Sales Dataset Plot](https://img.kancloud.cn/8d/58/8d588dd57598f15129e9e8500c26168a_800x600.jpg) 洗發水銷售數據集圖 我們可以看到 Shampoo Sales 數據集具有明顯的趨勢。 這表明時間序列不是靜止的并且需要差分以使其靜止,至少差異為 1。 讓我們快速瀏覽一下時間序列的自相關圖。這也是熊貓內置的。下面的示例描繪了時間序列中大量滯后的自相關。 ```py from pandas import read_csv from pandas import datetime from matplotlib import pyplot from pandas.tools.plotting import autocorrelation_plot 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) autocorrelation_plot(series) pyplot.show() ``` 運行這個例子,我們可以看到與前 10 個到 12 個滯后的正相關,這可能對前 5 個滯后很重要。 模型的 AR 參數的良好起點可以是 5。 ![Autocorrelation Plot of Shampoo Sales Data](https://img.kancloud.cn/90/25/902509d6c51cfb9c4a0043f88e2c6225_800x600.jpg) 洗發水銷售數據的自相關圖 ## ARIMA 與 Python statsmodels 庫提供適合 ARIMA 模型的功能。 可以使用 statsmodels 庫創建 ARIMA 模型,如下所示: 1. 通過調用 [ARIMA()](http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_model.ARIMA.html)并傳入 _p_ , _d_ 和 _q_ 參數來定義模型。 2. 通過調用 [fit()](http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_model.ARIMA.fit.html)函數,在訓練數據上準備模型。 3. 可以通過調用 [predict()](http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_model.ARIMA.predict.html)函數并指定要預測的時間或索引的時間來進行預測。 讓我們從簡單的事情開始吧。我們將 ARIMA 模型與整個 Shampoo Sales 數據集相匹配,并檢查殘差。 首先,我們擬合 ARIMA(5,1,0)模型。這將自動回歸的滯后值設置為 5,使用差值順序 1 使時間序列靜止,并使用 0 的移動平均模型。 在擬合模型時,提供了許多關于線性回歸模型擬合的調試信息。我們可以通過將 _disp_ 參數設置為 0 來關閉它。 ```py from pandas import read_csv from pandas import datetime from pandas import DataFrame from statsmodels.tsa.arima_model import ARIMA from matplotlib import pyplot 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) # fit model model = ARIMA(series, order=(5,1,0)) model_fit = model.fit(disp=0) print(model_fit.summary()) # plot residual errors residuals = DataFrame(model_fit.resid) residuals.plot() pyplot.show() residuals.plot(kind='kde') pyplot.show() print(residuals.describe()) ``` 運行該示例將打印擬合模型的摘要。這總結了所使用的系數值以及樣本內觀察的擬合技巧。 ```py ARIMA Model Results ============================================================================== Dep. Variable: D.Sales No. Observations: 35 Model: ARIMA(5, 1, 0) Log Likelihood -196.170 Method: css-mle S.D. of innovations 64.241 Date: Mon, 12 Dec 2016 AIC 406.340 Time: 11:09:13 BIC 417.227 Sample: 02-01-1901 HQIC 410.098 - 12-01-1903 ================================================================================= coef std err z P>|z| [95.0% Conf. Int.] --------------------------------------------------------------------------------- const 12.0649 3.652 3.304 0.003 4.908 19.222 ar.L1.D.Sales -1.1082 0.183 -6.063 0.000 -1.466 -0.750 ar.L2.D.Sales -0.6203 0.282 -2.203 0.036 -1.172 -0.068 ar.L3.D.Sales -0.3606 0.295 -1.222 0.231 -0.939 0.218 ar.L4.D.Sales -0.1252 0.280 -0.447 0.658 -0.674 0.424 ar.L5.D.Sales 0.1289 0.191 0.673 0.506 -0.246 0.504 Roots ============================================================================= Real Imaginary Modulus Frequency ----------------------------------------------------------------------------- AR.1 -1.0617 -0.5064j 1.1763 -0.4292 AR.2 -1.0617 +0.5064j 1.1763 0.4292 AR.3 0.0816 -1.3804j 1.3828 -0.2406 AR.4 0.0816 +1.3804j 1.3828 0.2406 AR.5 2.9315 -0.0000j 2.9315 -0.0000 ----------------------------------------------------------------------------- ``` 首先,我們得到殘差的線圖,表明模型可能仍然存在一些趨勢信息。 ![ARMA Fit Residual Error Line Plot](https://img.kancloud.cn/88/fe/88feb29a0d311f3a5004bf74b96671d4_800x600.jpg) ARMA Fit 殘差錯誤線圖 接下來,我們得到殘差誤差值的密度圖,表明誤差是高斯誤差,但可能不是以零為中心。 ![ARMA Fit Residual Error Density Plot](https://img.kancloud.cn/1e/aa/1eaa66ed8f443a8d50e900ac89de8bdc_800x600.jpg) ARMA Fit 殘差誤差密度圖 顯示殘差的分布。結果表明,預測中確實存在偏差(殘差中的非零均值)。 ```py count 35.000000 mean -5.495213 std 68.132882 min -133.296597 25% -42.477935 50% -7.186584 75% 24.748357 max 133.237980 ``` 請注意,雖然上面我們使用整個數據集進行時間序列分析,但理想情況下,我們會在開發預測模型時僅對訓練數據集執行此分析。 接下來,讓我們看看如何使用 ARIMA 模型進行預測。 ## 滾動預測 ARIMA 模型 ARIMA 模型可用于預測未來的時間步長。 我們可以使用 [ARIMAResults](http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_model.ARIMAResults.html) 對象上的 predict()函數進行預測。它接受將預測作為參數的時間步長索引。這些索引與用于進行預測的訓練數據集的起點相關。 如果我們在訓練數據集中使用 100 個觀測值來擬合模型,那么用于進行預測的下一個時間步驟的索引將被指定給預測函數,因為 _start = 101,end = 101_ 。這將返回一個包含預測的一個元素的數組。 如果我們在配置模型時執行任何差分( _d&gt; 0_ ),我們還希望預測值處于原始比例。這可以通過將 _typ_ 參數設置為值 _'水平'_: _typ ='水平'_ 來指定。 或者,我們可以通過使用 [forecast()](http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.arima_model.ARIMAResults.forecast.html)函數來避免所有這些規范,該函數使用模型執行一步預測。 我們可以將訓練數據集拆分為訓練集和測試集,使用訓練集來擬合模型,并為測試集上的每個元素生成預測。 考慮到差異的先前時間步長和 AR 模型的觀察依賴性,需要滾動預測。執行此滾動預測的一種粗略方法是在收到每個新觀察后重新創建 ARIMA 模型。 我們手動跟蹤名為歷史的列表中的所有觀察結果,該列表與訓練數據一起播種,并且每次迭代都附加新的觀察結果。 綜上所述,下面是使用 Python 中的 ARIMA 模型進行滾動預測的示例。 ```py from pandas import read_csv from pandas import datetime from matplotlib import pyplot from statsmodels.tsa.arima_model import ARIMA from sklearn.metrics import mean_squared_error 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) X = series.values size = int(len(X) * 0.66) train, test = X[0:size], X[size:len(X)] history = [x for x in train] predictions = list() for t in range(len(test)): model = ARIMA(history, order=(5,1,0)) model_fit = model.fit(disp=0) output = model_fit.forecast() yhat = output[0] predictions.append(yhat) obs = test[t] history.append(obs) print('predicted=%f, expected=%f' % (yhat, obs)) error = mean_squared_error(test, predictions) print('Test MSE: %.3f' % error) # plot pyplot.plot(test) pyplot.plot(predictions, color='red') pyplot.show() ``` 運行該示例會在每次迭代時打印預測值和期望值。 我們還可以計算預測的最終均方誤差分數(MSE),為其他 ARIMA 配置提供比較點。 ```py predicted=349.117688, expected=342.300000 predicted=306.512968, expected=339.700000 predicted=387.376422, expected=440.400000 predicted=348.154111, expected=315.900000 predicted=386.308808, expected=439.300000 predicted=356.081996, expected=401.300000 predicted=446.379501, expected=437.400000 predicted=394.737286, expected=575.500000 predicted=434.915566, expected=407.600000 predicted=507.923407, expected=682.000000 predicted=435.483082, expected=475.300000 predicted=652.743772, expected=581.300000 predicted=546.343485, expected=646.900000 Test MSE: 6958.325 ``` 創建一個線圖,顯示與滾動預測預測(紅色)相比的預期值(藍色)。我們可以看到這些值顯示出一些趨勢并且具有正確的比例。 ![ARIMA Rolling Forecast Line Plot](https://img.kancloud.cn/24/66/246609cb1f2e8d2340d6c1f95e2b8310_800x600.jpg) ARIMA 滾動預測線圖 該模型可以使用 p,d 甚至 q 參數的進一步調整。 ## 配置 ARIMA 模型 擬合 ARIMA 模型的經典方法是遵循 [Box-Jenkins 方法](https://en.wikipedia.org/wiki/Box%E2%80%93Jenkins_method)。 這是一個使用時間序列分析和診斷來發現 ARIMA 模型的良好參數的過程。 總之,這個過程的步驟如下: 1. **模型識別**。使用圖和匯總統計信息來識別趨勢,季節性和自回歸元素,以了解差異量和所需滯后的大小。 2. **參數估計**。使用擬合程序查找回歸模型的系數。 3. **模型檢查**。使用殘差的圖和統計檢驗來確定模型未捕獲的時間結構的數量和類型。 重復該過程,直到在樣品內或樣品外觀察(例如訓練或測試數據集)上達到所需的擬合水平。 這個過程在經典的 1970 年教科書中描述,主題為[時間序列分析:預測與控制](http://www.amazon.com/dp/1118675029?tag=inspiredalgor-20)由 George Box 和 Gwilym Jenkins 撰寫。如果您有興趣深入了解這種類型的模型和方法,現在可以獲得更新的第 5 版。 鑒于模型可以有效地適應中等大小的時間序列數據集,模型的網格搜索參數可能是一種有價值的方法。 ## 摘要 在本教程中,您了解了如何為 Python 中的時間序列預測開發 ARIMA 模型。 具體來說,你學到了: * 關于 ARIMA 模型,如何配置以及模型所做的假設。 * 如何使用 ARIMA 模型執行快速時間序列分析。 * 如何使用 ARIMA 模型預測樣本預測。 您對 ARIMA 或本教程有任何疑問嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看