<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 功能強大 支持多語言、二開方便! 廣告
                # 基于 ARIMA 的 Python 歷史規模敏感性預測技巧分析 > 原文: [https://machinelearningmastery.com/sensitivity-analysis-history-size-forecast-skill-arima-python/](https://machinelearningmastery.com/sensitivity-analysis-history-size-forecast-skill-arima-python/) 時間序列預測模型需要多少歷史記錄? 這是一個特定問題的問題,我們可以通過設計實驗進行調查。 在本教程中,您將發現歷史大小對 Python 中 ARIMA 預測模型技能的影響。 具體來說,在本教程中,您將: * 加載標準數據集并擬合 ARIMA 模型。 * 設計并執行歷史數據年數的敏感性分析,以模擬技能。 * 分析靈敏度分析的結果。 這將提供一個模板,用于對您自己的時間序列預測問題執行歷史數據集大小的類似靈敏度分析。 讓我們開始吧。 * **2017 年 8 月更新**:修正了在原始數據上構建模型的錯誤,而不是季節性差異版本的數據。謝謝 David Ravnsborg! * **更新 June / 2018** :刪除重復的句子。拉胡爾感謝! ![Sensitivity Analysis of History Size to Forecast Skill with ARIMA in Python](https://img.kancloud.cn/78/df/78dffe743e9d092395e52ebcbb8f780c_640x480.jpg) 用 Python 中的 ARIMA 預測技能的歷史大小敏感性分析 照片由 [Sean MacEntee](https://www.flickr.com/photos/smemon/14375447955/) ,保留一些權利。 ## 最低每日溫度數據集 該數據集描述了澳大利亞墨爾本市 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 Name: Temp, dtype: float64 ``` 然后將數據繪制成顯示季節性模式的線圖。 ![Minimum Daily Temperatures Dataset Line Plot](https://img.kancloud.cn/be/ee/beee630761575431c10d8e939cfec3fd_640x480.jpg) 最低每日溫度數據集線圖 ## ARIMA 預測模型 在本節中,我們將 ARIMA 預測模型與數據擬合。 模型的參數不會被調整,但是會很熟練。 數據包含一年的季節性組件,必須將其刪除以使數據固定并適合與 ARIMA 模型一起使用。 我們可以通過從一年前(365 天)減去觀察值來獲取季節性差異。這很粗糙,因為它沒有說明閏年。這也意味著第一年的數據將無法用于建模,因為一年前沒有數據來區分數據。 ```py # seasonal difference differenced = series.diff(365) # trim off the first year of empty data differenced = differenced[365:] ``` 我們將 ARIMA(7,0,0)模型與數據擬合并打印摘要信息。這表明該模型是穩定的。 ```py # fit model model = ARIMA(differenced, order=(7,0,0)) model_fit = model.fit(trend='nc', disp=0) print(model_fit.summary()) ``` 綜合這些,下面列出了完整的例子。 ```py # fit an ARIMA model from pandas import Series from matplotlib import pyplot from statsmodels.tsa.arima_model import ARIMA # load dataset series = Series.from_csv('daily-minimum-temperatures.csv', header=0) # seasonal difference differenced = series.diff(365) # trim off the first year of empty data differenced = series[365:] # fit model model = ARIMA(differenced, order=(7,0,0)) model_fit = model.fit(trend='nc', disp=0) print(model_fit.summary()) ``` 運行該示例提供了適合 ARIMA 模型的摘要。 ```py ARMA Model Results ============================================================================== Dep. Variable: Temp No. Observations: 3285 Model: ARMA(7, 0) Log Likelihood -8690.089 Method: css-mle S.D. of innovations 3.409 Date: Fri, 25 Aug 2017 AIC 17396.178 Time: 15:02:59 BIC 17444.955 Sample: 01-01-1982 HQIC 17413.643 - 12-31-1990 ============================================================================== coef std err z P>|z| [0.025 0.975] ------------------------------------------------------------------------------ ar.L1.Temp 0.5278 0.017 30.264 0.000 0.494 0.562 ar.L2.Temp -0.1099 0.020 -5.576 0.000 -0.149 -0.071 ar.L3.Temp 0.0286 0.020 1.441 0.150 -0.010 0.067 ar.L4.Temp 0.0307 0.020 1.549 0.122 -0.008 0.070 ar.L5.Temp 0.0090 0.020 0.456 0.648 -0.030 0.048 ar.L6.Temp 0.0164 0.020 0.830 0.407 -0.022 0.055 ar.L7.Temp 0.0272 0.017 1.557 0.120 -0.007 0.061 Roots ============================================================================= Real Imaginary Modulus Frequency ----------------------------------------------------------------------------- AR.1 1.3305 -0.0000j 1.3305 -0.0000 AR.2 0.9936 -1.1966j 1.5553 -0.1397 AR.3 0.9936 +1.1966j 1.5553 0.1397 AR.4 -0.2067 -1.7061j 1.7186 -0.2692 AR.5 -0.2067 +1.7061j 1.7186 0.2692 AR.6 -1.7536 -0.8938j 1.9683 -0.4250 AR.7 -1.7536 +0.8938j 1.9683 0.4250 ----------------------------------------------------------------------------- ``` ## 模型歷史敏感性分析 在本節中,我們將探討歷史規模對擬合模型技能的影響。 原始數據有 10 年的數據。季節性差異給我們留下了 9 年的數據。我們將把最后一年的數據作為測試數據,并在最后一年進行前瞻性驗證。 將收集逐日預測并計算均方根誤差(RMSE)分數以指示模型的技能。 下面的代碼段將經季節性調整的數據分為訓練和測試數據集。 ```py train, test = differenced[differenced.index < '1990'], differenced['1990'] ``` 選擇對您自己的預測問題有意義的區間非常重要。 我們將使用前一年的數據評估模型的技能,然后是 2 年,一直追溯到 8 年的歷史數據。 考慮到數據的季節性,一年是測試該數據集的良好間隔,但是可以測試其他間隔,例如每月或多年間隔。 下面的代碼段顯示了我們如何逐年倒退并累積選擇所有可用的觀察結果。 例如 * 測試 1:1989 年的所有數據 * 測試 2:1988 年至 1989 年的所有數據 等等。 ```py # split train, test = differenced[differenced.index < '1990'], differenced['1990'] years = ['1989', '1988', '1987', '1986', '1985', '1984', '1983', '1982'] for year in years: # select data from 'year' cumulative to 1989 dataset = train[train.index >= year] ``` 下一步是評估 ARIMA 模型。 我們將使用前向驗證。這意味著將在選定的歷史數據上構建模型并預測下一個時間步驟(1990 年 1 月 1 日)。對該時間步驟的真實觀察將被添加到歷史中,構建新模型,并預測下一個時間步驟。 預測將一起收集并與觀察的最后一年進行比較,以給出錯誤分數。在這種情況下,RMSE 將用作分數,并且與觀察本身的比例相同。 ```py # walk forward over time steps in test values = dataset.values history = [values[i] for i in range(len(values))] predictions = list() test_values = test.values for t in range(len(test_values)): # fit model model = ARIMA(history, order=(7,0,0)) model_fit = model.fit(trend='nc', disp=0) # make prediction yhat = model_fit.forecast()[0] predictions.append(yhat) history.append(test_values[t]) rmse = sqrt(mean_squared_error(test_values, predictions)) print('%s-%s (%d values) RMSE: %.3f' % (years[0], year, len(values), rmse)) ``` 綜合這些,下面列出了完整的例子。 ```py # fit an ARIMA model from pandas import Series from matplotlib import pyplot from statsmodels.tsa.arima_model import ARIMA from sklearn.metrics import mean_squared_error from math import sqrt # load dataset series = Series.from_csv('daily-minimum-temperatures.csv', header=0) # seasonal difference differenced = series.diff(365) # trim off the first year of empty data differenced = differenced[365:] # split train, test = differenced[differenced.index < '1990'], differenced['1990'] years = ['1989', '1988', '1987', '1986', '1985', '1984', '1983', '1982'] for year in years: # select data from 'year' cumulative to 1989 dataset = train[train.index >= year] # walk forward over time steps in test values = dataset.values history = [values[i] for i in range(len(values))] predictions = list() test_values = test.values for t in range(len(test_values)): # fit model model = ARIMA(history, order=(7,0,0)) model_fit = model.fit(trend='nc', disp=0) # make prediction yhat = model_fit.forecast()[0] predictions.append(yhat) history.append(test_values[t]) rmse = sqrt(mean_squared_error(test_values, predictions)) print('%s-%s (%d values) RMSE: %.3f' % (years[0], year, len(values), rmse)) ``` 運行該示例將打印歷史記錄的間隔,歷史記錄中的觀察次數以及使用該歷史記錄訓練的模型的 RMSE 技能。 該示例確實需要一段時間才能運行,因為為歷史訓練數據的每個累積間隔創建了 365 個 ARIMA 模型。 ```py 1989-1989 (365 values) RMSE: 3.120 1989-1988 (730 values) RMSE: 3.109 1989-1987 (1095 values) RMSE: 3.104 1989-1986 (1460 values) RMSE: 3.108 1989-1985 (1825 values) RMSE: 3.107 1989-1984 (2190 values) RMSE: 3.103 1989-1983 (2555 values) RMSE: 3.099 1989-1982 (2920 values) RMSE: 3.096 ``` 結果表明,隨著可用歷史的大小增加,模型誤差減小,但趨勢不是純線性的。 我們確實看到在 2 - 3 年可能會出現收益遞減點。在數據可用性或長模型訓練時間成為問題的域中,了解您可以使用更少的數據年份非常有用。 我們可以繪制 ARIMA 模型誤差與訓練觀察數量之間的關系。 ```py from matplotlib import pyplot x = [365, 730, 1095, 1460, 1825, 2190, 2555, 2920] y = [3.120, 3.109, 3.104, 3.108, 3.107, 3.103, 3.099, 3.096] pyplot.plot(x, y) pyplot.show() ``` 運行該示例會創建一個繪圖,當訓練樣本增加時,該繪圖幾乎顯示出錯誤的線性趨勢。 ![History Size vs ARIMA Model Error](https://img.kancloud.cn/cf/07/cf07dc8c0405f26f04b46a3e0b7c9679_1280x960.jpg) 歷史大小與 ARIMA 模型錯誤 這通常是預期的,因為更多的歷史數據意味著系數可以被更好地優化以描述在多數情況下來自多年數據的可變性所發生的情況。 還有反直覺。可以預期模型的表現會隨著歷史的增加而增加,因為最近幾年的數據可能更像是明年的數據。這種直覺在受到更大概念漂移的領域中可能更有效。 ## 擴展 本節討論靈敏度分析的限制和擴展。 * **Untuned Model** 。該示例中使用的 ARIMA 模型決不會針對該問題進行調整。理想情況下,將使用已調整的 ARIMA 模型或針對每種情況調整的模型對訓練歷史的大小進行靈敏度分析。 * **統計學意義**。目前尚不清楚模型技能的差異是否具有統計學意義。成對統計顯著性檢驗可用于梳理 RMSE 的差異是否有意義。 * **替代型號**。 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>

                              哎呀哎呀视频在线观看