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

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 如何使用 Python 網格搜索 ARIMA 模型超參數 > 原文: [https://machinelearningmastery.com/grid-search-arima-hyperparameters-with-python/](https://machinelearningmastery.com/grid-search-arima-hyperparameters-with-python/) 用于時間序列分析和預測的 ARIMA 模型可能很難配置。 有 3 個參數需要通過迭代試驗和錯誤來評估診斷圖和使用 40 年的啟發式規則。 我們可以使用網格搜索程序自動化為 ARIMA 模型評估大量超參數的過程。 在本教程中,您將了解如何使用 Python 中的超參數網格搜索來調整 ARIMA 模型。 完成本教程后,您將了解: * 可用于調整 ARIMA 超參數以進行滾動一步預測的一般過程。 * 如何在標準單變量時間序列數據集上應用 ARIMA 超參數優化。 * 擴展程序的想法,以更精細和強大的模型。 讓我們開始吧。 ![How to Grid Search ARIMA Model Hyperparameters with Python](https://img.kancloud.cn/80/f6/80f61002543f747e23ceefa626683c6e_640x428.jpg) 如何使用 Python 網格搜索 ARIMA 模型超參數 照片由 [Alpha](https://www.flickr.com/photos/avlxyz/3825340087/) ,保留一些權利。 ## 網格搜索方法 時間序列的診斷圖可以與啟發式規則一起使用,以確定 ARIMA 模型的超參數。 這些在大多數情況下都很好,但也許并非所有情況都很好。 我們可以在模型超參數的不同組合上自動化訓練和評估 ARIMA 模型的過程。在機器學習中,這稱為網格搜索或模型調整。 在本教程中,我們將開發一種網格搜索 ARIMA 超參數的方法,用于一步滾動預測。 該方法分為兩部分: 1. 評估 ARIMA 模型。 2. 評估 ARIMA 參數集。 本教程中的代碼使用了 scikit-learn,Pandas 和 statsmodels Python 庫。 ### 1.評估 ARIMA 模型 我們可以通過在訓練數據集上準備 ARIMA 模型并評估測試數據集的預測來評估 ARIMA 模型。 此方法包括以下步驟: 1. 將數據集拆分為訓練和測試集。 2. 遍歷測試數據集中的時間步長。 1. 訓練 ARIMA 模型。 2. 進行一步預測。 3. 商店預測;獲取并存儲實際觀察結果。 3. 計算預測的誤差分數與預期值的比較。 我們可以在 Python 中實現這個作為一個名為 _evaluate_arima_model()_ 的新獨立函數,它將時間序列數據集作為輸入,以及 _p_ , _d_ 的元組]和 _q_ 參數用于評估模型。 數據集分為兩部分:初始訓練數據集為 66%,測試數據集為剩余的 34%。 迭代測試集的每個時間步。只需一次迭代就可以提供一個模型,您可以使用該模型對新數據進行預測。迭代方法允許每個步驟訓練新的 ARIMA 模型。 每次迭代都進行預測并存儲在列表中。這樣,在測試集的末尾,可以將所有預測與預期值列表進行比較,并計算出錯誤分數。在這種情況下,計算并返回均方誤差分數。 完整的功能如下所列。 ```py # evaluate an ARIMA model for a given order (p,d,q) def evaluate_arima_model(X, arima_order): # prepare training dataset train_size = int(len(X) * 0.66) train, test = X[0:train_size], X[train_size:] history = [x for x in train] # make predictions predictions = list() for t in range(len(test)): model = ARIMA(history, order=arima_order) model_fit = model.fit(disp=0) yhat = model_fit.forecast()[0] predictions.append(yhat) history.append(test[t]) # calculate out of sample error error = mean_squared_error(test, predictions) return error ``` 現在我們知道如何評估一組 ARIMA 超參數,讓我們看看我們如何重復調用此函數以獲得要評估的參數網格。 ### 2.迭代 ARIMA 參數 評估一組參數相對簡單。 用戶必須指定 _p_ , _d_ 和 _q_ ARIMA 參數的網格進行迭代。通過調用上一節中描述的 _evaluate_arima_model()_ 函數,為每個參數創建模型并評估其表現。 該函數必須跟蹤觀察到的最低錯誤分數和導致它的配置。這可以在函數的末尾進行總結,并打印出標準輸出。 我們可以將這個名為 _evaluate_models()_ 的函數實現為一系列的四個循環。 還有兩個注意事項。第一個是確保輸入數據是浮點值(而不是整數或字符串),因為這可能導致 ARIMA 過程失敗。 其次,statsmodels ARIMA 程序在內部使用數值優化程序來為模型找到一組系數。這些過程可能會失敗,從而可能會引發異常。我們必須捕獲這些異常并跳過導致問題的配置。這種情況經常發生,你會想到。 此外,建議忽略此代碼的警告,以避免運行該過程產生大量噪音。這可以按如下方式完成: ```py import warnings warnings.filterwarnings("ignore") ``` 最后,即使有了所有這些保護,底層的 C 和 Fortran 庫仍然可以向標準輸出報告警告,例如: ```py ** On entry to DLASCL, parameter number 4 had an illegal value ``` 為簡潔起見,這些內容已從本教程中報告的結果中刪除。 下面列出了評估 ARIMA 超參數網格的完整過程。 ```py # evaluate combinations of p, d and q values for an ARIMA model def evaluate_models(dataset, p_values, d_values, q_values): dataset = dataset.astype('float32') best_score, best_cfg = float("inf"), None for p in p_values: for d in d_values: for q in q_values: order = (p,d,q) try: mse = evaluate_arima_model(dataset, order) if mse < best_score: best_score, best_cfg = mse, order print('ARIMA%s MSE=%.3f' % (order,mse)) except: continue print('Best ARIMA%s MSE=%.3f' % (best_cfg, best_score)) ``` 現在我們有一個網格搜索 ARIMA 超參數的過程,讓我們測試兩個單變量時間序列問題的過程。 我們將從 Shampoo Sales 數據集開始。 ## 洗發水銷售案例研究 Shampoo Sales 數據集描述了 3 年期間每月洗發水的銷售數量。 單位是銷售計數,有 36 個觀察。原始數據集歸功于 Makridakis,Wheelwright 和 Hyndman(1998)。 [從這里了解有關數據集的更多信息](https://datamarket.com/data/set/22r0/sales-of-shampoo-over-a-three-year-period)。 下載數據集并將其放入當前工作目錄,文件名為“ _shampoo-sales.csv_ ”。 時間系列中的時間戳不包含絕對年份組件。從 1900 年開始加載數據和基線時,我們可以使用自定義日期解析功能,如下所示: ```py # load dataset 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) ``` 加載后,我們可以指定 _p_ , _d_ 和 _q_ 值的位點進行搜索并將它們傳遞給 _evaluate_models()_ 功能。 我們將嘗試一組滯后值( _p_ )和一些差異迭代( _d_ )和殘余誤差滯后值( _q_ )。 ```py # evaluate parameters p_values = [0, 1, 2, 4, 6, 8, 10] d_values = range(0, 3) q_values = range(0, 3) warnings.filterwarnings("ignore") evaluate_models(series.values, p_values, d_values, q_values) ``` 將這一切與上一節中定義的通用程序結合起來,我們可以在 Shampoo Sales 數據集中搜索 ARIMA 超參數。 完整的代碼示例如下所示。 ```py import warnings from pandas import read_csv from pandas import datetime from statsmodels.tsa.arima_model import ARIMA from sklearn.metrics import mean_squared_error # evaluate an ARIMA model for a given order (p,d,q) def evaluate_arima_model(X, arima_order): # prepare training dataset train_size = int(len(X) * 0.66) train, test = X[0:train_size], X[train_size:] history = [x for x in train] # make predictions predictions = list() for t in range(len(test)): model = ARIMA(history, order=arima_order) model_fit = model.fit(disp=0) yhat = model_fit.forecast()[0] predictions.append(yhat) history.append(test[t]) # calculate out of sample error error = mean_squared_error(test, predictions) return error # evaluate combinations of p, d and q values for an ARIMA model def evaluate_models(dataset, p_values, d_values, q_values): dataset = dataset.astype('float32') best_score, best_cfg = float("inf"), None for p in p_values: for d in d_values: for q in q_values: order = (p,d,q) try: mse = evaluate_arima_model(dataset, order) if mse < best_score: best_score, best_cfg = mse, order print('ARIMA%s MSE=%.3f' % (order,mse)) except: continue print('Best ARIMA%s MSE=%.3f' % (best_cfg, best_score)) # load dataset 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) # evaluate parameters p_values = [0, 1, 2, 4, 6, 8, 10] d_values = range(0, 3) q_values = range(0, 3) warnings.filterwarnings("ignore") evaluate_models(series.values, p_values, d_values, q_values) ``` 運行該示例將為每個成功完成的評估打印 ARIMA 參數和 MSE。 ARIMA(4,2,1)的最佳參數在運行結束時報告,均方誤差為 4,694.873。 ```py ARIMA(0, 0, 0) MSE=52425.268 ARIMA(0, 0, 1) MSE=38145.167 ARIMA(0, 0, 2) MSE=23989.567 ARIMA(0, 1, 0) MSE=18003.173 ARIMA(0, 1, 1) MSE=9558.410 ARIMA(0, 2, 0) MSE=67339.808 ARIMA(0, 2, 1) MSE=18323.163 ARIMA(1, 0, 0) MSE=23112.958 ARIMA(1, 1, 0) MSE=7121.373 ARIMA(1, 1, 1) MSE=7003.683 ARIMA(1, 2, 0) MSE=18607.980 ARIMA(2, 1, 0) MSE=5689.932 ARIMA(2, 1, 1) MSE=7759.707 ARIMA(2, 2, 0) MSE=9860.948 ARIMA(4, 1, 0) MSE=6649.594 ARIMA(4, 1, 1) MSE=6796.279 ARIMA(4, 2, 0) MSE=7596.332 ARIMA(4, 2, 1) MSE=4694.873 ARIMA(6, 1, 0) MSE=6810.080 ARIMA(6, 2, 0) MSE=6261.107 ARIMA(8, 0, 0) MSE=7256.028 ARIMA(8, 1, 0) MSE=6579.403 Best ARIMA(4, 2, 1) MSE=4694.873 ``` ## 每日女性出生案例研究 每日女性出生數據集描述了 1959 年加利福尼亞州每日女性出生人數。 單位是計數,有 365 個觀測值。數據集的來源歸功于 Newton(1988)。 [在此處了解有關數據集的更多信息](https://datamarket.com/data/set/235k/daily-total-female-births-in-california-1959)。 下載數據集并將其放在當前工作目錄中,文件名為“ _daily-total-female-births.csv_ ”。 此數據集可以直接作為 Pandas 系列輕松加載。 ```py # load dataset series = Series.from_csv('daily-total-female-births.csv', header=0) ``` 為了簡單起見,我們將探索與上一節中相同的 ARIMA 超參數網格。 ```py # evaluate parameters p_values = [0, 1, 2, 4, 6, 8, 10] d_values = range(0, 3) q_values = range(0, 3) warnings.filterwarnings("ignore") evaluate_models(series.values, p_values, d_values, q_values) ``` 綜上所述,我們可以在 Daily Female Births 數據集上搜索 ARIMA 參數。完整的代碼清單如下。 ```py import warnings from pandas import Series from statsmodels.tsa.arima_model import ARIMA from sklearn.metrics import mean_squared_error # evaluate an ARIMA model for a given order (p,d,q) def evaluate_arima_model(X, arima_order): # prepare training dataset train_size = int(len(X) * 0.66) train, test = X[0:train_size], X[train_size:] history = [x for x in train] # make predictions predictions = list() for t in range(len(test)): model = ARIMA(history, order=arima_order) model_fit = model.fit(disp=0) yhat = model_fit.forecast()[0] predictions.append(yhat) history.append(test[t]) # calculate out of sample error error = mean_squared_error(test, predictions) return error # evaluate combinations of p, d and q values for an ARIMA model def evaluate_models(dataset, p_values, d_values, q_values): dataset = dataset.astype('float32') best_score, best_cfg = float("inf"), None for p in p_values: for d in d_values: for q in q_values: order = (p,d,q) try: mse = evaluate_arima_model(dataset, order) if mse < best_score: best_score, best_cfg = mse, order print('ARIMA%s MSE=%.3f' % (order,mse)) except: continue print('Best ARIMA%s MSE=%.3f' % (best_cfg, best_score)) # load dataset series = Series.from_csv('daily-total-female-births.csv', header=0) # evaluate parameters p_values = [0, 1, 2, 4, 6, 8, 10] d_values = range(0, 3) q_values = range(0, 3) warnings.filterwarnings("ignore") evaluate_models(series.values, p_values, d_values, q_values) ``` 運行該示例將為成功評估的每個配置打印 ARIMA 參數和均方誤差。 最佳平均參數報告為 ARIMA(6,1,0),均方誤差為 53.187。 ```py ARIMA(0, 0, 0) MSE=67.063 ARIMA(0, 0, 1) MSE=62.165 ARIMA(0, 0, 2) MSE=60.386 ARIMA(0, 1, 0) MSE=84.038 ARIMA(0, 1, 1) MSE=56.653 ARIMA(0, 1, 2) MSE=55.272 ARIMA(0, 2, 0) MSE=246.414 ARIMA(0, 2, 1) MSE=84.659 ARIMA(1, 0, 0) MSE=60.876 ARIMA(1, 1, 0) MSE=65.928 ARIMA(1, 1, 1) MSE=55.129 ARIMA(1, 1, 2) MSE=55.197 ARIMA(1, 2, 0) MSE=143.755 ARIMA(2, 0, 0) MSE=59.251 ARIMA(2, 1, 0) MSE=59.487 ARIMA(2, 1, 1) MSE=55.013 ARIMA(2, 2, 0) MSE=107.600 ARIMA(4, 0, 0) MSE=59.189 ARIMA(4, 1, 0) MSE=57.428 ARIMA(4, 1, 1) MSE=55.862 ARIMA(4, 2, 0) MSE=80.207 ARIMA(6, 0, 0) MSE=58.773 ARIMA(6, 1, 0) MSE=53.187 ARIMA(6, 1, 1) MSE=57.055 ARIMA(6, 2, 0) MSE=69.753 ARIMA(8, 0, 0) MSE=56.984 ARIMA(8, 1, 0) MSE=57.290 ARIMA(8, 2, 0) MSE=66.034 ARIMA(8, 2, 1) MSE=57.884 ARIMA(10, 0, 0) MSE=57.470 ARIMA(10, 1, 0) MSE=57.359 ARIMA(10, 2, 0) MSE=65.503 ARIMA(10, 2, 1) MSE=57.878 ARIMA(10, 2, 2) MSE=58.309 Best ARIMA(6, 1, 0) MSE=53.187 ``` ## 擴展 本教程中使用的網格搜索方法很簡單,可以輕松擴展。 本節列出了一些擴展您可能希望探索的方法的想法。 * **種子網格**。 ACF 和 PACF 圖的經典診斷工具仍然可以與用于搜索 ARIMA 參數網格的結果一起使用。 * **替代措施**。搜索旨在優化樣本外均方誤差。這可以更改為另一個樣本外統計數據,樣本內統計數據,如 AIC 或 BIC,或兩者的某種組合。您可以選擇對項目最有意義的指標。 * **剩余診斷**。可以自動計算殘差預測誤差的統計數據,以提供擬合質量的附加指示。例子包括殘差分布是否為高斯分布以及殘差中是否存在自相關的統計檢驗。 * **更新模型**。 ARIMA 模型是從頭開始為每個一步預測創建的。通過仔細檢查 API,可以使用新的觀察更新模型的內部數據,而不是從頭開始重新創建。 * **前提條件**。 ARIMA 模型可以對時間序列數據集做出假設,例如正態性和平穩性。可以檢查這些,并在訓練給定模型之前針對給定的數據集引發警告。 ## 摘要 在本教程中,您了解了如何在 Python 中搜索 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>

                              哎呀哎呀视频在线观看