<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>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 用 Python 進行時間序列預測的自回歸模型 > 原文: [https://machinelearningmastery.com/autoregression-models-time-series-forecasting-python/](https://machinelearningmastery.com/autoregression-models-time-series-forecasting-python/) 自回歸是一個時間序列模型,它使用以前時間步的觀察值作為回歸方程的輸入,以預測下一個時間步的值。 這是一個非常簡單的想法,可以對一系列時間序列問題進行準確的預測。 在本教程中,您將了解如何使用 Python 實現時間序列預測的自回歸模型。 完成本教程后,您將了解: * 如何探索自相關的時間序列數據。 * 如何開發自相關模型并用它來進行預測。 * 如何使用開發的自相關模型進行滾動預測。 讓我們開始吧。 * **2017 年 5 月更新**:修正了自回歸方程中的小錯字。 ![Autoregression Models for Time Series Forecasting With Python](https://img.kancloud.cn/8e/69/8e69280ed1920f960c70761c1fe42292_640x425.jpg) 使用 Python 進行時間序列預測的自回歸模型 照片由 [Umberto Salvagnin](https://www.flickr.com/photos/kaibara/6352376941/) ,保留一些權利。 ## 自回歸 回歸模型(例如線性回歸)基于輸入值的線性組合對輸出值進行建模。 例如: ```py yhat = b0 + b1*X1 ``` 在哪里是預測,b0 和 b1 是通過在訓練數據上優化模型而找到的系數,并且 X 是輸入值。 該技術可用于時間序列,其中輸入變量被視為前一時間步的觀察值,稱為滯后變量。 例如,我們可以根據最后兩個時間步(t-1 和 t-2)的觀察結果預測下一個時間步(t + 1)的值。作為回歸模型,這看起來如下: ```py X(t+1) = b0 + b1*X(t-1) + b2*X(t-2) ``` 因為回歸模型在之前的時間步驟使用來自相同輸入變量的數據,所以它被稱為自回歸(self of regression)。 ## 自相關 自回歸模型假設前一時間步驟的觀察對于預測下一時間步的值是有用的。 變量之間的這種關系稱為相關性。 如果兩個變量在相同方向上變化(例如,一起向上或向下),則稱為正相關。如果變量隨著值的變化而向相反的方向移動(例如,一個上升,一個下降),則稱為負相關。 我們可以使用統計測量來計算輸出變量與先前時間步長處的各種不同滯后值之間的相關性。輸出變量與特定滯后變量之間的相關性越強,自動回歸模型在建模時可以對該變量賦予的權重越大。 同樣,因為在先前時間步驟中計算變量與其自身之間的相關性,所以稱為自相關。由于時間序列數據的順序結構,它也被稱為串行相關。 相關統計信息還可以幫助選擇哪些滯后變量在模型中有用,哪些不可用。 有趣的是,如果所有滯后變量與輸出變量顯示出低或沒有相關性,則表明時間序列問題可能無法預測。在開始使用新數據集時,這非常有用。 在本教程中,我們將研究單變量時間序列的自相關,然后開發自回歸模型并使用它來進行預測。 在我們這樣做之前,讓我們首先回顧一下將在示例中使用的每日最低溫度數據。 ## 最低每日溫度數據集 該數據集描述了澳大利亞墨爾本市 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 from pandas import Series from matplotlib import pyplot series = Series.from_csv('daily-minimum-temperatures.csv', header=0) print(series.head()) series.plot() pyplot.show() ``` 運行該示例將從加載的數據集中打印前 5 行。 ```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 Name: Temp, dtype: float64 ``` 然后創建數據集的線圖。 ![Minimum Daily Temperature Dataset Plot](https://img.kancloud.cn/4f/30/4f30c95f7611e9a7bbbb080410ec5623_800x600.jpg) 最低每日溫度數據集圖 ## 快速檢查自相關 我們可以快速,直觀地檢查我們的時間序列數據集中是否存在自相關。 我們可以在前一時間步驟(t-1)繪制觀察結果,并在下一時間步驟(t + 1)觀察作為散點圖。 這可以通過首先創建時間序列數據集的滯后版本并使用 Pandas 庫中的內置散點圖函數來手動完成。 但是有一種更簡單的方法。 Pandas 提供了一個完整的內置圖,稱為 [lag_plot()](http://pandas.pydata.org/pandas-docs/version/0.18.1/visualization.html#lag-plot)函數。 下面是創建最低每日溫度數據集的滯后圖的示例。 ```py from pandas import Series from matplotlib import pyplot from pandas.tools.plotting import lag_plot series = Series.from_csv('daily-minimum-temperatures.csv', header=0) lag_plot(series) pyplot.show() ``` 運行該示例將 x 軸上的溫度數據(t)與 y 軸上前一天(t-1)的溫度進行對比。 ![Minimum Daily Temperature Dataset Lag Plot](https://img.kancloud.cn/ca/0b/ca0b80af46a3d94c9a5752752592f9a2_800x600.jpg) 最低每日溫度數據集滯后圖 我們可以看到沿著對角線的大型觀察球。它清楚地顯示了一種關系或某種相關性。 對于任何其他滯后觀察,可以重復此過程,例如,如果我們想要查看過去 7 天或上個月或去年同一天的關系。 我們可以做的另一個快速檢查是直接計算觀察和滯后變量之間的相關性。 我們可以使用像 [Pearson 相關系數](https://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient)這樣的統計檢驗。這產生了一個數字,用于總結兩個變量在-1(負相關)和+1(正相關)之間的相關性,其中小值接近零表示低相關性,高值高于 0.5 或低于-0.5 表示高相關性。 可以使用滯后數據集的 DataFrame 上的 [corr()](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.corr.html)函數輕松計算相關性。 下面的示例創建最小每日溫度數據集的滯后版本,并計算每列與其他列(包括其自身)的相關矩陣。 ```py from pandas import Series from pandas import DataFrame from pandas import concat from matplotlib import pyplot series = Series.from_csv('daily-minimum-temperatures.csv', header=0) values = DataFrame(series.values) dataframe = concat([values.shift(1), values], axis=1) dataframe.columns = ['t-1', 't+1'] result = dataframe.corr() print(result) ``` 這是對上圖的一個很好的確認。 它顯示觀察值與滯后= 1 值之間的強正相關(0.77)。 ```py t-1 t+1 t-1 1.00000 0.77487 t+1 0.77487 1.00000 ``` 這對于一次性檢查很有用,但如果我們想在時間序列中檢查大量滯后變量,則會很繁瑣。 接下來,我們將看一下此方法的擴展版本。 ## 自相關圖 我們可以繪制每個滯后變量的相關系數。 這可以非常快速地了解哪些滯后變量可能是用于預測模型的良好候選者以及觀察值與其歷史值之間的關系如何隨時間變化。 我們可以手動計算每個滯后變量的相關值并繪制結果。值得慶幸的是,Pandas 提供了一個稱為 [autocorrelation_plot()](http://pandas.pydata.org/pandas-docs/version/0.18.1/visualization.html#autocorrelation-plot)函數的內置圖。 該圖提供了沿 x 軸的滯后數和 y 軸上-1 和 1 之間的相關系數值。該圖還包括實線和虛線,表示相關值的 95%和 99%置信區間。這些線上方的相關值比線下方的相關值更重要,為選擇更相關的滯后值提供了閾值或截止值。 ```py from pandas import Series from matplotlib import pyplot from pandas.tools.plotting import autocorrelation_plot series = Series.from_csv('daily-minimum-temperatures.csv', header=0) autocorrelation_plot(series) pyplot.show() ``` 運行該示例顯示了正負相關的擺動,因為溫度值在前一年的夏季和冬季變化。 ![Pandas Autocorrelation Plot](https://img.kancloud.cn/ab/65/ab650829feda53177dde58477f5ffcf9_800x600.jpg) 熊貓自相關圖 statsmodels 庫還在 [plot_acf()](http://statsmodels.sourceforge.net/devel/generated/statsmodels.graphics.tsaplots.plot_acf.html)函數中提供了一個版本的繪圖作為線圖。 ```py from pandas import Series from matplotlib import pyplot from statsmodels.graphics.tsaplots import plot_acf series = Series.from_csv('daily-minimum-temperatures.csv', header=0) plot_acf(series, lags=31) pyplot.show() ``` 在此示例中,我們將評估的滯后變量限制為 31 以便于閱讀。 ![Statsmodels Autocorrelation Plot](https://img.kancloud.cn/8d/4f/8d4fa64f8d27f33202aef0a13b4e1fa4_800x600.jpg) Statsmodels Autocorrelation Plot 現在我們知道如何在時間序列中查看自相關,讓我們看一下使用自回歸建模它。 在我們這樣做之前,讓我們建立基準表現。 ## 持久性模型 假設我們想要開發一個模型來預測所有先前觀察結果中數據集中最近 7 天的最低溫度。 我們可以用來做出預測的最簡單模型是堅持最后一次觀察。我們可以將其稱為持久性模型,它為我們可用于與自回歸模型進行比較的問題提供了表現基準。 我們可以通過將觀察結果分成訓練集和測試集來開發問題的測試工具,只將數據集中的最后 7 個觀察結果分配給測試集作為我們希望預測的“看不見的”數據。 使用前瞻性驗證模型進行預測,以便我們可以保留第二天的最新觀察結果。這意味著我們沒有進行 7 天的預測,而是 7 天的預測。 ```py from pandas import Series from pandas import DataFrame from pandas import concat from matplotlib import pyplot from sklearn.metrics import mean_squared_error series = Series.from_csv('daily-minimum-temperatures.csv', header=0) # create lagged dataset values = DataFrame(series.values) dataframe = concat([values.shift(1), values], axis=1) dataframe.columns = ['t-1', 't+1'] # split into train and test sets X = dataframe.values train, test = X[1:len(X)-7], X[len(X)-7:] train_X, train_y = train[:,0], train[:,1] test_X, test_y = test[:,0], test[:,1] # persistence model def model_persistence(x): return x # walk-forward validation predictions = list() for x in test_X: yhat = model_persistence(x) predictions.append(yhat) test_score = mean_squared_error(test_y, predictions) print('Test MSE: %.3f' % test_score) # plot predictions vs expected pyplot.plot(test_y) pyplot.plot(predictions, color='red') pyplot.show() ``` 運行該示例打印均方誤差(MSE)。 該值為問題提供基準表現。 ```py Test MSE: 3.423 ``` 與模型的預測(紅色)相比,繪制了接下來 7 天的預期值(藍色)。 ![Predictions From Persistence Model](https://img.kancloud.cn/a5/68/a568def073c5dfa09ba387bff7f98439_800x600.jpg) 持久性模型的預測 ## 自回歸模型 自回歸模型是一種線性回歸模型,它使用滯后變量作為輸入變量。 我們可以使用 scikit-learn 中的 LinearRegession 類手動計算線性回歸模型,并手動指定要使用的滯后輸入變量。 或者,statsmodels 庫提供自動回歸模型,該模型使用統計測試自動選擇適當的滯后值并訓練線性回歸模型。它在 [AR 類](http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.ar_model.AR.html)中提供。 我們可以通過首先創建模型 AR()然后調用 fit()來訓練我們的數據集來使用此模型。這將返回 [ARResult](http://statsmodels.sourceforge.net/devel/generated/statsmodels.tsa.ar_model.ARResults.html) 對象。 一旦擬合,我們可以使用該模型通過調用 future()函數來進行預測,以便將來進行大量觀察。這將創建 1 個 7 天預測,這與上面的持久性示例不同。 下面列出了完整的示例。 ```py from pandas import Series from matplotlib import pyplot from statsmodels.tsa.ar_model import AR from sklearn.metrics import mean_squared_error series = Series.from_csv('daily-minimum-temperatures.csv', header=0) # split dataset X = series.values train, test = X[1:len(X)-7], X[len(X)-7:] # train autoregression model = AR(train) model_fit = model.fit() print('Lag: %s' % model_fit.k_ar) print('Coefficients: %s' % model_fit.params) # make predictions predictions = model_fit.predict(start=len(train), end=len(train)+len(test)-1, dynamic=False) for i in range(len(predictions)): print('predicted=%f, expected=%f' % (predictions[i], test[i])) error = mean_squared_error(test, predictions) print('Test MSE: %.3f' % error) # plot results pyplot.plot(test) pyplot.plot(predictions, color='red') pyplot.show() ``` 首先運行該示例在訓練的線性回歸模型中打印所選擇的最佳滯后和系數列表。 我們可以看到選擇并訓練了 29 個滯后模型。考慮到這個滯后與一個月的平均天數有多接近,這很有意思。 然后打印 7 天預測,并總結預測的均方誤差。 ```py Lag: 29 Coefficients: [ 5.57543506e-01 5.88595221e-01 -9.08257090e-02 4.82615092e-02 4.00650265e-02 3.93020055e-02 2.59463738e-02 4.46675960e-02 1.27681498e-02 3.74362239e-02 -8.11700276e-04 4.79081949e-03 1.84731397e-02 2.68908418e-02 5.75906178e-04 2.48096415e-02 7.40316579e-03 9.91622149e-03 3.41599123e-02 -9.11961877e-03 2.42127561e-02 1.87870751e-02 1.21841870e-02 -1.85534575e-02 -1.77162867e-03 1.67319894e-02 1.97615668e-02 9.83245087e-03 6.22710723e-03 -1.37732255e-03] predicted=11.871275, expected=12.900000 predicted=13.053794, expected=14.600000 predicted=13.532591, expected=14.000000 predicted=13.243126, expected=13.600000 predicted=13.091438, expected=13.500000 predicted=13.146989, expected=15.700000 predicted=13.176153, expected=13.000000 Test MSE: 1.502 ``` 繪制預期(藍色)與預測值(紅色)的圖。 預測看起來相當不錯(每天約 1 攝氏度),第 5 天有很大的偏差。 ![Predictions From Fixed AR Model](https://img.kancloud.cn/05/1d/051d308ad78a79c3b2d63c19a75c2f0a_800x600.jpg) 固定 AR 模型的預測 隨著新觀察結果的出現,statsmodels API 無法輕松更新模型。 一種方法是在新的觀察結果可用時每天重新訓練 AR 模型,這可能是一種有效的方法,如果計算成本不高的話。 另一種方法是使用學習的系數并手動進行預測。這要求保留 29 個先前觀察的歷史,并且從模型中檢索系數并在回歸方程中使用以得出新的預測。 系數以陣列形式提供,截距項后跟每個滯后變量的系數,從 t-1 到 t-n 開始。我們只需要按照正確的順序在觀察歷史中使用它們,如下所示: ```py yhat = b0 + b1*X1 + b2*X2 ... bn*Xn ``` 以下是完整的示例。 ```py from pandas import Series from matplotlib import pyplot from statsmodels.tsa.ar_model import AR from sklearn.metrics import mean_squared_error series = Series.from_csv('daily-minimum-temperatures.csv', header=0) # split dataset X = series.values train, test = X[1:len(X)-7], X[len(X)-7:] # train autoregression model = AR(train) model_fit = model.fit() window = model_fit.k_ar coef = model_fit.params # walk forward over time steps in test history = train[len(train)-window:] history = [history[i] for i in range(len(history))] predictions = list() for t in range(len(test)): length = len(history) lag = [history[i] for i in range(length-window,length)] yhat = coef[0] for d in range(window): yhat += coef[d+1] * lag[window-d-1] obs = test[t] predictions.append(yhat) 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() ``` 再次,運行該示例打印預測和均方誤差。 ```py predicted=11.871275, expected=12.900000 predicted=13.659297, expected=14.600000 predicted=14.349246, expected=14.000000 predicted=13.427454, expected=13.600000 predicted=13.374877, expected=13.500000 predicted=13.479991, expected=15.700000 predicted=14.765146, expected=13.000000 Test MSE: 1.451 ``` 在比較錯誤分數時,我們可以看到預測的一個小改進。 ![Predictions From Rolling AR Model](https://img.kancloud.cn/d8/b4/d8b4d53e1b2d86da0c3a84f20e544f34_800x600.jpg) 滾動 AR 模型的預測 ## 進一步閱讀 如果您希望深入研究自相關和自回歸,本節提供了一些資源。 * 維基百科上的 [Autocorrelation](https://en.wikipedia.org/wiki/Autocorrelation) * 維基百科上的 [Autoregressive](https://en.wikipedia.org/wiki/Autoregressive_model) 模型 * 第 7 章 - 基于回歸的模型:自相關和外部信息, [R 實用時間序列預測:動手指南](http://www.amazon.com/dp/0997847913?tag=inspiredalgor-20)。 * 第 4.5 節 - 自回歸模型,[引入時間序列與 R](http://www.amazon.com/dp/0387886974?tag=inspiredalgor-20) 。 ## 摘要 在本教程中,您了解了如何使用 Python 對時間序列數據進行自動回歸預測。 具體來說,你學到了: * 關于自相關和自回歸以及如何使用它們來更好地理解時間序列數據。 * 如何使用圖和統計測試來探索時間序列中的自相關。 * 如何在 Python 中訓練自回歸模型并使用它來進行短期和滾動預測。 您對自回歸或本教程有任何疑問嗎? 在下面的評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看