如何使用XGBoost模型進行時間序列預測

2020-12-17 雷鋒網

字幕組雙語原文:如何使用XGBoost模型進行時間序列預測

英語原文:How to Use XGBoost for Time Series Forecasting

翻譯:雷鋒字幕組(Shangru)

XGBoost是在有效解決分類和回歸問題的一種梯度提升方法。

在廣泛的預測模型任務中,它快且有效,性能好。它在諸如Kaggle等數據科學競賽的獲勝者中最受歡迎。XGBoost也可以被用於時間序列預測,儘管它需要將時間序列數據集先轉換成監督學習問題。它需要用到一種被稱為前進式驗證的特殊方法來評估模型,因為使用k折驗證來評估模型容易導致偏向樂觀的結果。本教程中,你將探索如何為時間序列預測開發一個XGBoost模型。

完成本教程後,你將了解:

XGBoost是對分類和回歸問題的梯度提升集成算法的實現時間序列數據集可以通過滑窗表示轉換成監督學習。如何使用XGBoost模型對時間序列預測進行擬合,評估以及預測讓我們開始吧

教程總覽

本教程分為三部分。它們是:

XGBoost集成時間序列數據準備時間預測中的XGBoostXGBoost集成

XGBoost是 Extreme Gradient Boosting的縮寫。它是隨機梯度提升機器學習算法的有效實現。

隨機梯度提升算法,也叫做梯度提升機或者提升樹,是一種強大的機器學習技術。他在廣泛的有挑戰性的機器學習問題上有著好的,甚至是最好的表現。

提升樹以及在很多標準分類指標上表現出來最先進的結果

—— XGBoost: A Scalable Tree Boosting System, 2016.

它是一種決策樹集成算法,其中新的樹會去修正模型中已有的樹的誤差。樹會被一直添加進去直到模型表現沒有更多提升。

XGBoost為隨機梯度提升算法,以及為訪問整套模型超參數來控制模型訓練過程提供了一種高效實現。

XGBoost成功的背後最重要的一點是全場景的規模化。該系統運行速度超出現流行的單機方案十倍之上。它在分布式或者內存有限的設定下,規模可達數十億例。

—— XGBoost: A Scalable Tree Boosting System, 2016.

XGBoost是為表格型數據的分類和回歸問題設計的,儘管它也可以用於時間序列預測。

關於更多的梯度提升和XGBoost實現,參考下面教程:

A Gentle Introduction to the Gradient Boosting Algorithm for Machine Learning

首先,必須安裝XGBoost庫。

你可以通過pip安裝,如下

一旦安裝完成,你可以通過下面代碼確認下是否成功安裝以及你是否使用了新的版本。

運行這些代碼,你可以看到下面或者更高的版本號。

儘管XGBoost庫有著自己的Python API,我們通過scikit-learn API中的XGBRegressor封裝類來使用XGBoost模型。

模型的實例可以像其他scikit-learn類一樣實例化和使用來進行模型評估。例如:

時間序列數據準備

時間序列數據可以使用監督學習來表述。

當給定一個時間序列數據集的數字序列,我們可以重新組織數據使之看起來像一個監督學習問題。為了達到這種效果,我們把前幾步的數據作為輸入變量,下一步的作為輸出。

我用一個例子來支持這一點。想像一些我們有如下的時間序列:

我們可以通過前一個時間的值來預測下一個時間的值,從而將該時間序列數據集重組為一個監督學習問題。

如上重組時間序列數據集後,數據看起來像下面這樣:

注意到時間列被丟棄了,有些行的數據對模型訓練是無用的,比如第一行和最後一行。

這種表述被稱為滑窗,因為輸入窗口和預計輸出是隨著時間向前滑動,從而創建了監督學習模型的新「樣本」。

關於更多關於用滑窗方法準備時間序列預測數據,可以看以下教程:

Time Series Forecasting as Supervised Learning

在給定輸入輸出序列長度時的時間序列問題中,我們使用Pandas中的shift()函數來自動創建窗口。

這是一個很有用的工具,它使得我們在使用機器學習算法時可以使用不同的窗口探索時間序列問題,來找出哪種可能下模型表現更好。

下面這個函數將時間序列作為一個單列或多列的Numpay數組時間序列,並將其轉換成一個特定輸入輸出數量的監督學習問題。

我們使用該函數來準備XGBoost的時間序列數據集。

更多關於這個函數的一步步的開發,可以看一下教程

How to Convert a Time Series to a Supervised Learning Problem in Python

一旦數據集準備好了,如何使用它們去擬合和評估模型就要務必仔細。

比如,使用未來的數據擬合模型來預測過去的數據就是無效的。模型應該是在過去的數據上訓練,預測未來。

這意味著在模型評估時,一些隨機化數據集的方法,比如k折交叉驗證,就不能使用了。取而代之地,我們使用一種被稱為前進式驗證的技術。

在前進式驗證中,數據集首先通過選擇分割點,分為訓練集和測試集。比如,除了過去12個月的所有數據被用來訓練,而過去12個月的數據用作測試。

如果我們感興趣的是單步預測,比如,一個月,我們可以通過在訓練集上訓練,在測試集的第一步進行預測。然後我們將測試集中真實的觀察值加入訓練集,重新擬合模型,然後在測試集的第二步上使用該模型預測。

對整個測試集重複該過程,就可以得到整個數據集上的單步預測。基於該預測計算的誤差可以用來評估模型的能力。

關於更多前進式驗證,可以看教程:

How To Backtest Machine Learning Models for Time Series Forecasting

以下函數可處理前進式驗證。

它的參數是整個監督學習版的時間序列數據集和用作測試集的行數。

然後它開始處理測試集,調用 xgboost_forecast()函數來進行單步預測。它會返回計算所得的誤差度量和一些可供分析的細節。

調用 train_test_split()將數據集分割成訓練集和測試集

我們定義以下函數

我們是用XGBRegressor類來進行但不預測。

xgboost_forecast()函數的實現如下,以訓練集和測試輸入行作為輸入,擬合模型,然後進行單步預測。

現在我們知道如何為預測準備時間序列數據和評估XGBoost模型。接下來我們看看如何在真實數據集上使用XGBoost。

時間序列預測中的XGBoost

本節中,我們將探索如何用XGBoost來進行時間序列預測。

我們使用一個標準的單變量時間序列數據集,並計劃使用該模型來進行單步預測。

你可以使用本節中的代碼作為你自己項目的出發點。你可以輕易的將它拓展為多變量輸入,多變量預測,以及多步預測。

我們使用每日女性出生數量數據集,包括三年來每個月的出生數。

你可以在這裡下載數據集,文件名為 「daily-total-female-births.csv「 ,並放入你當前的工作路徑下。

數據集 (daily-total-female-births.csv)描述 (daily-total-female-births.names)數據集前幾行如下所示:

首先,我們加載數據集並做圖。

完整的例如如下:

運行例程,得到數據集的線圖。

我們可以看到沒有明顯的趨勢或季節性。

每月出生數時間序列數據集線圖

一個基線模型在預測最近12個月時可以得到6.7出生數的MAE。這可以作為模型性能的基準。比這更好的模型可以認為是更具備技巧的。

接下來我們通過在數據集上使用最近12個月數據進行單步預測來評估XGBoost模型。

我們將只用最近三個時間步作為模型輸入以及默認的模型超參數,輸了我們將損失函數變為 『reg:squarederror『(避免警報),以及在集成中使用1000個樹(避免欠擬合)。

完整的例子如下:

訓練該例程,得到測試集中每一步的期和預測值,和所有預測值的MAE

我們看到模型表現好於基線模型,他的MAE為5.3,好於6.7.

你能做更好嗎?

你可以測試不同的XGBoost超參數和時間步長作為輸入,看看是不是可以活得更好的性能。在評論下分享你的結果。

以下線圖比較了數據集中過去12個月期望值和預測值的序列。

這給我們一種模型在測試集上表現的幾何解讀。

XGBoost中期望vs預測出生數的線圖

一旦選擇好XGBoost最終的模型配置,就可以最終確定模型並在新數據上做預測。

這被稱作樣本外預測,比如,在訓練集以外預測。這和在模型評價時做預測一樣:因為我們總是想使用和在新數據上預測時同樣的步驟來評估模型。

下面的例子展示了在所有的數據上擬合一個最終版的XGBoost模型,並在數據集之外做單步預測。

運行以上例程,在所有數據上擬合XGBoost 模型。

用已知的的過去三個月數據作為一行新輸入,來預測數據集之外第一個月的數據。

延伸閱讀

如果你想再進一步了的話,本節提供了關於本主題相關的更多資料。

相關教程

A Gentle Introduction to the Gradient Boosting Algorithm for Machine LearningTime Series Forecasting as Supervised LearningHow to Convert a Time Series to a Supervised Learning Problem in PythonHow To Backtest Machine Learning Models for Time Series Forecasting小結

本教程中,你已經發現了如何為時間序列預測開發一個XGBoost模型。

另外,你學習到了:

XGBoost是分類和回歸問題的梯度提升集成算法的實現。時間序列數據集可以通過滑窗表示轉換成監督學習。如何使用XGBoost模型對時間序列預測進行擬合,評估以及預測。雷鋒字幕組是由AI愛好者組成的志願者翻譯團隊;團隊成員有大數據專家、算法工程師、圖像處理工程師、產品經理、產品運營、IT諮詢人、在校師生;志願者們來自IBM、AVL、Adobe、阿里、百度等知名企業,北大、清華、港大、中科院、南卡羅萊納大學、早稻田大學等海內外高校研究所。

轉載請聯繫字幕組微信並註明出處:雷鋒字幕組

雷鋒網雷鋒網

相關焦點

  • 如何用XGBoost做時間序列預測?終於有人講明白了
    它兼顧了速度和效率,且在很多預測模型任務中表現優異,在數據科學比賽中廣受贏家偏愛,如Kaggle。XGBoost也可以用於時間序列預測,儘管要先把時間序列數據集轉換成適用於有監督學習的形式。它還需要使用一種專門的技術來評估模型,稱為前向推進驗證,因為模型評估使用了k-摺疊交叉,這會產生有正偏差的結果。
  • 如何使用 Python 進行時間序列預測?
    性能基準讓您了解所有其他模型如何在您的問題上實際執行。在本教程中,您將了解如何開發持久性預測,以便用Python計算時間序列數據集的性能基準級別。完成本教程後,您將知道:讓我們開始吧。您打算用於評估預測的性能指標(例如均方誤差)。準備好之後,您需要選擇一個樸素的方法,您可以使用此方法進行預測並計算基準性能。目標是儘可能快地獲得時間序列預測問題的基線性能,以便您更好地了解數據集並開發更高級的模型。制定基線預測的好技術的三個屬性是:用於建立基準性能的常用算法是持久性算法。
  • 使用DeepAR 進行時間序列預測
    在 2019 年的 WAIC(世界人工智慧大會)上,筆者在 AWS 展臺中布置並展示了一個使用 DeepAR 進行時間序列預測的項目,受到了廣泛的來自客戶、參觀者以及同事的關注,其中大部分是被展示項目中真實的電商客戶的數據及成果吸引,進行了一定的經驗交流。
  • 時間序列預測方法總結
    觀察序列,當序列存在周期性時,線性回歸也可做為baseline3.傳統時序建模方法,ARMA/ARIMA等線性模型。參考:4.時間序列分解,使用加法模型或乘法模型將原始序列拆分為4部分。a.在天池競賽-資金流入流出預測-挑戰Baseline-天池大賽-阿里雲天池,時間序列分解方法也能取得很好的成績。(後面有機會試試這種方法)5. 特徵工程著手,時間滑窗改變數據的組織方式,使用xgboost/LSTM模型/時間卷積網絡等。
  • 使用sktime進行時間序列預測
    使用sktime進行時間序列預測https://www.sktime.org/en/latest/examples/01_forecasting.html使用sktime預測為了做到這一點,我們需要使用sktime的ForecastingHorizon類。這樣,我們就可以簡單地從測試集的時間點中創建預測範圍。
  • 使用LSTM深度學習模型進行溫度的時間序列單步和多步預測
    本文的目的是提供代碼示例,並解釋使用python和TensorFlow建模時間序列數據的思路。本文展示了如何進行多步預測並在模型中使用多個特徵。本文的簡單版本是,使用過去48小時的數據和對未來1小時的預測(一步),我獲得了溫度誤差的平均絕對誤差0.48(中值0.34)度。
  • 用 Python 為時間序列預測創建 ARIMA 模型
    它是一類模型,它捕獲時間序列數據中的一套不同的標準時間結構。ARIMA模型的信息還可以參考這裡:https://www.statsmodels.org/devel/generated/statsmodels.tsa.arima_model.ARIMAResults.html在本教程中,您將了解如何使用Python為時間序列數據開發ARIMA模型。
  • 用Python進行時間序列分解和預測
    ,以及如何在Python中進行時間序列預測的一些基本方法和示例。 預測是一件複雜的事情,在這方面做得好的企業會在同行業中出類拔萃。時間序列預測的需求不僅存在於各類業務場景當中,而且通常需要對未來幾年甚至幾分鐘之後的時間序列進行預測。如果你正要著手進行時間序列預測,那麼本文將帶你快速掌握一些必不可少的概念。什麼是時間序列?如何在Python中繪製時間序列數據?時間序列的要素是什麼?如何分解時間序列?
  • pytorch入門-使用PyTorch進行LSTM時間序列預測
    任務是根據前132個月來預測最近12個月內旅行的乘客人數。請記住,我們有144個月的記錄,這意味著前132個月的數據將用於訓練我們的LSTM模型,而模型性能將使用最近12個月的值進行評估。讓我們繪製每月乘客的出行頻率。
  • 通過Python 代碼實現時間序列數據的統計學預測模型
    來源 | DeepHub IMBA封圖 | CSDN 付費下載於視覺中國在本篇中,我們將展示使用 Python 統計學模型進行時間序列數據分析。 目標是:根據兩年以上的每日廣告支出歷史數據,提前預測兩個月的廣告支出金額。
  • 基於Holt的趨勢時間序列預測模型
    今天小編為大家帶來「基於Holt的趨勢時間序列預測模型」,一起來看看吧!基於Holt的趨勢時間序列預測模型一、模型簡介霍爾特指數平滑法是一種高級的線性指數平滑方法,該方法的優點是可以用不同的平滑參數對原序列的兩種因素進行平滑,具有很大的靈活性,因此在實踐中被廣泛地應用。
  • 利用深度學習進行時間序列預測
    這些技術通常被數學家使用,他們試圖不斷改進這些技術來約束平穩和非平穩的時間序列。幾個月前,我的一個朋友(數學家、統計學教授、非平穩時間序列專家)提出讓我研究如何驗證和改進重建恆星光照曲線的技術。事實上,克卜勒衛星[11]和其他許多衛星一樣,無法連續測量附近恆星的光通量強度。
  • 時間序列模型matlab代碼 - CSDN
    時間序列數據分析意味著對可用數據進行分析,以找出數據的模式或趨勢,從而預測一些將來的價值,這些價值將有助於提高效率並優化業務決策。常見的用於時間序列分析的技術:本篇將介紹 - ARIMA模型在R中如何使用ARIMA建模ARIMA是AutoRegressive集成移動平均線的縮寫。
  • 時間序列的LSTM模型預測——基於Keras
    一、問題背景    現實生活中,在一系列時間點上觀測數據是司空見慣的活動,在農業、商業、氣象軍事和醫療等研究領域都包含大量的時間序列數據。時間序列的預測指的是基於序列的歷史數據,以及可能對結果產生影響的其他相關序列,對序列未來的可能取值做出預測。
  • 時間序列深度學習:狀態 LSTM 模型預測太陽黑子(一)
    隨著這些 ML/DL 工具的發展,企業和金融機構現在可以通過應用這些新技術來解決舊問題,從而更好地進行預測。在本文中,我們展示了使用稱為 LSTM(長短期記憶)的特殊類型深度學習模型,該模型對涉及自相關性的序列預測問題很有用。我們分析了一個名為「太陽黑子」的著名歷史數據集(太陽黑子是指太陽表面形成黑點的太陽現象)。
  • 手把手教你用Python進行時間序列分解和預測
    (給數據分析與開發加星標,提升數據技能)作者:Mohit Sharma   翻譯:數據派THU-王闖(Chuck)   預測是一件複雜的事情
  • 時域卷積網絡TCN詳解:使用卷積進行序列建模和預測
    為了訓練我們的TCN網絡進行預測,訓練集將由給定時間序列的等大小子序列對(輸入序列、目標序列)組成。目標序列將是相對於其各自的輸入序列向前移動一定數量output_length的序列。由於TCN模型支持多個輸入通道,因此我們可以在當前時間序列中添加其他時間序列分量,以對當月的當前日期進行編碼。這可以幫助我們的TCN模型更快地收斂。
  • 時間序列深度學習:狀態 LSTM 模型預測太陽黑子(上)
    由於數據科學機器學習和深度學習的發展,時間序列預測在預測準確性方面取得了顯著進展。隨著這些 ML/DL 工具的發展,企業和金融機構現在可以通過應用這些新技術來解決舊問題,從而更好地進行預測。在本文中,我們展示了使用稱為 LSTM(長短期記憶)的特殊類型深度學習模型,該模型對涉及自相關性的序列預測問題很有用。我們分析了一個名為「太陽黑子」的著名歷史數據集(太陽黑子是指太陽表面形成黑點的太陽現象)。我們將展示如何使用 LSTM 模型預測未來 10 年的太陽黑子數量。
  • 乾貨 :手把手教你用Python進行時間序列分解和預測
    ,以及如何在Python中進行時間序列預測的一些基本方法和示例。 預測是一件複雜的事情,在這方面做得好的企業會在同行業中出類拔萃。時間序列預測的需求不僅存在於各類業務場景當中,而且通常需要對未來幾年甚至幾分鐘之後的時間序列進行預測。如果你正要著手進行時間序列預測,那麼本文將帶你快速掌握一些必不可少的概念。什麼是時間序列?如何在Python中繪製時間序列數據?時間序列的要素是什麼?如何分解時間序列?
  • 獨家 | 手把手教你用Python進行時間序列分解和預測
    ,以及如何在Python中進行時間序列預測的一些基本方法和示例。 預測是一件複雜的事情,在這方面做得好的企業會在同行業中出類拔萃。時間序列預測的需求不僅存在於各類業務場景當中,而且通常需要對未來幾年甚至幾分鐘之後的時間序列進行預測。