<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之旅 廣告
                # 如何回溯機器學習模型的時間序列預測 > 原文: [https://machinelearningmastery.com/backtest-machine-learning-models-time-series-forecasting/](https://machinelearningmastery.com/backtest-machine-learning-models-time-series-forecasting/) ### k-fold 交叉驗證不適用于時間序列數據和您可以使用的 技術。 時間序列預測的目標是對未來做出準確的預測。 我們在機器學習中依賴的快速而強大的方法,例如使用訓練測試分割和 k 折交叉驗證,在時間序列數據的情況下不起作用。這是因為它們忽略了問題中固有的時間成分。 在本教程中,您將了解如何使用 Python 評估時間序列數據的機器學習模型。在時間序列預測領域,這稱為回測或后報。 完成本教程后,您將了解: * 傳統的機器學習模型評估方法的局限性以及為什么需要在樣本數據之外評估模型。 * 如何在 Python 中創建用于模型評估的時間序列數據的訓練測試拆分和多訓練測試拆分。 * 前瞻性驗證如何在時間序列數據上提供最真實的機器學習模型評估。 讓我們開始吧。 ![How To Backtest Machine Learning Models for Time Series Forecasting](https://img.kancloud.cn/96/d1/96d11a822a0995f1efbf2dab4027f02d_640x421.jpg) 如何回溯測試時間序列預測的機器學習模型 照片由 [Nasa](https://www.flickr.com/photos/gsfc/17402277412/) ,保留一些權利。 ## 模型評估 我們怎么知道給定模型有多好? 我們可以根據用于訓練它的數據對其進行評估。這將是無效的。它可以提供對所選模型如何工作的深入了解,甚至可以如何改進它。但是,對這些數據的任何表現估計都是樂觀的,任何基于此表現的決策都會有偏見。 為什么? 把它帶到極端是有幫助的: **記住每個觀察 的時間戳和值的模型將實現完美的表現。** 我們準備的所有真實模型都會報告此結果的蒼白版本。 在評估時間序列預測模型時,我們感興趣的是模型在未用于訓練的數據上的表現。在機器學習中,我們稱之為看不見或不合格的數據。 我們可以通過拆分我們可用的數據來做到這一點。我們使用一些來準備模型,我們阻止一些數據并要求模型對該時期進行預測。對這些預測的評估將為我們在操作上使用它時模型的執行方式提供良好的代理。 在應用機器學習中,我們經常將數據分成訓練和測試集:用于準備模型的訓練集和用于評估模型的測試集。我們甚至可以使用 k-fold 交叉驗證,通過系統地將數據分成 k 個組來重復這個過程,每個組都有機會成為一個堅持的模型。 **這些方法不能直接用于時間序列數據。** 這是因為他們假設觀察之間沒有關系,每個觀察都是獨立的。 時間序列數據不是這樣,其中觀察的時間維度意味著我們不能將它們隨機分組。相反,我們必須分割數據并尊重觀察值的時間順序。 在時間序列預測中,對歷史數據模型的評估稱為回溯測試。在一些時間序列領域,例如氣象學,這被稱為后報,而不是預測。 我們將介紹三種不同的方法,您可以使用它們來回溯測試時間序列問題的機器學習模型。他們是: 1. **訓練 - 分裂**,尊重觀察的時間順序。 2. **多個訓練 - 分裂**,它遵循觀察的時間順序。 3. **前進驗證**,每次收到新數據時都可以更新模型。 首先,讓我們看一下我們將用作上下文的小的,單變量的時間序列數據來理解這三種回溯測試方法:太陽黑子數據集。 ## 每月太陽黑子數據集 該數據集描述了 230 多年(1749-1983)觀察到的太陽黑子數量的月度計數。 單位是計數,有 2,820 個觀測值。數據集的來源被稱為安德魯斯&amp;赫茨伯格(1985)。 下面是前 5 行數據的示例,包括標題行。 ```py "Month","Sunspots" "1749-01",58.0 "1749-02",62.6 "1749-03",70.0 "1749-04",55.7 "1749-05",85.0 ``` 下面是從數據市場獲取的整個數據集的圖表。 ![Monthly Sunspot Dataset](https://img.kancloud.cn/55/30/5530e4975fb013a297f6ed7c6e735097_728x383.jpg) 每月太陽黑子數據集 數據集顯示季節性,季節之間差異很大。 [在此處下載并了解有關數據集的更多信息](https://datamarket.com/data/set/22ti/zuerich-monthly-sunspot-numbers-1749-1983)。 下載數據集并將其保存到當前工作目錄中,文件名為“ _sunspots.csv_ ”。 ## 加載太陽黑子數據集 我們可以使用 Pandas 加載 Sunspot 數據集。 ```py # Load sunspot data from pandas import Series from matplotlib import pyplot series = Series.from_csv('sunspots.csv', header=0) print(series.head()) series.plot() pyplot.show() ``` 運行該示例將打印前 5 行數據。 ```py Month 1749-01-01 00:00:00 58.0 1749-02-01 00:00:00 62.6 1749-03-01 00:00:00 70.0 1749-04-01 00:00:00 55.7 1749-05-01 00:00:00 85.0 Name: Sunspots, dtype: float64 ``` 還繪制了數據集。 ![Plot of the Sunspot Dataset](https://img.kancloud.cn/64/24/64246e5b12448067f5e881583f77f3d7_800x600.jpg) 太陽黑子數據集的情節 ## 訓練 - 測試分裂 您可以將數據集拆分為訓練和測試子集。 您可以在訓練數據集上準備模型,并可以為測試數據集進行預測和評估。 這可以通過在有序觀察列表中選擇任意分割點并創建兩個新數據集來完成。根據您可用的數據量和所需的數據量,您可以使用 50-50,70-30 和 90-10 的拆分。 在 Python 中分割數據很簡單。 將數據集作為 Pandas 系列加載后,我們可以提取 NumPy 數據值數組。可以將分割點計算為數組中的特定索引。將直到分割點的所有記錄作為訓練數據集,并將從分割點到觀察列表末尾的所有記錄作為測試集。 下面是 Python 中使用 66-34 分割的示例。 ```py from pandas import Series series = Series.from_csv('sunspots.csv', header=0) X = series.values train_size = int(len(X) * 0.66) train, test = X[0:train_size], X[train_size:len(X)] print('Observations: %d' % (len(X))) print('Training Observations: %d' % (len(train))) print('Testing Observations: %d' % (len(test))) ``` 運行該示例將打印已加載數據集的大小以及從拆分創建的訓練和測試集的大小。 ```py Observations: 2820 Training Observations: 1861 Testing Observations: 959 ``` 我們可以通過使用不同顏色繪制訓練和測試集來直觀地進行此操作。 ```py from pandas import Series from matplotlib import pyplot series = Series.from_csv('sunspots.csv', header=0) X = series.values train_size = int(len(X) * 0.66) train, test = X[0:train_size], X[train_size:len(X)] print('Observations: %d' % (len(X))) print('Training Observations: %d' % (len(train))) print('Testing Observations: %d' % (len(test))) pyplot.plot(train) pyplot.plot([None for i in train] + [x for x in test]) pyplot.show() ``` 運行該示例將訓練數據集繪制為藍色,將測試數據集繪制為綠色。 ![Sunspot Dataset Train-Test Split](https://img.kancloud.cn/1c/22/1c2211aaec6442f0a0f09d28e26c7750_800x600.jpg) 太陽黑子數據集訓練 - 測試分裂 使用訓練測試分割方法來評估機器學習模型的速度很快。準備數據簡單直觀,只創建和評估一個模型。 當您擁有大量數據時,它非常有用,因此訓練集和測試集都能代表原始問題。 接下來,我們將重復多次重復此過程。 ## 多次訓練測試拆分 我們可以重復將時間序列分成多次訓練和測試集的過程。 這將需要訓練和評估多個模型,但是這種額外的計算開銷將提供對所選方法和配置對未見數據的預期表現的更穩健的估計。 我們可以通過使用不同的分割點重復上一節中描述的過程來手動執行此操作。 或者,scikit-learn 庫在 _TimeSeriesSplit_ 對象中為我們提供了這種功能。 您必須指定要創建的拆分數量,并指定 _TimeSeriesSplit_ 以返回訓練的索引并測試每個請求拆分的觀測值。 每次拆分迭代( _i_ )計算訓練和測試觀察的總數如下: ```py training_size = i * n_samples / (n_splits + 1) + n_samples % (n_splits + 1) test_size = n_samples / (n_splits + 1) ``` 其中 _n_samples_ 是觀察總數, _n_splits_ 是分裂總數。 讓我們以一個例子來具體化。假設我們有 100 個觀察值,我們想要創建 2 個分割。 對于第一次拆分,訓練和測試尺寸將計算為: ```py train = i * n_samples / (n_splits + 1) + n_samples % (n_splits + 1) train = 1 * 100 / (2 + 1) + 100 % (2 + 1) train = 33.3 or 33 test = n_samples / (n_splits + 1) test = 100 / (2 + 1) test = 33.3 or 33 ``` 或者前 33 個記錄用于訓練,接下來的 33 個記錄用于測試。 第二次拆分計算如下: ```py train = i * n_samples / (n_splits + 1) + n_samples % (n_splits + 1) train = 2 * 100 / (2 + 1) + 100 % (2 + 1) train = 66.6 or 67 test = n_samples / (n_splits + 1) test = 100 / (2 + 1) test = 33.3 or 33 ``` 或者,前 67 個記錄用于訓練,其余 33 個記錄用于測試。 您可以看到測試大小保持一致。這意味著根據每個訓練模型的預測計算的表現統計數據將是一致的,并且可以組合和比較。它提供了一個蘋果對蘋果的比較。 不同的是用于訓練模型的每個分割的記錄數量,提供越來越大的歷史記錄。這可能是結果分析的一個有趣方面。或者,這也可以通過保持用于訓練模型的觀察數量一致并且僅使用訓練數據集中的相同數量的最近(最后)觀察來控制,每個分割以訓練模型,33 在該設計示例中。 讓我們看一下如何在太陽黑子數據上應用 TimeSeriesSplit。 該數據集有 2,820 個觀測值。讓我們為數據集創建 3 個拆分。使用上面相同的算法,我們期望創建以下訓練和測試分裂: * **拆分 1** :705 訓練,705 測試 * **拆分 2** :1,410 訓練,705 測試 * **拆分 3** :2,115 次訓練,705 次測試 與前面的示例一樣,我們將使用單獨的顏色繪制訓練和測試觀測值。在這種情況下,我們將有 3 個拆分,因此這將是 3 個單獨的數據圖。 ```py from pandas import Series from sklearn.model_selection import TimeSeriesSplit from matplotlib import pyplot series = Series.from_csv('sunspots.csv', header=0) X = series.values splits = TimeSeriesSplit(n_splits=3) pyplot.figure(1) index = 1 for train_index, test_index in splits.split(X): train = X[train_index] test = X[test_index] print('Observations: %d' % (len(train) + len(test))) print('Training Observations: %d' % (len(train))) print('Testing Observations: %d' % (len(test))) pyplot.subplot(310 + index) pyplot.plot(train) pyplot.plot([None for i in train] + [x for x in test]) index += 1 pyplot.show() ``` 運行該示例將打印每個拆分的訓練和測試集的數量和大小。 我們可以看到每個分組的每個訓練和測試集中的觀測數量與使用上述簡單算法計算的預期相匹配。 ```py Observations: 1410 Training Observations: 705 Testing Observations: 705 Observations: 2115 Training Observations: 1410 Testing Observations: 705 Observations: 2820 Training Observations: 2115 Testing Observations: 705 ``` 該圖還顯示了 3 個分裂以及每個后續繪圖中總觀察數量的增加。 ![Sunspot Dataset Multiple Train-Test Split](https://img.kancloud.cn/94/96/9496ae46e66092ecdc9bf01138ea8089_800x600.jpg) 太陽黑子數據集多訓練 - 測試分裂 使用多個訓練測試分割將導致更多模型被訓練,并且反過來,更準確地估計模型對未見數據的表現。 訓練測試分割方法的局限性在于,訓練模型在測試集中的每個評估中進行評估時保持固定。 這可能不太現實,因為可以重新訓練模型,因為可以獲得新的每日或每月觀察結果。這個問題將在下一節中討論。 ## 向前走驗證 實際上,隨著新數據的出現,我們很可能會重新訓練我們的模型。 這將為模型提供在每個時間步進行良好預測的最佳機會。我們可以在這個假設下評估我們的機器學習模型。 幾乎沒有決定: 1\. **最小觀測數**。首先,我們必須選擇訓練模型所需的最小觀測數量。如果使用滑動窗口,則可以將其視為窗口寬度(參見下一點)。 2\. **滑動或擴展窗口**。接下來,我們需要確定模型是否將針對其可用的所有數據進行訓練,還是僅針對最近的觀察進行訓練。這決定了是使用滑動窗口還是擴展窗口。 在為測試設置選擇合理的配置后,可以訓練和評估模型。 1. 從時間序列的開始處開始,窗口中的最小樣本數用于訓練模型。 2. 該模型對下一個時間步進行預測。 3. 根據已知值存儲或評估預測。 4. 窗口展開以包含已知值并重復該過程(轉到步驟 1) 由于此方法涉及一次一步地沿時間序列移動,因此通常稱為前進測試或前進驗證。另外,因為使用滑動或擴展窗口來訓練模型,所以該方法也稱為滾動窗口分析或滾動預測。 此功能目前在 scikit-learn 中不可用,盡管您可以通過精心配置的 TimeSeriesSplit 來設計相同的效果。 下面是如何使用 Walk Forward Validation 方法將數據拆分為訓練集和測試集的示例。 ```py from pandas import Series from matplotlib import pyplot series = Series.from_csv('sunspots.csv', header=0) X = series.values n_train = 500 n_records = len(X) for i in range(n_train, n_records): train, test = X[0:i], X[i:i+1] print('train=%d, test=%d' % (len(train), len(test))) ``` 運行該示例只會打印創建的訓練和測試集的大小。我們可以看到訓練設置擴展了教學時間步驟,測試裝置一步一步固定。 在循環中,您將訓練和評估您的模型。 ```py train=500, test=1 train=501, test=1 train=502, test=1 train=503, test=1 train=504, test=1 ... train=2815, test=1 train=2816, test=1 train=2817, test=1 train=2818, test=1 train=2819, test=1 ``` 您可以看到創建了更多模型。 這又有利于提供對所選建模方法和參數在實踐中將如何執行的更加穩健的估計。這種改進的估計來自于創建這么多模型的計算成本。 如果建模方法很簡單或數據集很小(如本例所示),這并不昂貴,但可能是一個大規模的問題。在上述情況下,將創建和評估 2,820 個模型。 因此,需要特別注意窗口寬度和窗口類型。可以對這些進行調整,以便為您的問題設計一個計算成本顯著降低的測試工具。 前瞻性驗證是模型評估的黃金標準。它是時間序列世界的 k 折交叉驗證,建議用于您自己的項目。 ## 進一步閱讀 * [sklearn.model_selection.TimeSeriesSplit](http://scikit-learn.org/stable/modules/generated/sklearn.model_selection.TimeSeriesSplit.html) API 文檔 * [時間序列模型](https://mathworks.com/help/econ/rolling-window-estimation-of-state-space-models.html)的滾動窗口分析有關滾動窗口的更多信息。 * [在維基百科](https://en.wikipedia.org/wiki/Backtesting)上進行回測,以了解有關回測的更多信息。 ## 摘要 在本教程中,您了解了如何使用 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>

                              哎呀哎呀视频在线观看