最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python基于LightGBM進行時間序列預(yù)測

 更新時間:2022年03月07日 11:19:07   作者:Python學(xué)習(xí)與數(shù)據(jù)挖掘  
LightGBM是擴展機器學(xué)習(xí)系統(tǒng)。是一款基于GBDT(梯度提升決策樹)算法的分布梯度提升框架。其設(shè)計思路主要集中在減少數(shù)據(jù)對內(nèi)存與計算性能的使用上,以及減少多機器并行計算時的通訊代價。本文將通過LightGBM進行時間序列預(yù)測,感興趣的可以了解一下

前言

當(dāng)我們考慮時間序列的增強樹時,通常會想到 M5 比賽,其中前十名中有很大一部分使用了 LightGBM。但是當(dāng)在單變量情況下使用增強樹時,由于沒有大量的外生特征可以利用,它的性能非常的糟糕。

首先需要明確的是M4 比賽的亞軍 DID 使用了增強樹。但是它作為一個元模型來集成其他更傳統(tǒng)的時間序列方法。在 M4 上公開的代碼中,所有標準增強樹的基準測試都相當(dāng)糟糕,有時甚至還達不到傳統(tǒng)的預(yù)測方法。下面是Sktime 包和他們的論文所做的出色工作[1]:

任何帶有“XGB”或“RF”的模型都使用基于樹的集成。在上面的列表中 Xgboost 在每小時數(shù)據(jù)集中提供了 10.9 的最佳結(jié)果!然后,但是這些模型只是Sktime 在他們框架中做過的簡單嘗試,而 M4 的獲勝者在同一數(shù)據(jù)集上的得分是 9.3 分……。在該圖表中我們需要記住一些數(shù)字,例如來自 XGB-s 的每小時數(shù)據(jù)集的 10.9 和每周數(shù)據(jù)集中的樹性模型的“最佳”結(jié)果:來自 RF-t-s 的 9.0。

從上圖中就引出了我們的目標:創(chuàng)建一個基于LightGBM并且適合個人使用的時間序列的快速建模程序,并且能夠絕對超越這些數(shù)字,而且在速度方面可與傳統(tǒng)的統(tǒng)計方法相媲美。

聽起來很困難,并且我們的第一個想法可能是必須優(yōu)化我們的樹。但是提升樹非常復(fù)雜,改動非常費時,并且結(jié)果并不一定有效。但是有一點好處是我們正在擬合是單個數(shù)據(jù)集,是不是可從特征下手呢?

特征

在查看單變量空間中樹的其他實現(xiàn)時都會看到一些特征工程,例如分箱、使用目標的滯后值、簡單的計數(shù)器、季節(jié)性虛擬變量,也許還有傅里葉函數(shù)。這對于使用傳統(tǒng)的指數(shù)平滑等方法是非常棒的。但是我們今天目的是必須對時間元素進行特征化并將其表示為表格數(shù)據(jù)以提供給樹型模型,LazyProphet這時候就出現(xiàn)了。除此以外,LazyProphet還包含一個額外的特征工程元素:將點”連接”起來。

很簡單,將時間序列的第一個點連接起來,并將一條線連接到中途的另一個點,然后將中途的點連接到最后一個點。重復(fù)幾次,同時更改將哪個點用作“kink”(中間節(jié)點),這就是我們所說的“連接”。

下面張圖能很好地說明這一點。藍線是時間序列,其他線只是“連接點”:

事實證明,這些只是加權(quán)分段線性基函數(shù)。這樣做的一個缺點是這些線的外推可能會出現(xiàn)偏差。為了解決這個問題,引入一個懲罰從中點到最后點的每條線的斜率的“衰減”因子。

在這個基礎(chǔ)上加滯后的目標值和傅里葉基函數(shù),在某些問題上就能夠接近最先進的性能。因為要求很少,因因此我們把它稱作“LazyProphet”。

下面我們看看實際的應(yīng)用結(jié)果。

代碼

這里使用的數(shù)據(jù)集都是開源的,并在M-competitions github上發(fā)布。數(shù)據(jù)已經(jīng)被分割為訓(xùn)練和測試集,我們直接使用訓(xùn)練csv進行擬合,而測試csv用于使用SMAPE進行評估?,F(xiàn)在導(dǎo)入LazyProphet:

pip install LazyProphet

安裝后,開始編碼:

import matplotlib.pyplot as plt
import numpy as np
from tqdm import tqdm
import pandas as pd
from LazyProphet import LazyProphet as lp

train_df = pd.read_csv(r'm4-weekly-train.csv')
test_df = pd.read_csv(r'm4-weekly-test.csv')
train_df.index = train_df['V1']
train_df = train_df.drop('V1', axis = 1)
test_df.index = test_df['V1']
test_df = test_df.drop('V1', axis = 1)

導(dǎo)入所有必要的包后將讀入每周數(shù)據(jù)。創(chuàng)建 SMAPE 函數(shù),它將返回給定預(yù)測和實際值的 SMAPE:

def smape(A, F):
  return 100/len(A) * np.sum(2 * np.abs(F - A) / (np.abs(A) +       np.abs(F)))

對于這個實驗將取所有時間序列的平均值與其他模型進行比較。為了進行健全性檢查,我們還將獲得的平均 SMAPE,這樣可以確保所做的與比賽中所做的一致。

smapes = []
naive_smape = []
j = tqdm(range(len(train_df)))
for row in j:
  y = train_df.iloc[row, :].dropna()
  y_test = test_df.iloc[row, :].dropna()
  j.set_description(f'{np.mean(smapes)}, {np.mean(naive_smape)}')
  lp_model = LazyProphet(scale=True,
                          seasonal_period=52,
                          n_basis=10,
                          fourier_order=10,
                          ar=list(range(1, 53)),
                          decay=.99,
                          linear_trend=None,
                          decay_average=False)
  fitted = lp_model.fit(y)
  predictions = lp_model.predict(len(y_test)).reshape(-1)
  smapes.append(smape(y_test.values,     pd.Series(predictions).clip(lower=0)))
  naive_smape.append(smape(y_test.values, np.tile(y.iloc[-1], len(y_test))))  
print(np.mean(smapes))
print(np.mean(naive_smape))

在查看結(jié)果之前,快速介紹一下 LazyProphet 參數(shù)。

scale:這個很簡單,只是是否對數(shù)據(jù)進行縮放。默認值為 True 。

seasonal_period:此參數(shù)控制季節(jié)性的傅立葉基函數(shù),因為這是我們使用 52 的每周頻率。

n_basis:此參數(shù)控制加權(quán)分段線性基函數(shù)。這只是要使用的函數(shù)數(shù)量的整數(shù)。

Fourier_order:用于季節(jié)性的正弦和余弦對的數(shù)量。

ar:要使用的滯后目標變量值??梢垣@取多個列表 1-52 。

decay:衰減因子用于懲罰我們的基函數(shù)的“右側(cè)”。設(shè)置為 0.99 表示斜率乘以 (1- 0.99) 或 0.01。

linear_trend:樹的一個主要缺點是它們無法推斷出后續(xù)數(shù)據(jù)的范圍。為了克服這個問題,有一些針對多項式趨勢的現(xiàn)成測試將擬合線性回歸以消除趨勢。None 表示有測試,通過 True 表示總是去趨勢,通過 False 表示不測試并且不使用線性趨勢。

decay_average:在使用衰減率時不是一個有用的參數(shù)。這是一個trick但不要使用它。傳遞 True 只是平均基函數(shù)的所有未來值。這在與 elasticnet 程序擬合時很有用,但在測試中對 LightGBM 的用處不大。

下面繼續(xù)處理數(shù)據(jù):

train_df = pd.read_csv(r'm4-hourly-train.csv')
test_df = pd.read_csv(r'm4-hourly-test.csv')
train_df.index = train_df['V1']
train_df = train_df.drop('V1', axis = 1)
test_df.index = test_df['V1']
test_df = test_df.drop('V1', axis = 1)

smapes = []
naive_smape = []
j = tqdm(range(len(train_df)))
for row in j:
  y = train_df.iloc[row, :].dropna()
  y_test = test_df.iloc[row, :].dropna()
  j.set_description(f'{np.mean(smapes)}, {np.mean(naive_smape)}')
  lp_model = LazyProphet(seasonal_period=[24,168],
                          n_basis=10,
                          fourier_order=10,
                          ar=list(range(1, 25)),
                          decay=.99)
  fitted = lp_model.fit(y)
  predictions = lp_model.predict(len(y_test)).reshape(-1)
  smapes.append(smape(y_test.values, pd.Series(predictions).clip(lower=0)))
  naive_smape.append(smape(y_test.values, np.tile(y.iloc[-1], len(y_test))))  
print(np.mean(smapes))
print(np.mean(naive_smape))

所以真正需要修改是seasonal_period 和ar 參數(shù)。將list傳遞給seasonal_period 時,它將為列表中的所有內(nèi)容構(gòu)建季節(jié)性基函數(shù)。ar 進行了調(diào)整以適應(yīng)新的主要季節(jié) 24。

結(jié)果

對于上面的 Sktime 結(jié)果,表格如下:

LazyProphet 擊敗了 Sktime 最好的模型,其中包括幾種不同的基于樹的方法。在每小時數(shù)據(jù)集上輸給給了 M4 的獲勝者,但平均而言總體上優(yōu)于 ES-RNN。這里要意識到的重要一點是,只使用默認參數(shù)進行了此操作……

boosting_params = {
                  "objective": "regression",
                  "metric": "rmse",
                  "verbosity": -1,
                  "boosting_type": "gbdt",
                  "seed": 42,
                  'linear_tree': False,
                  'learning_rate': .15,
                  'min_child_samples': 5,
                  'num_leaves': 31,
                  'num_iterations': 50
                  }

可以在創(chuàng)建 LazyProphet 類時傳遞你參數(shù)的字典,可以針對每個時間序列進行優(yōu)化,以獲得更多收益。

對比一下我們的結(jié)果和上面提到的目標:

進行了零參數(shù)優(yōu)化(針對不同的季節(jié)性稍作修改)

分別擬合每個時間序列

在我的本地機器上在一分鐘內(nèi)“懶惰地”生成了預(yù)測。

在基準測試中擊敗了所有其他樹方法

目前看是非常成功的,但是成功可能無法完全的復(fù)制,因為他數(shù)據(jù)集的數(shù)據(jù)量要少得多,因此我們的方法往往會顯著降低性能。根據(jù)測試LazyProphet 在高頻率和大量數(shù)據(jù)量上表現(xiàn)的更好,但是LazyProphet還是一個時間序列建模的很好選擇,我們不需要花多長時間進行編碼就能夠測試,這點時間還是很值得。

到此這篇關(guān)于Python基于LightGBM進行時間序列預(yù)測的文章就介紹到這了,更多相關(guān)Python LightGBM時間序列預(yù)測內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python如何進行基準測試

    python如何進行基準測試

    這篇文章主要介紹了python如何進行基準測試,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-04-04
  • 解決安裝tensorflow遇到無法卸載numpy 1.8.0rc1的問題

    解決安裝tensorflow遇到無法卸載numpy 1.8.0rc1的問題

    今天小編就為大家分享一篇解決安裝tensorflow遇到無法卸載numpy 1.8.0rc1的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-06-06
  • Python爬蟲基礎(chǔ)之簡單說一下scrapy的框架結(jié)構(gòu)

    Python爬蟲基礎(chǔ)之簡單說一下scrapy的框架結(jié)構(gòu)

    今天給大家?guī)淼氖顷P(guān)于Python爬蟲的相關(guān)知識,文章圍繞著scrapy的框架結(jié)構(gòu)展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Python2和Python3中print的用法示例總結(jié)

    Python2和Python3中print的用法示例總結(jié)

    在Python 3中接觸的第一個很大的差異就是縮進是作為語法的一部分,這和C++等其他語言確實很不一樣,所以要小心,其中python3和python2中print的用法有很多不同,這篇文章主要給大家介紹了關(guān)于Python2和Python3中print用法的相關(guān)資料,需要的朋友可以參考下。
    2017-10-10
  • python中round函數(shù)保留兩位小數(shù)的方法

    python中round函數(shù)保留兩位小數(shù)的方法

    在本篇內(nèi)容里小編給各位分享的是一篇關(guān)于python中round函數(shù)保留兩位小數(shù)的方法及相關(guān)知識點,有興趣的朋友們可以學(xué)習(xí)下。
    2020-12-12
  • Python使用MD5加密算法對字符串進行加密操作示例

    Python使用MD5加密算法對字符串進行加密操作示例

    這篇文章主要介紹了Python使用MD5加密算法對字符串進行加密操作,結(jié)合實例形式分析了Python實現(xiàn)md5加密相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • python繪圖如何自定義x軸

    python繪圖如何自定義x軸

    這篇文章主要介紹了python繪圖如何自定義x軸問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 使用python requests模塊發(fā)送http請求及接收響應(yīng)的方法

    使用python requests模塊發(fā)送http請求及接收響應(yīng)的方法

    用 python 編寫 http request 消息代碼時,建議用requests庫,因為requests比urllib內(nèi)置庫更為簡捷,requests可以直接構(gòu)造get,post請求并發(fā)送,本文給大家介紹了使用python requests模塊發(fā)送http請求及接收響應(yīng)的方法,需要的朋友可以參考下
    2024-03-03
  • 關(guān)于Python中對變量賦值過程的理解

    關(guān)于Python中對變量賦值過程的理解

    在Python中對變量賦值過程的理解,有助于學(xué)習(xí)者對Python的變量和所指向的對象之間的指向關(guān)系深刻理解,避免編程中多個變量賦值后,對變量結(jié)果的不確定,,需要的朋友可以參考下
    2023-05-05
  • python 實現(xiàn)將txt文件多行合并為一行并將中間的空格去掉方法

    python 實現(xiàn)將txt文件多行合并為一行并將中間的空格去掉方法

    今天小編就為大家分享一篇python 實現(xiàn)將txt文件多行合并為一行并將中間的空格去掉方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12

最新評論

龙州县| 灵丘县| 峨眉山市| 辽中县| 鱼台县| 嘉黎县| 临汾市| 元谋县| 大化| 崇礼县| 长乐市| 突泉县| 乾安县| 淮阳县| 宜昌市| 南皮县| 元氏县| 潍坊市| 沂源县| 玉田县| 磴口县| 银川市| 微博| 朝阳县| 封开县| 延长县| 怀化市| 乌拉特后旗| 同江市| 福海县| 衡阳市| 福安市| 毕节市| 凤冈县| 利辛县| 海安县| 乌拉特中旗| 申扎县| 马龙县| 秦皇岛市| 舟曲县|