<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/make-sample-forecasts-arima-python/](https://machinelearningmastery.com/make-sample-forecasts-arima-python/) 在開始使用時間序列數據時,進行樣本外預測可能會令人困惑。 statsmodels Python API 提供了執行一步和多步樣本外預測的功能。 在本教程中,您將清除在 Python 中使用時間序列數據進行樣本外預測時的任何混淆。 完成本教程后,您將了解: * 如何進行一步到位的樣本預測。 * 如何進行多步驟樣本外預測。 * _forecast()_ 和 _ 之間的差異預測()_ 的功能。 讓我們開始吧。 ![How to Make Out-of-Sample Forecasts with ARIMA in Python](https://img.kancloud.cn/31/ef/31ef1798f2b7a433b6c1695c5ad0165c_640x360.jpg) 如何使用 Python 中的 ARIMA 進行樣本外預測 照片來自 [dziambel](https://www.flickr.com/photos/141999355@N08/32706989645/) ,保留一些權利。 ## 教程概述 本教程分為以下 5 個步驟: 1. 數據集描述 2. 拆分數據集 3. 開發模型 4. 一步到位的樣本外預測 5. 多步樣本外預測 ## 1.最低每日溫度數據集 該數據集描述了澳大利亞墨爾本市 10 年(1981-1990)的最低日常溫度。 單位為攝氏度,有 3,650 個觀測值。數據來源被稱為澳大利亞氣象局。 [了解有關數據市場](https://datamarket.com/data/set/2324/daily-minimum-temperatures-in-melbourne-australia-1981-1990)上數據集的更多信息。 使用文件名“ _daily-minimum-Temperats.sv”_ 將最低每日溫度數據集下載到當前工作目錄。 **注意**:下載的文件包含一些問號(“?”)字符,必須先將其刪除才能使用數據集。在文本編輯器中打開文件并刪除“?”字符。此外,刪除文件中的任何頁腳信息。 下面的示例將數據集加載為 Pandas 系列。 ```py # line plot of time series from pandas import Series from matplotlib import pyplot # load dataset series = Series.from_csv('daily-minimum-temperatures.csv', header=0) # display first few rows print(series.head(20)) # line plot of dataset series.plot() pyplot.show() ``` 運行該示例將打印已加載數據集的前 20 行。 ```py Date 1981-01-01 20.7 1981-01-02 17.9 1981-01-03 18.8 1981-01-04 14.6 1981-01-05 15.8 1981-01-06 15.8 1981-01-07 15.8 1981-01-08 17.4 1981-01-09 21.8 1981-01-10 20.0 1981-01-11 16.2 1981-01-12 13.3 1981-01-13 16.7 1981-01-14 21.5 1981-01-15 25.0 1981-01-16 20.7 1981-01-17 20.6 1981-01-18 24.8 1981-01-19 17.7 1981-01-20 15.5 ``` 還創建了時間序列的線圖。 ![Minimum Daily Temperatures Dataset Line Plot](https://img.kancloud.cn/be/ee/beee630761575431c10d8e939cfec3fd_640x480.jpg) 最低每日溫度數據集線圖 ## 2.拆分數據集 我們可以將數據集拆分為兩部分。 第一部分是我們將用于準備 ARIMA 模型的訓練數據集。第二部分是我們假裝不可用的測試數據集。正是這些時間步驟我們將在樣本之外進行處理。 該數據集包含 1981 年 1 月 1 日至 1990 年 12 月 31 日期間的數據。 我們將從 1990 年 12 月開始將數據集的最后 7 天作為測試數據集,并將這些時間步驟視為樣本之外的步驟。 具體是 1990-12-25 到 1990-12-31: ```py 1990-12-25,12.9 1990-12-26,14.6 1990-12-27,14.0 1990-12-28,13.6 1990-12-29,13.5 1990-12-30,15.7 1990-12-31,13.0 ``` 下面的代碼將加載數據集,將其拆分為訓練和驗證數據集,并將它們分別保存到文件 _dataset.csv_ 和 _validation.csv_ 。 ```py # split the dataset from pandas import Series series = Series.from_csv('daily-minimum-temperatures.csv', header=0) split_point = len(series) - 7 dataset, validation = series[0:split_point], series[split_point:] print('Dataset %d, Validation %d' % (len(dataset), len(validation))) dataset.to_csv('dataset.csv') validation.to_csv('validation.csv') ``` 運行示例,您現在應該有兩個文件可以使用。 dataset.csv 中的最后一個觀察是 1990 年平安夜: ```py 1990-12-24,10.0 ``` 這意味著 1990 年圣誕節及以后是在 _dataset.csv_ 上訓練的模型的樣本外時間步長。 ## 3.開發模型 在本節中,我們將使數據保持靜止并開發一個簡單的 ARIMA 模型。 數據具有強大的季節性成分。我們可以通過考慮季節性差異來中和這一點并使數據保持不變。也就是說,我們可以觀察一天,并從一年前的同一天減去觀察結果。 這將產生一個固定的數據集,我們可以從中擬合模型。 ```py # create a differenced series def difference(dataset, interval=1): diff = list() for i in range(interval, len(dataset)): value = dataset[i] - dataset[i - interval] diff.append(value) return numpy.array(diff) ``` 我們可以通過在一年前添加觀察值來反轉此操作。我們需要對經過季節性調整的數據訓練的模型進行預測。 ```py # invert differenced value def inverse_difference(history, yhat, interval=1): return yhat + history[-interval] ``` 我們可以使用 ARIMA 模型。 將強大的 ARIMA 模型擬合到數據不是本文的重點,因此我將選擇一個簡單的 ARIMA(7,0,7),而不是通過問題分析或[網格搜索參數](http://machinelearningmastery.com/grid-search-arima-hyperparameters-with-python/)。組態。 我們可以將所有這些放在一起如下: ```py from pandas import Series from statsmodels.tsa.arima_model import ARIMA import numpy # create a differenced series def difference(dataset, interval=1): diff = list() for i in range(interval, len(dataset)): value = dataset[i] - dataset[i - interval] diff.append(value) return numpy.array(diff) # load dataset series = Series.from_csv('dataset.csv', header=None) # seasonal difference X = series.values days_in_year = 365 differenced = difference(X, days_in_year) # fit model model = ARIMA(differenced, order=(7,0,1)) model_fit = model.fit(disp=0) # print summary of fit model print(model_fit.summary()) ``` 運行該示例加載數據集,獲取季節差異,然后擬合 ARIMA(7,0,7)模型并打印擬合模型的摘要。 ```py ARMA Model Results ============================================================================== Dep. Variable: y No. Observations: 3278 Model: ARMA(7, 1) Log Likelihood -8673.748 Method: css-mle S.D. of innovations 3.411 Date: Mon, 20 Feb 2017 AIC 17367.497 Time: 10:28:38 BIC 17428.447 Sample: 0 HQIC 17389.322 ============================================================================== coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------ const 0.0132 0.132 0.100 0.921 -0.246 0.273 ar.L1.y 1.1424 0.287 3.976 0.000 0.579 1.706 ar.L2.y -0.4346 0.154 -2.829 0.005 -0.736 -0.133 ar.L3.y 0.0961 0.042 2.289 0.022 0.014 0.178 ar.L4.y 0.0125 0.029 0.434 0.664 -0.044 0.069 ar.L5.y -0.0101 0.029 -0.343 0.732 -0.068 0.047 ar.L6.y 0.0119 0.027 0.448 0.654 -0.040 0.064 ar.L7.y 0.0089 0.024 0.368 0.713 -0.038 0.056 ma.L1.y -0.6157 0.287 -2.146 0.032 -1.178 -0.053 Roots ============================================================================= Real Imaginary Modulus Frequency ----------------------------------------------------------------------------- AR.1 1.2234 -0.0000j 1.2234 -0.0000 AR.2 1.2561 -1.0676j 1.6485 -0.1121 AR.3 1.2561 +1.0676j 1.6485 0.1121 AR.4 0.0349 -2.0160j 2.0163 -0.2472 AR.5 0.0349 +2.0160j 2.0163 0.2472 AR.6 -2.5770 -1.3110j 2.8913 -0.4251 AR.7 -2.5770 +1.3110j 2.8913 0.4251 MA.1 1.6242 +0.0000j 1.6242 0.0000 ----------------------------------------------------------------------------- ``` 我們現在準備探索使用該模型進行樣本外預測。 ## 4.一步到位的樣本外預測 ARIMA 模型非常適合一步預測。 一步預測是從用于擬合模型的可用數據預測序列中的下一個時間步。 在這種情況下,我們對 1990 年圣誕節的一步預測感興趣: ```py 1990-12-25 ``` ### 預測功能 statsmodel ARIMAResults 對象提供 [_forecast()_ 函數](http://statsmodels.sourceforge.net/stable/generated/statsmodels.tsa.arima_model.ARIMAResults.forecast.html)用于進行預測。 默認情況下,此功能可以進行單步樣本預測。因此,我們可以直接調用它并進行預測。 _forecast()_ 函數的結果是包含預測值,預測的標準誤差和置信區間信息的數組。現在,我們只關注此預測的第一個元素,如下所示。 ```py # one-step out-of sample forecast forecast = model_fit.forecast()[0] ``` 一旦完成,我們可以反轉季節性差異并將值轉換回原始比例。 ```py # invert the differenced forecast to something usable forecast = inverse_difference(X, forecast, days_in_year) ``` 完整示例如下: ```py from pandas import Series from statsmodels.tsa.arima_model import ARIMA import numpy # create a differenced series def difference(dataset, interval=1): diff = list() for i in range(interval, len(dataset)): value = dataset[i] - dataset[i - interval] diff.append(value) return numpy.array(diff) # invert differenced value def inverse_difference(history, yhat, interval=1): return yhat + history[-interval] # load dataset series = Series.from_csv('dataset.csv', header=None) # seasonal difference X = series.values days_in_year = 365 differenced = difference(X, days_in_year) # fit model model = ARIMA(differenced, order=(7,0,1)) model_fit = model.fit(disp=0) # one-step out-of sample forecast forecast = model_fit.forecast()[0] # invert the differenced forecast to something usable forecast = inverse_difference(X, forecast, days_in_year) print('Forecast: %f' % forecast) ``` 運行該示例打印 14.8 度,接近 _validation.csv_ 文件中預期的 12.9 度。 ```py Forecast: 14.861669 ``` ### 預測功能 statsmodel ARIMAResults 對象還提供 [_predict()_ 函數](http://statsmodels.sourceforge.net/stable/generated/statsmodels.tsa.arima_model.ARIMAResults.predict.html)進行預測。 預測函數可用于預測任意樣本內和樣本外時間步驟,包括下一個樣本外預測時間步驟。 預測函數需要指定開始和結束,這些可以是相對于用于擬合模型的訓練數據的開始的時間步長的索引,例如: ```py # one-step out of sample forecast start_index = len(differenced) end_index = len(differenced) forecast = model_fit.predict(start=start_index, end=end_index) ``` start 和 end 也可以是日期時間字符串或“日期時間”類型;例如: ```py start_index = '1990-12-25' end_index = '1990-12-25' forecast = model_fit.predict(start=start_index, end=end_index) ``` 和 ```py from pandas import datetime start_index = datetime(1990, 12, 25) end_index = datetime(1990, 12, 26) forecast = model_fit.predict(start=start_index, end=end_index) ``` 使用時間步長索引以外的任何內容都會導致系統出錯,如下所示: ```py AttributeError: 'NoneType' object has no attribute 'get_loc' ``` 也許你會有更多的運氣;現在,我堅持時間步驟索引。 完整示例如下: ```py from pandas import Series from statsmodels.tsa.arima_model import ARIMA import numpy from pandas import datetime # create a differenced series def difference(dataset, interval=1): diff = list() for i in range(interval, len(dataset)): value = dataset[i] - dataset[i - interval] diff.append(value) return numpy.array(diff) # invert differenced value def inverse_difference(history, yhat, interval=1): return yhat + history[-interval] # load dataset series = Series.from_csv('dataset.csv', header=None) # seasonal difference X = series.values days_in_year = 365 differenced = difference(X, days_in_year) # fit model model = ARIMA(differenced, order=(7,0,1)) model_fit = model.fit(disp=0) # one-step out of sample forecast start_index = len(differenced) end_index = len(differenced) forecast = model_fit.predict(start=start_index, end=end_index) # invert the differenced forecast to something usable forecast = inverse_difference(X, forecast, days_in_year) print('Forecast: %f' % forecast) ``` 使用 _forecast()_ 函數時,運行該示例將打印與上述相同的預測。 ```py Forecast: 14.861669 ``` 您可以看到預測功能更靈活。您可以指定樣本內或樣本外的任何點或連續預測區間。 現在我們知道如何進行一步預測,現在我們可以進行一些多步預測。 ## 5.多步驟樣本外預測 我們還可以使用 _forecast()_ 和 _predict()_ 函數進行多步預測。 天氣數據通常會進行一周(7 天)預測,因此在本節中我們將研究預測接下來的 7 個樣本外時間步的最低日常溫度。 ### 預測功能 _forecast()_ 函數有一個名為 _ 步驟 _ 的參數,允許您指定預測的時間步數。 默認情況下,對于一步式樣本外預測,此參數設置為 1。我們可以將其設置為 7 以獲得接下來 7 天的預測。 ```py # multi-step out-of-sample forecast forecast = model_fit.forecast(steps=7)[0] ``` 然后,我們可以反轉每個預測的時間步驟,一次一個并打印值。請注意,要將 t + 2 的預測值反轉,我們需要 t + 1 的反轉預測值。在這里,我們將它們添加到名為 history 的列表的末尾,以便在調用 _inverse_difference()_ 時使用。 ```py # invert the differenced forecast to something usable history = [x for x in X] day = 1 for yhat in forecast: inverted = inverse_difference(history, yhat, days_in_year) print('Day %d: %f' % (day, inverted)) history.append(inverted) day += 1 ``` 完整示例如下: ```py from pandas import Series from statsmodels.tsa.arima_model import ARIMA import numpy # create a differenced series def difference(dataset, interval=1): diff = list() for i in range(interval, len(dataset)): value = dataset[i] - dataset[i - interval] diff.append(value) return numpy.array(diff) # invert differenced value def inverse_difference(history, yhat, interval=1): return yhat + history[-interval] # load dataset series = Series.from_csv('dataset.csv', header=None) # seasonal difference X = series.values days_in_year = 365 differenced = difference(X, days_in_year) # fit model model = ARIMA(differenced, order=(7,0,1)) model_fit = model.fit(disp=0) # multi-step out-of-sample forecast forecast = model_fit.forecast(steps=7)[0] # invert the differenced forecast to something usable history = [x for x in X] day = 1 for yhat in forecast: inverted = inverse_difference(history, yhat, days_in_year) print('Day %d: %f' % (day, inverted)) history.append(inverted) day += 1 ``` 運行該示例將打印接下來 7 天的預測。 ```py Day 1: 14.861669 Day 2: 15.628784 Day 3: 13.331349 Day 4: 11.722413 Day 5: 10.421523 Day 6: 14.415549 Day 7: 12.674711 ``` ### 預測功能 _predict()_ 函數還可以預測接下來的 7 個樣本外時間步長。 使用時間步長索引,我們可以將結束索引指定為未來 6 個以上的時間步長;例如: ```py # multi-step out-of-sample forecast start_index = len(differenced) end_index = start_index + 6 forecast = model_fit.predict(start=start_index, end=end_index) ``` 下面列出了完整的示例。 ```py from pandas import Series from statsmodels.tsa.arima_model import ARIMA import numpy # create a differenced series def difference(dataset, interval=1): diff = list() for i in range(interval, len(dataset)): value = dataset[i] - dataset[i - interval] diff.append(value) return numpy.array(diff) # invert differenced value def inverse_difference(history, yhat, interval=1): return yhat + history[-interval] # load dataset series = Series.from_csv('dataset.csv', header=None) # seasonal difference X = series.values days_in_year = 365 differenced = difference(X, days_in_year) # fit model model = ARIMA(differenced, order=(7,0,1)) model_fit = model.fit(disp=0) # multi-step out-of-sample forecast start_index = len(differenced) end_index = start_index + 6 forecast = model_fit.predict(start=start_index, end=end_index) # invert the differenced forecast to something usable history = [x for x in X] day = 1 for yhat in forecast: inverted = inverse_difference(history, yhat, days_in_year) print('Day %d: %f' % (day, inverted)) history.append(inverted) day += 1 ``` 運行該示例會產生與上一節中調用 _forecast()_ 函數相同的結果,如您所料。 ```py Day 1: 14.861669 Day 2: 15.628784 Day 3: 13.331349 Day 4: 11.722413 Day 5: 10.421523 Day 6: 14.415549 Day 7: 12.674711 ``` ## 摘要 在本教程中,您了解了如何使用 statsmodel 在 Python 中進行樣本外預測。 具體來說,你學到了: * 如何進行一步到位的樣本預測。 * 如何進行為期 7 天的多步樣本預測。 * 如何在預測時使用 _forecast()_ 和 _predict()_ 函數。 您對樣本外預測或此帖有任何疑問嗎?在評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看