獨家 | 如何用XGBoost作時間序列預測?

做者:Jason Brownlee
python

翻譯:wwlios

校對:王雨桐git

本文約3300字,建議閱讀10分鐘github

本文介紹瞭如何用XGBoost作時間序列預測,包括將時間序列轉化爲有監督學習的預測問題,使用前向驗證來作模型評估,並給出了可操做的代碼示例。算法

針對分類和迴歸問題,XGBoost是梯度提高算法的一種高效實現。api

 

它兼顧了速度和效率,且在不少預測模型任務中表現優異,在數據科學比賽中廣受贏家偏心,如Kaggle。數組

 

XGBoost也能夠用於時間序列預測,儘管要先把時間序列數據集轉換成適用於有監督學習的形式。它還須要使用一種專門的技術來評估模型,稱爲前向推動驗證,由於模型評估使用了k-摺疊交叉,這會產生有正誤差的結果。app

 

在本文中,你將會了解到如何開發應用於時間序列預測的XGBoost模型。框架

 

完成本教程後,你將知道:機器學習

  • XGBoost是用於分類和迴歸問題的梯度提高集成方法的一個實現。

  • 經過使用滑動時間窗口表示,時間序列數據集能夠適用於有監督學習。

  • 在時間序列預測問題上,如何使用XGBoost模型進行擬合、評估、預測。

 

讓咱們開始吧!

教程概覽

本教程分爲三個部分,分別是:

1、XGBoost集成

2、時間序列數據準備

3、時間序列預測上的XGBoost

1、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是爲表格式數據集的分類和迴歸問題而設計的,也能夠用於時間序列預測。

 

想得到更多有關GDBT和XGBoost實現,請看如下教程:

《機器學習中梯度提高算法的簡要歸納

連接:https://machinelearningmastery.com/gentle-introduction-gradient-boosting-algorithm-machine-learning/

 

首先,XGBoost須要安裝,你能夠用pip安裝,以下:

安裝後,能夠經過如下代碼確認是否成功安裝以及安裝的版本:

執行以上代碼,會看到以下的版本號,也有可能版本號更高:

雖然XGBoost庫有本身的python接口,你也可使用scikit-learn API中的XGBRegressor包裝類。

 

模型的一個實例能夠被實例化並像任何其餘scikit-learn類同樣用於模型評估。例如:

 

如今咱們已經熟悉了XGBoost,接下來咱們看一看如何準備用於監督學習的時間序列數據集。

 

2、時間序列數據準備

時間數據能夠用於監督學習。

給定時間序列數據集的一系列數字,咱們能夠從新構造數據,使其看起來像一個有監督的學習問題。咱們可使用前一個時間步長的數據做爲輸入變量,並使用下一個時間步長做爲輸出變量。

 

讓咱們用一個例子來具體學習。設想咱們有這樣一組時間序列數據:

咱們能夠把這個時間序列數據集從新構形成一個有監督學習,用前一個時間步長的值來預測下一個時間步的值。

 

經過這種方式從新組織時間序列數據集,數據將以下所示:

注意!咱們去掉了時間列,而且有幾行數據不能用於訓練,如第一行和最後一行。

 

這種表示稱爲滑動窗口,由於輸入和指望輸出的窗口隨着時間向前移動,爲有監督學習模型建立新的「樣本」。

 

有關準備時間序列預測數據的滑動窗口方法的更多信息,請參閱教程:

《Time Series Forecasting as Supervised Learning》

連接:https://machinelearningmastery.com/time-series-forecasting-supervised-learning/

能夠用pandas庫的shift()方法,按照給定的輸入輸出的長度,把時間序列數據轉換爲新框架。

 

這將是一個有用的工具,由於它可讓咱們用機器學習算法來探索時間序列問題的不一樣框架,看看哪一種方法可能會產生更好的模型。

 

下面的函數將時間序列做爲具備一列或多列的NumPy數組時間序列,並將其轉換爲具備指定數量的輸入和輸出的監督學習問題。

咱們可使用此函數爲XGBoost準備一個時間序列數據集。             

 

有關此功能逐步開發的更多信息,請參閱教程:

《如何在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。

 

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

數據集的前幾行以下所示:

 

首先導入數據,繪製數據集。完整的示例以下:

運行這段示例能夠獲得這個數據集的折線圖。能夠發現沒有明顯的趨勢和季節性。

 

 

在預測後12個月的嬰兒出生數的問題上,持續性模型實現了6.7的平均絕對偏差(MAE)。提供了一個模型有效的基準。

 

接下來咱們評估XGBoost模型在這個數據集上的表現,並對最後12個月的數據作一步長的預測。

 

咱們僅使用前三個時間步長做爲模型輸入,以及默認的模型超參數,可是把loss改爲了‘reg:squarederror‘(以免警告消息)並在集合中使用1000棵樹(以免欠擬合)。

 

完整的示例以下:

# forecast monthlybirths with xgboost
from numpy importasarray
from pandas importread_csv
from pandas importDataFrame
from pandas importconcat
from sklearn.metricsimport mean_absolute_error
from xgboost importXGBRegressor
from matplotlib importpyplot
 
# transform a timeseries dataset into a supervised learning dataset
defseries_to_supervised(data, n_in=1, n_out=1, dropnan=True):
       n_vars = 1 if type(data) is list elsedata.shape[1]
       df = DataFrame(data)
       cols = list()
       # input sequence (t-n, ... t-1)
       for i in range(n_in, 0, -1):
              cols.append(df.shift(i))
       # forecast sequence (t, t+1, ... t+n)
       for i in range(0, n_out):
              cols.append(df.shift(-i))
       # put it all together
       agg = concat(cols, axis=1)
       # drop rows with NaN values
       if dropnan:
              agg.dropna(inplace=True)
       return agg.values
 
# split a univariatedataset into train/test sets
deftrain_test_split(data, n_test):
       return data[:-n_test, :], data[-n_test:,:]
 
# fit an xgboost modeland make a one step prediction
def xgboost_forecast(train,testX):
       # transform list into array
       train = asarray(train)
       # split into input and output columns
       trainX, trainy = train[:, :-1], train[:,-1]
       # fit model
       model =XGBRegressor(objective='reg:squarederror', n_estimators=1000)
       model.fit(trainX, trainy)
       # make a one-step prediction
       yhat = model.predict(asarray([testX]))
       return yhat[0]
 
# walk-forwardvalidation for univariate data
defwalk_forward_validation(data, n_test):
       predictions = list()
       # split dataset
       train, test = train_test_split(data,n_test)
       # seed history with training dataset
       history = [x for x in train]
       # step over each time-step in the testset
       for i in range(len(test)):
              # split test row into input andoutput columns
              testX, testy = test[i, :-1],test[i, -1]
              # fit model on history and make aprediction
              yhat = xgboost_forecast(history,testX)
              # store forecast in list ofpredictions
              predictions.append(yhat)
              # add actual observation tohistory for the next loop
              history.append(test[i])
              # summarize progress
              print('>expected=%.1f,predicted=%.1f' % (testy, yhat))
       # estimate prediction error
       error = mean_absolute_error(test[:, 1],predictions)
       return error, test[:, 1], predictions
 
# load the dataset
series =read_csv('daily-total-female-births.csv', header=0, index_col=0)
values = series.values
# transform the timeseries data into supervised learning
data =series_to_supervised(values, n_in=3)
# evaluate
mae, y, yhat =walk_forward_validation(data, 12)
print('MAE: %.3f' %mae)
# plot expected vspreducted
pyplot.plot(y,label='Expected')
pyplot.plot(yhat,label='Predicted')
pyplot.legend()
pyplot.show()

 

運行這個示例將報告測試集中每一個時間的預期值和預測值,而後報告全部預測值的MAE。             

 

咱們能夠看到,該模型比6.7MAE的持久性模型表現得更好,實現了大約5.3個出生嬰兒的MAE。

 

你能夠作的更好嗎?

能夠嘗試不一樣的XGBoost超參數,以及不一樣的時間步長的輸入,看看是否可以獲得更好的模型,歡迎在評論區中分享結果。

下圖繪製了用於比較最後12個月的預測值和實際值的折線圖,該圖提供了一個測試集上模型表現狀況的可視化展現。

一旦選擇了最終的XGBoost模型參數,就能夠肯定一個模型並用於對新數據進行預測。             

 

這稱爲樣本外預測,例如訓練集以外的預測。這與在評估模型期間進行預測是相同的:由於在評估選擇哪一個模型和用這個模型在新數據上作預測的流程是同樣的。

 

下面的示例演示如何在全部可用數據上擬合最終的XGBoost模型,並在數據集末尾以外進行一步預測。

# finalize model andmake a prediction for monthly births with xgboost
from numpy importasarray
from pandas importread_csv
from pandas importDataFrame
from pandas importconcat
from xgboost importXGBRegressor
 
# transform a timeseries dataset into a supervised learning dataset
defseries_to_supervised(data, n_in=1, n_out=1, dropnan=True):
       n_vars = 1 if type(data) is list elsedata.shape[1]
       df = DataFrame(data)
       cols = list()
       # input sequence (t-n, ... t-1)
       for i in range(n_in, 0, -1):
              cols.append(df.shift(i))
       # forecast sequence (t, t+1, ... t+n)
       for i in range(0, n_out):
              cols.append(df.shift(-i))
       # put it all together
       agg = concat(cols, axis=1)
       # drop rows with NaN values
       if dropnan:
              agg.dropna(inplace=True)
       return agg.values
 
# load the dataset
series =read_csv('daily-total-female-births.csv', header=0, index_col=0)
values = series.values
# transform the timeseries data into supervised learning
train =series_to_supervised(values, n_in=3)
# split into input andoutput columns
trainX, trainy =train[:, :-1], train[:, -1]
# fit model
model =XGBRegressor(objective='reg:squarederror', n_estimators=1000)
model.fit(trainX,trainy)
# construct an inputfor a new preduction
row = values[-3:].flatten()
# make a one-stepprediction
yhat =model.predict(asarray([row]))
print('Input: %s,Predicted: %.3f' % (row, yhat[0]))

 

運行該代碼,基於全部可用數據構建XGBoost模型。

   

使用最後三個月的已知數據做爲新的輸入行,並預測數據集結束後的下一個月。

進一步閱讀

若是您想深刻了解,本節將提供有關該主題的更多資源。             

 

相關教程

  • 機器學習中梯度提高算法的簡要介紹

    https://machinelearningmastery.com/gentle-introduction-gradient-boosting-algorithm-machine-learning/

  • 時間序列預測轉化爲監督學習問題

    https://machinelearningmastery.com/time-series-forecasting-supervised-learning/

  • 如何用Python 將時間序列問題轉化爲有監督學習問題

    https://machinelearningmastery.com/convert-time-series-supervised-learning-problem-python/

  • How To Backtest Machine Learning Models for Time Series     Forecasting

    https://machinelearningmastery.com/backtest-machine-learning-models-time-series-forecasting/

 

總結

 

在本教程中,您瞭解瞭如何爲時間序列預測開發XGBoost模型。

具體來講,你學到了: 

  • XGBoost是用於分類和迴歸的梯度boosting集成算法的實現

  • 時間序列數據集能夠經過滑動窗口表示轉化爲有監督學習。             

  • 如何使用XGBoost模型擬合、評估和預測時間序列預測。

原文標題:

How to Use XGBoost for Time Series Forecasting

原文連接:

https://machinelearningmastery.com/xgboost-for-time-series-forecasting/

編輯:黃繼彥

校對:林亦霖

譯者簡介

威力,養老醫療行業BI從業者。保持學習。

翻譯組招募信息

工做內容:須要一顆細緻的心,將選取好的外文文章翻譯成流暢的中文。若是你是數據科學/統計學/計算機類的留學生,或在海外從事相關工做,或對本身外語水平有信心的朋友歡迎加入翻譯小組。

你能獲得:按期的翻譯培訓提升志願者的翻譯水平,提升對於數據科學前沿的認知,海外的朋友能夠和國內技術應用發展保持聯繫,THU數據派產學研的背景爲志願者帶來好的發展機遇。

其餘福利:來自於名企的數據科學工做者,北大清華以及海外等名校學生他們都將成爲你在翻譯小組的夥伴。

點擊文末「閱讀原文」加入數據派團隊~

轉載須知

如需轉載,請在開篇顯著位置註明做者和出處(轉自:數據派ID:DatapiTHU),並在文章結尾放置數據派醒目二維碼。有原創標識文章,請發送【文章名稱-待受權公衆號名稱及ID】至聯繫郵箱,申請白名單受權並按要求編輯。

發佈後請將連接反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,咱們將依法追究其法律責任。


點擊「閱讀原文」擁抱組織

相關文章
相關標籤/搜索