XGBoost也可以用於時間序列預測,盡管要先把時間序列數據集轉換成適用於有監督學習的形式。它還需要使用一種專門的技術來評估模型,稱為前向推進驗證,因為模型評估使用了k-折疊交叉,這會產生有正偏差的結果。
在本文中,你將會了解到如何開發應用於時間序列預測的XGBoost模型。
完成本教程后,你將知道:
XGBoost是用於分類和回歸問題的梯度提升集成方法的一個實現。
通過使用滑動時間窗口表示,時間序列數據集可以適用於有監督學習。
在時間序列預測問題上,如何使用XGBoost模型進行擬合、評估、預測。
教程概覽
本教程分為三個部分,分別是:
一、XGBoost集成
二、時間序列數據准備
三、時間序列預測上的XGBoost
一、XGBoost集成
XGBoost是Extreme GradientBoosting的縮寫,是一種高效的隨機梯度提升的實現。
隨機梯度提升算法(或者叫gradient boosting machines ortree boosting)是一種強大的機器學習技術,在很多有挑戰的機器學習問題上,表現的非常好甚至是最好。
Tree boosting has been shown to give state-of-the-art results onmany standard classification benchmarks.
— XGBoost:A Scalable Tree Boosting System, 2016.
https://arxiv.org/abs/1603.02754
它是一個決策樹算法的集成,其中新樹可以對模型中已有樹的結果進行修正。我們可以不斷增加決策樹,直到達到滿意的效果。
XGBoost是隨機梯度提升算法的一種高效實現,它可以通過一系列模型超參數在整個訓練過程中控制模型。
The mostimportant factor behind the success of XGBoost is its scalability in allscenarios. The system runs more than ten times faster than existing popularsolutions on a single machine and scales to billions of examples in distributedor memory-limited settings.
— XGBoost: A Scalable TreeBoosting System, 2016.
https://arxiv.org/abs/1603.02754
XGBoost是為表格式數據集的分類和回歸問題而設計的,也可以用於時間序列預測。
二、時間序列數據准備
時間數據可以用於監督學習。
給定時間序列數據集的一系列數字,我們可以重新構造數據,使其看起來像一個有監督的學習問題。我們可以使用前一個時間步長的數據作為輸入變量,並使用下一個時間步長作為輸出變量。
讓我們用一個例子來具體學習。設想我們有這樣一組時間序列數據:
我們可以把這個時間序列數據集重新構造成一個有監督學習,用前一個時間步長的值來預測下一個時間步的值。
通過這種方式重新組織時間序列數據集,數據將如下所示:
rolling window?
這種表示稱為滑動窗口,因為輸入和期望輸出的窗口隨着時間向前移動,為有監督學習模型創建新的“樣本”。
有關准備時間序列預測數據的滑動窗口方法的更多信息,請參閱教程:
《Time Series Forecasting as Supervised Learning》
鏈接:https://machinelearningmastery.com/time-series-forecasting-supervised-learning/
可以用pandas庫的shift()方法,按照給定的輸入輸出的長度,把時間序列數據轉換為新框架。
這將是一個有用的工具,因為它可以讓我們用機器學習算法來探索時間序列問題的不同框架,看看哪種方法可能會產生更好的模型。
下面的函數將時間序列作為具有一列或多列的NumPy數組時間序列,並將其轉換為具有指定數量的輸入和輸出的監督學習問題。
參考:
《如何在Python中將時間序列轉化為監督學習問題》
鏈接:https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/
數據集准備好之后,我們需要關注如何使用它來擬合和評估一個模型。
比如用未來數據預測歷史數據的模型是無效的。模型必須根據歷史數據預測未來。
這意味着模型評估階段,類似k折交叉檢驗這種數據集隨機拆分的方法並不適用。相反我們必須使用一種稱為向前推進驗證的技術。
在前向驗證中,首先通過選擇一個拆分點將數據分為訓練集和測試集,比如除去最后12個月的數據用於訓練,最后12個月的數據用於測試。
如果對一步預測感興趣,例如一個月,那么我們可以通過在訓練數據集上訓練並預測測試數據集中的第一個步長來評估模型。然后,我們可以將來自測試集的真實觀測值添加到訓練數據集中,重新調整模型,然后讓模型預測測試數據集中的第二個步長。
在整個測試集上重復這個過程,可以得到一步長的預測,並且可以計算錯誤率來評估這個模型的表現。
有關前向驗證的更多信息,請參考教程:
《How To Backtest Machine Learning Models for Time Series Forecasting》
鏈接:https://machinelearningmastery.com/backtest-machine-learning-models-time-series-forecasting/)
下邊這個函數運行前向驗證。
參數是整個時間序列數據集和用於測試集的行數。
然后它遍歷測試集,調用xgboost_forecast()函數做一步長的預測。計算錯誤度量並返回詳細信息以供分析。
train_test_split()函數是用來把數據集划分為訓練集和測試集的。可以如下定義這個方法:
可以用XGBRegressor類來做一步預測。xgboost_forecast()方法實現的是,以訓練集、測試集的輸入作為函數的輸入,擬合模型,然后做一步長預測。
現在我們已經知道如何准備用於預測的時間序列數據集,以及評估XGBoost模型,接下來我們可以在實際的數據集上使用XGBoost。
三、XGBoost用於時間序列預測
在本節中,我們將探討如何使用XGBoost進行時間序列預測。
我們將使用一個標准的單變量時間序列數據集,目的是使用該模型進行一步預測。
你可以使用本節的代碼來開始自己項目,它可以輕易的轉化應用於多變量輸入、多變量預測、多步長預測。
以下鏈接可以用於下載數據集,在本地工作目錄以“daily-total-female-births.csv“的文件名導入。
Dataset (daily-total-female-births.csv)
鏈接:https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-total-female-births.csv
Description (daily-total-female-births.names)
鏈接:https://raw.githubusercontent.com/jbrownlee/Datasets/master/daily-total-female-births.names
https://www.jiqizhixin.com/articles/2020-09-02-2