<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/tune-arima-parameters-python/](https://machinelearningmastery.com/tune-arima-parameters-python/) 在 Python 中使用 Statsmodels 配置 ARIMA 模型時,需要考慮許多參數。 在本教程中,我們將介紹一些您可能對此感興趣的關鍵參數(除了 order 參數之外)。 具體來說,完成本教程后,您將了解: * 如何在擬合 ARIMA 模型時抑制基礎數學庫的噪聲輸出。 * 在 ARIMA 模型中啟用或禁用趨勢術語的效果。 * 使用不同的數學求解器將系數擬合到訓練數據的影響。 注意,如果您對調整 order 參數感興趣,請參閱帖子: * [如何使用 Python 網格搜索 ARIMA 模型超參數](http://machinelearningmastery.com/grid-search-arima-hyperparameters-with-python/) 讓我們開始吧。 ## 洗發水銷售數據集 該數據集描述了 3 年期間每月洗發水的銷售數量。 單位是銷售計數,有 36 個觀察。原始數據集歸功于 Makridakis,Wheelwright 和 Hyndman(1998)。 [您可以在此處下載并了解有關數據集的更多信息](https://datamarket.com/data/set/22r0/sales-of-shampoo-over-a-three-year-period)。 下面的示例加載并創建已加載數據集的圖。 ```py # load and plot dataset from pandas import read_csv from pandas import datetime from matplotlib import pyplot # 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) # summarize first few rows print(series.head()) # line plot series.plot() pyplot.show() ``` 運行該示例將數據集作為 Pandas Series 加載并打印前 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 ``` 然后創建該系列的線圖,顯示明顯的增加趨勢。 ![Line Plot of Monthly Shampoo Sales Dataset](https://img.kancloud.cn/11/f1/11f11d2a2ec40c7c0724e4e09f11a4ca_640x480.jpg) 每月洗發水銷售數據集的線圖 ## 實驗測試 - 設置 一致地評估時間序列預測模型非常重要。 在本節中,我們將定義如何評估本教程中的三個預測模型。 首先,我們將保留最后一年的數據并評估此數據的預測。鑒于數據是每月一次,這意味著最后 12 個觀測值將用作測試數據。 我們將使用前瞻性驗證方法來評估模型表現。這意味著將枚舉測試數據集中的每個時間步,在歷史數據上構建模型,并將預測與預期值進行比較。然后將觀察結果添加到訓練數據集中并重復該過程。 前瞻性驗證是評估時間序列預測模型的現實方法,因為人們可以期望在新觀察結果可用時更新模型。 最后,將使用均方根誤差或 RMSE 來評估預測。 RMSE 的好處在于它會對大錯誤進行處罰,并且得分與預測值(每月汽車銷售額)的單位相同。 ARIMA(4,1,0)預測模型將用作探索模型的其他參數的基線。這可能不是該問題的最佳模型,但通常對某些其他手動測試配置非常熟練。 總之,測試工具包括: * 最近 2 年的數據使用了測試集。 * 模型評估的前瞻性驗證。 * 用于報告模型技能的均方根誤差。 * ARIMA(4,1,0)模型將用作基線。 下面列出了完整的示例。 ```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 from math import sqrt # 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) # split into train and test sets X = series.values train, test = X[0:-12], X[-12:] history = [x for x in train] predictions = list() # walk-forward validation for t in range(len(test)): # fit model model = ARIMA(history, order=(4,1,0)) model_fit = model.fit() # one step forecast yhat = model_fit.forecast()[0] # store forecast and ob predictions.append(yhat) history.append(test[t]) # evaluate forecasts rmse = sqrt(mean_squared_error(test, predictions)) print('Test RMSE: %.3f' % rmse) # plot forecasts against actual outcomes pyplot.plot(test) pyplot.plot(predictions, color='red') pyplot.show() ``` 運行該示例會發出大量的收斂信息并完成 RMSE 評分為每月 84.832 的洗發水銷售額。 ```py ... Tit = total number of iterations Tnf = total number of function evaluations Tnint = total number of segments explored during Cauchy searches Skip = number of BFGS updates skipped Nact = number of active bounds at final generalized Cauchy point Projg = norm of the final projected gradient F = final function value * * * N Tit Tnf Tnint Skip Nact Projg F 5 15 20 1 0 0 8.882D-08 5.597D+00 F = 5.5972342395324288 CONVERGENCE: REL_REDUCTION_OF_F_<=_FACTR*EPSMCH Cauchy time 0.000E+00 seconds. Subspace minimization time 0.000E+00 seconds. Line search time 0.000E+00 seconds. Total User time 0.000E+00 seconds. Test RMSE: 84.832 ``` 創建預測與測試工具中實際觀測的關系圖,為我們正在使用的模型提供一些上下文。 ![ARIMA Forecast for Monthly Shampoo Sales Dataset](https://img.kancloud.cn/96/88/96888ad2a65e13ce68f851b745e0b24e_640x480.jpg) ARIMA 月度洗發水銷售數據集預測 現在讓我們深入研究一些其他 ARIMA 參數。 ## “ _disp_ ”參數 我們將看到的第一個參數是 _disp_ 參數。 這描述如下: > 如果為 True,則打印收斂信息。對于默認的 l_bfgs_b 求解器,disp 在迭代期間控制輸出的頻率。 disp&lt; 0 表示在這種情況下沒有輸出。 默認情況下,此參數設置為 1,顯示輸出。 我們首先要處理這個問題,因為在使用前向驗證評估 ARIMA 模型時,刪除所有收斂輸出至關重要。 設置為 _False_ 會關閉所有這些噪音。 下面列出了完整的示例。 ```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 from math import sqrt # 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) # split into train and test sets 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() # walk-forward validation for t in range(len(test)): # fit model model = ARIMA(history, order=(4,1,0)) model_fit = model.fit(disp=False) # one step forecast yhat = model_fit.forecast()[0] # store forecast and ob predictions.append(yhat) history.append(test[t]) # evaluate forecasts rmse = sqrt(mean_squared_error(test, predictions)) print('Test RMSE: %.3f' % rmse) ``` 運行此示例不僅可以生成更清晰的輸出,而且執行速度也快得多。 ```py Test RMSE: 81.545 ``` 我們將在以下所有示例中留下 _disp = False_ 。 ## “ _transparams_ ”參數 此參數控制是否對 AR 參數執行變換。 具體來說,它被描述為: > 是否轉換參數以確保平穩性。使用 Jones(1980)中提出的轉換。如果為假,則不檢查平穩性或可逆性。 默認情況下, _transparams_ 設置為 _True_ ,表示執行此轉換。 此參數也用于 ARIMA 實現的 R 版本([參見 docs](http://stat.ethz.ch/R-manual/R-devel/library/stats/html/arima.html) ),我希望這就是它在 statsmodels 中的原因。 statsmodels doco 在這方面很弱,但您可以在論文中了解有關轉換的更多信息: * [ARMA 模型對具有缺失觀測值的時間序列的最大似然擬合](http://www.tandfonline.com/doi/abs/10.1080/00401706.1980.10486171) 以下示例演示了關閉此參數。 ```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 from math import sqrt # 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) # split into train and test sets 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() # walk-forward validation for t in range(len(test)): # fit model model = ARIMA(history, order=(4,1,0)) model_fit = model.fit(disp=False, transparams=False) # one step forecast yhat = model_fit.forecast()[0] # store forecast and ob predictions.append(yhat) history.append(test[t]) # evaluate forecasts rmse = sqrt(mean_squared_error(test, predictions)) print('Test RMSE: %.3f' % rmse) ``` 運行此示例會導致解算器收到更多收斂警告。 關閉 _transparams_ 的模型的 RMSE 也會導致該數據集的結果略差。 在數據集上打開和關閉此參數并確認它會帶來好處。 ```py ... .../site-packages/statsmodels/base/model.py:496: ConvergenceWarning: Maximum Likelihood optimization failed to converge. Check mle_retvals "Check mle_retvals", ConvergenceWarning) Test RMSE: 81.778 ``` ## “_ 趨勢 _”參數 _ 趨勢 _ 參數為模型添加了一個額外的常數項。可以把它想象成偏見或攔截術語。 它被描述為: > 是否包含常數。 'c'包括常數,'nc'沒有常量。 默認情況下,在 _ 趨勢 _ 設置為' _c_ '時啟用趨勢項。 如果我們重新運行原始示例并打印前向驗證的每個步驟的模型系數并將其與關閉的趨勢項進行比較,我們可以清楚地看到效果。 下面的示例在每次迭代時打印系數,并啟用趨勢常量(默認值)。 ```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 from math import sqrt # 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) # split into train and test sets 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() # walk-forward validation for t in range(len(test)): # fit model model = ARIMA(history, order=(4,1,0)) model_fit = model.fit(disp=False, trend='c') print(model_fit.params) # one step forecast yhat = model_fit.forecast()[0] # store forecast and ob predictions.append(yhat) history.append(test[t]) # evaluate forecasts rmse = sqrt(mean_squared_error(test, predictions)) print('Test RMSE: %.3f' % rmse) ``` 運行該示例顯示按模型順序指定的 4 個 AR 項加上數組中的第一個項,這是趨勢常量。 請注意,為每個模型擬合打印一組參數,一個用于前進驗證的每個步驟。 ```py ... [ 11.42283717 -1.16087885 -0.6519841 -0.547411 -0.28820764] [ 11.75656838 -1.11443479 -0.61607471 -0.49084722 -0.24452864] [ 11.40486702 -1.11705478 -0.65344924 -0.50213939 -0.25677931] Test RMSE: 81.545 ``` 我們可以在禁用趨勢項( _trend ='nc'_)的情況下重復此實驗,如下所示。 ```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 from math import sqrt # 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) # split into train and test sets 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() # walk-forward validation for t in range(len(test)): # fit model model = ARIMA(history, order=(4,1,0)) model_fit = model.fit(disp=False, trend='nc') print(model_fit.params) # one step forecast yhat = model_fit.forecast()[0] # store forecast and ob predictions.append(yhat) history.append(test[t]) # evaluate forecasts rmse = sqrt(mean_squared_error(test, predictions)) print('Test RMSE: %.3f' % rmse) ``` 運行該示例顯示此問題的 RMSE 得分略差,具有此 ARIMA 配置。 我們可以看到每次迭代從系數數組中移除常數項(11.xxx)。 ```py ... [-0.90717131 -0.22332019 -0.11240858 -0.04008561] [-0.88836083 -0.21098412 -0.09046333 -0.02121404] [-0.89260136 -0.24120301 -0.10243393 -0.03165432] Test RMSE: 95.061 ``` 試驗您自己的問題并確定此常量是否可以提高表現。 我自己的實驗表明 ARIMA 模型可能不太可能收斂 _ 趨勢 _ 術語禁用,特別是當使用超過零 MA 術語時。 ## “_ 求解器 _”參數 _ 求解器 _ 參數指定數值優化方法以使系數適合數據。 如果您有大量數據,除了執行速度之外,通常沒有理由調整此參數。差異可能很小。 該參數描述如下: > 要使用的解算器。默認為'lbfgs'(有限的內存 Broyden-Fletcher-Goldfarb-Shanno)。其他選擇是'bfgs','newton'(Newton-Raphson),'nm'(Nelder-Mead),'cg' - (共軛梯度),'ncg'(非共軛梯度)和'powell'。默認情況下,有限內存 BFGS 使用 m = 12 來近似 Hessian,投影梯度容差為 1e-8,factr = 1e2。您可以使用 kwargs 更改這些內容。 默認為快速“ _lbfgs_ ”方法([限制內存 BFGS](https://en.wikipedia.org/wiki/Limited-memory_BFGS) )。 然而,下面是一個比較 RMSE 模型技能和每個求解器執行時間的實驗。 ```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 from math import sqrt from time import time # 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) # split into train and test sets X = series.values size = int(len(X) * 0.66) train, test = X[0:size], X[size:len(X)] # solvers solvers = ['lbfgs', 'bfgs', 'newton', 'nm', 'cg', 'ncg', 'powell'] scores = [] times = [] for solver in solvers: start_time = time() history = [x for x in train] predictions = list() # walk-forward validation for t in range(len(test)): # fit model model = ARIMA(history, order=(4,1,0)) model_fit = model.fit(disp=False, solver=solver) # one step forecast yhat = model_fit.forecast()[0] # store forecast and ob predictions.append(yhat) history.append(test[t]) # evaluate forecasts rmse = sqrt(mean_squared_error(test, predictions)) timing = time() - start_time scores.append(rmse) times.append(timing) print('Solver=%s, Test RMSE: %.3f, Time=%f' % (solver, rmse, timing)) # plot scores ticks = [i for i in range(len(solvers))] pyplot.bar(ticks, scores) pyplot.xticks(ticks, solvers) pyplot.show() # plot times ticks = [i for i in range(len(solvers))] pyplot.bar(ticks, times) pyplot.xticks(ticks, solvers) pyplot.show() ``` 運行該示例將打印每個 _ 解算器 _ 的 RMSE 和時間(以秒為單位)。 ```py Solver=lbfgs, Test RMSE: 81.545, Time=1.630316 Solver=bfgs, Test RMSE: 81.545, Time=2.122630 Solver=newton, Test RMSE: 81.545, Time=2.418718 Solver=nm, Test RMSE: 81.472, Time=1.432801 Solver=cg, Test RMSE: 81.543, Time=3.474055 Solver=ncg, Test RMSE: 81.545, Time=2.643767 Solver=powell, Test RMSE: 81.704, Time=1.839257 ``` 提供了 _ 求解器 _ 與 RMSE 的關系圖。正如預期的那樣,這個小數據集上的求解器之間幾乎沒有差別。 您可能會在自己的問題上看到不同的結果或解算器的不同穩定性。 ![ARIMA Model Error vs Solver](https://img.kancloud.cn/2d/8a/2d8ac47719deee074eb8cd742543c89f_640x480.jpg) ARIMA 模型誤差(測試 RMSE)與求解器 還創建了 _ 求解器 _ 與執行時間(以秒為單位)的圖表。該圖顯示了求解器之間的顯著差異。 通常,“ _lbfgs_ ”和“ _bfgs_ ”在速度,表現和穩定性之間提供了良好的實際權衡。 ![ARIMA Execution Time vs Solver](https://img.kancloud.cn/61/90/619027e9a5c60ef095c41b16623bed82_640x480.jpg) ARIMA 執行時間(秒)vs Solver 如果你決定測試求解器,你可能還想改變“ _maxiter_ ”來限制收斂前的迭代次數,“ _tol_ ”參數定義精度收斂,以及定義被優化的成本函數的“_ 方法 _”參數。 ## 其他資源 本節列出了您可能會發現本教程中有用的一些資源。 * [ARIMA Class API](http://statsmodels.sourceforge.net/stable/generated/statsmodels.tsa.arima_model.ARIMA.html) * [ARIMAResults Class API](http://statsmodels.sourceforge.net/stable/generated/statsmodels.tsa.arima_model.ARIMA.fit.html) * [ARIMA 和 ARIMAResults 類](https://github.com/statsmodels/statsmodels/blob/master/statsmodels/tsa/ar_model.py)的源代碼。 * [如何使用 Python 網格搜索 ARIMA 模型超參數](http://machinelearningmastery.com/grid-search-arima-hyperparameters-with-python/) ## 摘要 在本教程中,您發現了使用 Python 中的 Statsmodels 配置 ARIMA 模型的一些細節。 具體來說,你學到了: * 如何在擬合系數時關閉求解器的噪聲收斂輸出。 * 如何評估不同求解器之間的差異以適合您的 ARIMA 模型。 * 在 ARIMA 模型中啟用和禁用趨勢術語的效果。 您對在 Python 中使用 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>

                              哎呀哎呀视频在线观看