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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                # 使用 Python 進行季節性持久性預測 > 原文: [https://machinelearningmastery.com/seasonal-persistence-forecasting-python/](https://machinelearningmastery.com/seasonal-persistence-forecasting-python/) 通常使用[持久性或樸素預測](http://machinelearningmastery.com/persistence-time-series-forecasting-with-python/)作為時間序列問題的首次預測。 對具有季節性成分的時間序列數據進行更好的首次預測是在上一季中同時持續觀察。這稱為季節性持久性。 在本教程中,您將了解如何在 Python 中實現時間序列預測的季節性持久性。 完成本教程后,您將了解: * 如何使用前幾季的點觀察來進行持久性預測。 * 如何在前一季的滑動窗口中使用平均觀測值來進行持久性預測。 * 如何應用和評估每月和每日時間序列數據的季節性持久性。 讓我們開始吧。 ## 季節性持久性 在轉向更復雜的方法之前,對時間序列問題進行有用的首次預測至關重要,以提供較低的技能。 這是為了確保我們不會在不具有預測性的模型或數據集上浪費時間。 在時間序列預測時,通常使用持久性或樸素預測作為首次預測模型。 對于具有明顯季節性成分的時間序列數據,這沒有意義。對于季節性數據,更好的第一次切割模型是在前一季節周期中同時使用觀察作為預測。 我們可以稱之為“_ 季節性持久性 _”,它是一個簡單的模型,可以產生有效的第一次切割模型。 更好的一步是在之前的季節周期中同時使用最后幾個觀測值的簡單函數。例如,觀察的平均值。這通常可以提供一些額外的好處。 在本教程中,我們將演示這種簡單的季節性持久性預測方法,用于在三個不同的真實時間序列數據集上提供預測技能的下限。 ## 滑動窗的季節性持久性 在本教程中,我們將使用滑動窗口季節性持久性模型進行預測。 在滑動窗口內,將收集前一年季節中同時的觀測結果,這些觀測結果的平均值可用作持續預測。 可以評估不同的窗口大小以找到最小化錯誤的組合。 例如,如果數據是每月且預測的月份是 2 月,那么使用大小為 1 的窗口( _w = 1_ ),將使用去年 2 月的觀察值來進行預測。 一個大小為 2 的窗口( _w = 2_ )將涉及對最后兩個 Februaries 進行平均觀察并用作預測。 另一種解釋可能尋求使用前幾年的點觀測值(例如每月數據的 t-12,t-24 等),而不是采用累積點觀測值的平均值。也許在您的數據集上嘗試兩種方法,看看哪種方法最適合作為一個好的起點模型。 ## 實驗測試線束 一致地評估時間序列預測模型非常重要。 在本節中,我們將定義如何在本教程中評估預測模型。 首先,我們將保留最近兩年的數據,并評估對這些數據的預測。這適用于我們將查看的每月和每日數據。 我們將使用前向驗證來評估模型表現。這意味著將枚舉測試數據集中的每個時間步,在歷史數據上構建模型,并將預測與預期值進行比較。然后將觀察結果添加到訓練數據集中并重復該過程。 前瞻性驗證是評估時間序列預測模型的現實方法,因為人們可以期望在新觀察結果可用時更新模型。 最后,將使用均方根誤差或 RMSE 來評估預測。 RMSE 的好處在于它會對大錯誤進行處罰,并且得分與預測值(每月汽車銷售額)的單位相同。 總之,測試工具包括: * 最近 2 年的數據用作測試集。 * 模型評估的前瞻性驗證。 * 用于報告模型技能的均方根誤差。 ## 案例研究 1:每月汽車銷售數據集 月度汽車銷售數據集描述了 1960 年至 1968 年間加拿大魁北克省的汽車銷售數量。 單位是銷售數量的計數,有 108 個觀察值。數據來源歸功于 Abraham 和 Ledolter(1983)。 [您可以從 DataMarket](https://datamarket.com/data/set/22n4/monthly-car-sales-in-quebec-1960-1968) 下載數據集。 下載數據集并將其保存到當前工作目錄中,文件名為“ _car-sales.csv_ ”。請注意,您可能需要從文件中刪除頁腳信息。 下面的代碼將數據集加載為 Pandas Series 對象。 ```py # line plot of time series from pandas import Series from matplotlib import pyplot # load dataset series = Series.from_csv('car-sales.csv', header=0) # display first few rows print(series.head(5)) # line plot of dataset series.plot() pyplot.show() ``` 運行該示例將打印前 5 行數據。 ```py Month 1960-01-01 6550 1960-02-01 8728 1960-03-01 12026 1960-04-01 14395 1960-05-01 14587 Name: Sales, dtype: int64 ``` 還提供了數據的線圖。我們可以看到年度季節性成分和增長趨勢。 ![Line Plot of Monthly Car Sales Dataset](https://img.kancloud.cn/4f/80/4f802614dbeda4249009f10b0305644c_640x480.jpg) 月度汽車銷售數據集的線圖 之前 24 個月的數據將作為測試數據保留。我們將用 1 至 5 年的滑動窗口調查季節性持久性。 下面列出了完整的示例。 ```py from pandas import Series from sklearn.metrics import mean_squared_error from math import sqrt from numpy import mean from matplotlib import pyplot # load data series = Series.from_csv('car-sales.csv', header=0) # prepare data X = series.values train, test = X[0:-24], X[-24:] # evaluate mean of different number of years years = [1, 2, 3, 4, 5] scores = list() for year in years: # walk-forward validation history = [x for x in train] predictions = list() for i in range(len(test)): # collect obs obs = list() for y in range(1, year+1): obs.append(history[-(y*12)]) # make prediction yhat = mean(obs) predictions.append(yhat) # observation history.append(test[i]) # report performance rmse = sqrt(mean_squared_error(test, predictions)) scores.append(rmse) print('Years=%d, RMSE: %.3f' % (year, rmse)) pyplot.plot(years, scores) pyplot.show() ``` 運行該示例從前幾年同一月的觀察滑動窗口打印年份數和平均觀測值的 RMSE。 結果表明,采用過去三年的平均值是一個良好的起始模型,汽車銷售的 RMSE 為 1803.630。 ```py Years=1, RMSE: 1997.732 Years=2, RMSE: 1914.911 Years=3, RMSE: 1803.630 Years=4, RMSE: 2099.481 Years=5, RMSE: 2522.235 ``` 創建滑動窗口大小與模型錯誤的關系圖。 該圖很好地顯示了滑動窗口大小為 3 年的改進,然后是從那一點開始的誤差的快速增加。 ![Sliding Window Size to RMSE for Monthly Car Sales](https://img.kancloud.cn/8a/1f/8a1fbf011e3ee2e3e64ec4b9384bb1cc_640x480.jpg) 每月汽車銷售的窗口大小滑動到 RMSE ## 案例研究 2:每月書面紙銷售數據集 每月書寫紙銷售數據集描述了專業書寫紙銷售的數量。 單位是銷售數量的一種類型,有 147 個月的觀察(僅超過 12 年)。計數是分數,表明數據實際上可能以數十萬銷售為單位。數據來源歸功于 Makridakis 和 Wheelwright(1989)。 [您可以從 DataMarket](https://datamarket.com/data/set/22sc/cfe-specialty-writing-papers-monthly-sales) 下載數據集。 下載數據集并將其保存到當前工作目錄中,文件名為“ _writing-paper-sales.csv_ ”。請注意,您可能需要從文件中刪除頁腳信息。 日期時間戳僅包含年份編號和月份。因此,需要自定義日期時間解析功能來加載數據并將數據基于任意年份。選擇 1900 年作為起點,這不應影響本案例研究。 下面的示例將每月書寫紙銷售數據集加載為 Pandas 系列。 ```py # load and plot dataset from pandas import read_csv from pandas import datetime from matplotlib import pyplot # load dataset def parser(x): if len(x) == 4: return datetime.strptime('190'+x, '%Y-%m') return datetime.strptime('19'+x, '%Y-%m') series = read_csv('writing-paper-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() ``` 運行該示例將打印已加載數據集的前 5 行。 ```py Month 1901-01-01 1359.795 1901-02-01 1278.564 1901-03-01 1508.327 1901-04-01 1419.710 1901-05-01 1440.510 ``` 然后創建加載的數據集的線圖。我們可以看到年度季節性成分和增長趨勢。 ![Line Plot of Monthly Writing Paper Sales Dataset](https://img.kancloud.cn/9e/8f/9e8f8f9a5f091e65121dacb5171ed68a_640x480.jpg) 月刊書寫紙銷售數據集的線圖 與前面的示例一樣,我們可以將最近 24 個月的觀察結果作為測試數據集。因為我們有更多的數據,我們將嘗試從 1 年到 10 年的滑動窗口大小。 下面列出了完整的示例。 ```py from pandas import read_csv from pandas import datetime from sklearn.metrics import mean_squared_error from math import sqrt from numpy import mean from matplotlib import pyplot # load dataset def parser(x): if len(x) == 4: return datetime.strptime('190'+x, '%Y-%m') return datetime.strptime('19'+x, '%Y-%m') series = read_csv('writing-paper-sales.csv', header=0, parse_dates=[0], index_col=0, squeeze=True, date_parser=parser) # prepare data X = series.values train, test = X[0:-24], X[-24:] # evaluate mean of different number of years years = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] scores = list() for year in years: # walk-forward validation history = [x for x in train] predictions = list() for i in range(len(test)): # collect obs obs = list() for y in range(1, year+1): obs.append(history[-(y*12)]) # make prediction yhat = mean(obs) predictions.append(yhat) # observation history.append(test[i]) # report performance rmse = sqrt(mean_squared_error(test, predictions)) scores.append(rmse) print('Years=%d, RMSE: %.3f' % (year, rmse)) pyplot.plot(years, scores) pyplot.show() ``` 運行該示例將打印滑動窗口的大小以及由此產生的季節性持久性模型錯誤。 結果表明,窗戶大小為 5 年是最佳的,每月寫作紙的 RMSE 為 554.660。 ```py Years=1, RMSE: 606.089 Years=2, RMSE: 557.653 Years=3, RMSE: 555.777 Years=4, RMSE: 544.251 Years=5, RMSE: 540.317 Years=6, RMSE: 554.660 Years=7, RMSE: 569.032 Years=8, RMSE: 581.405 Years=9, RMSE: 602.279 Years=10, RMSE: 624.756 ``` 窗口大小和錯誤之間的關系在線圖上繪制,顯示與前一場景相似的錯誤趨勢。錯誤在再次增加之前下降到拐點(在這種情況下為 5 年)。 ![Sliding Window Size to RMSE for Monthly Writing Paper Sales](https://img.kancloud.cn/72/9e/729eae1ff60f81851a02cf0e89a56d7e_640x480.jpg) 每月書寫紙銷售的窗口大小滑動到 RMSE ## 案例研究 3:墨爾本每日最高溫度數據集 每日最高墨爾本氣溫數據集描述了 1981 年至 1990 年期間澳大利亞墨爾本市的日常氣溫。 單位是攝氏度,有 3,650 個觀測值,或 10 年的數據。數據來源記入澳大利亞氣象局。 [您可以從 DataMarket](https://datamarket.com/data/set/2323/daily-maximum-temperatures-in-melbourne-australia-1981-1990) 下載數據集。 下載數據集并將其保存到當前工作目錄中,文件名為“ _max-daily-temps.csv_ ”。請注意,您可能需要從文件中刪除頁腳信息。 下面的示例演示如何將數據集加載為 Pandas 系列。 ```py # line plot of time series from pandas import Series from matplotlib import pyplot # load dataset series = Series.from_csv('max-daily-temps.csv', header=0) # display first few rows print(series.head(5)) # line plot of dataset series.plot() pyplot.show() ``` 運行該示例將打印前 5 行數據。 ```py Date 1981-01-01 38.1 1981-01-02 32.4 1981-01-03 34.5 1981-01-04 20.7 1981-01-05 21.5 ``` 還創建了線圖。我們可以看到,我們比前兩個場景有更多的觀察,并且數據中存在明顯的季節性趨勢。 ![Line Plot of Daily Melbourne Maximum Temperatures Dataset](https://img.kancloud.cn/a2/a4/a2a49483c984533ee82a123a67261d7b_640x480.jpg) 每日墨爾本最高溫度數據集的線圖 由于數據是每天,我們需要將測試數據中的年份指定為 365 天而不是 12 個月的函數。 這忽略了閏年,這是一個可能,甚至應該在您自己的項目中解決的復雜問題。 下面列出了季節性持久性的完整示例。 ```py from pandas import Series from sklearn.metrics import mean_squared_error from math import sqrt from numpy import mean from matplotlib import pyplot # load data series = Series.from_csv('max-daily-temps.csv', header=0) # prepare data X = series.values train, test = X[0:-(2*365)], X[-(2*365):] # evaluate mean of different number of years years = [1, 2, 3, 4, 5, 6, 7, 8] scores = list() for year in years: # walk-forward validation history = [x for x in train] predictions = list() for i in range(len(test)): # collect obs obs = list() for y in range(1, year+1): obs.append(history[-(y*365)]) # make prediction yhat = mean(obs) predictions.append(yhat) # observation history.append(test[i]) # report performance rmse = sqrt(mean_squared_error(test, predictions)) scores.append(rmse) print('Years=%d, RMSE: %.3f' % (year, rmse)) pyplot.plot(years, scores) pyplot.show() ``` 運行該示例將打印滑動窗口的大小和相應的模型錯誤。 與前兩種情況不同,我們可以看到隨著窗口大小的增加技能不斷提高的趨勢。 最好的結果是所有 8 年歷史數據的滑動窗口,RMSE 為 4.271。 ```py Years=1, RMSE: 5.950 Years=2, RMSE: 5.083 Years=3, RMSE: 4.664 Years=4, RMSE: 4.539 Years=5, RMSE: 4.448 Years=6, RMSE: 4.358 Years=7, RMSE: 4.371 Years=8, RMSE: 4.271 ``` 滑動窗口大小與模型誤差的關系圖使這一趨勢明顯。 它表明,如果最優模型證明是前幾年同一天的觀測函數,那么獲得更多這個問題的歷史數據可能會有用。 ![Sliding Window Size to RMSE for Daily Melbourne Maximum Temperature](https://img.kancloud.cn/36/1a/361a7454d277ba7cbe6adcaffb4ed345_640x480.jpg) 將窗口尺寸滑動到 RMSE 以獲得每日墨爾本最高溫度 如果觀察結果是在前幾季的同一周或一個月中取平均值,我們也可以這樣做,這可能是一個富有成果的實驗。 ## 摘要 在本教程中,您發現了時間序列預測的季節性持久性。 你了解到: * 如何使用前幾季的點觀察來進行持久性預測。 * 如何在多個前幾季使用滑動窗口的平均值來進行持久性預測。 * 如何將季節性持久性應用于每日和每月時間序列數據。 您對季節性數據的持久性有任何疑問嗎? 在評論中提出您的問題,我會盡力回答。
                  <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>

                              哎呀哎呀视频在线观看