時間序列預測被認為是一項具有挑戰性的任務,因為我們可以利用各種方法,每種方法都有各種超參數。
fbprophet
庫是一個開源庫,旨在對時間序列的單變量數據集進行預測。它易於使用和開發,可以自動為模型找到一組好的超參數,以便默認情況下藉助趨勢和季節結構對數據進行熟練的預測。
在下面的教程中,我們將討論使用臉書先知圖書館來預測時間序列。
在整個教程中,我們將學習:
- 先知是由臉書開發的一個開源庫,旨在自動預測單變量時間序列數據。
- 如何擬合先知模型並利用它們來進行樣本內和樣本外預測?
- 如何在擱置的數據集上評估先知模型?
所以,讓我們開始吧。
理解先知預言庫
預言家,也被稱為“臉書預言家”,是臉書設計的一個預測單變量(單變量)時間序列的開源庫。
Prophet 實現了他們所稱的可加性時間序列預測模型,該實現支持季節性、趨勢和節假日。
根據先知包的文件,它實現了一個程序,根據一個加法模型預測時間序列數據,其中非線性趨勢符合每日、每周、每年的季節性,以及假期的影響。
它被設計成易於使用和完全自動的。例如,將它指向一個時間序列並得到一個預測。它旨在用於公司內部利用,如預測銷售、產能等。
預言家庫提供了兩個接口,涉及 Python 和 r .本教程我們將主要關注 Python 接口。
第一步是在畫中畫安裝程序的幫助下安裝fbprophet
庫。
如何安裝 Python fbprophet
庫?
為了安裝 Python 模塊,我們需要“ pip ”,這是一個管理從可信公共存儲庫中安裝模塊所需的包的框架。一旦我們有了“ pip ”,我們就可以使用來自 Windows 命令提示符(CMD)或終端的命令安裝先知庫,如下所示:
語法:
$ python.exe -m pip install fbprophet
驗證安裝
一旦模塊安裝完成,我們可以通過創建一個空的 Python 程序文件並編寫一個 import 語句來驗證它,如下所示:
文件:驗證. py
# importing the library
import fbprophet
# printing the version number
print("Prophet %s" %fbprophet.__version__)
現在,保存上述文件,並在終端中使用以下命令執行它:
語法:
$ python verify.py
輸出:
Prophet 0.7.1
如果上述 Python 程序文件沒有引發任何異常並返回安裝程序版本號,則說明fbprophet
庫安裝正確。但是,在引發異常的情況下,請嘗試重新安裝庫,並且還建議參考庫的官方文檔。
了解先知圖書館的工作
現在讓我們使用汽車月銷量數據集來了解 Python fbprophet
庫的工作原理。
該數據集是一個標準的單變量時間序列數據集,由趨勢和季節性組成。數據集包含 108 個月的數據,天真的持久性預測可以實現大約 3,235 次銷售的平均絕對誤差,提供了較低的誤差限制。
讓我們從加載和總結數據集開始
加載和匯總數據集
先知需要以 Pandas 數據幀的形式存儲數據。因此,我們將在 Pandas 圖書館的幫助下加載和總結數據。
我們可以通過調用 Pandas read_csv() 函數,匯總數據的形狀(行數和列數),查看數據的前幾行,直接從 URL 加載數據。
讓我們考慮下面的例子來證明這一點:
示例:
# importing the required function
from pandas import read_csv
# loading the data
filepath = '/content/cars_monthly_sale.csv'
dFrame = read_csv(filepath, header = 0)
# summarizing shape
print(dFrame.shape)
# displaying the first few rows
print(dFrame.head())
輸出:
(108, 2)
Month Sales
0 1960-01 6550.0
1 1960-02 8728.0
2 1960-03 12026.0
3 1960-04 14395.0
4 1960-05 14587.0
說明:
在上面的代碼片段中,我們已經從 Pandas 庫中導入了 read_csv() 函數。然後,我們初始化了存儲 CSV 文件數據的路徑,並使用導入的函數讀取該文件並將其轉換為數據幀。然後,我們使用形狀屬性總結了數據的形狀。最後,我們為用戶打印了前幾行數據。
因此,我們可以觀察到有 108 個月的數據和兩列。第一列是月份,第二列是銷售數量。
注意:輸出中的第一列是行索引,不是數據集的一部分,只是 Pandas 用來排序行的有用工具。
加載和繪製數據集
在我們繪製時間序列數據集之前,它是不完整的。
繪製時間序列可以讓我們顯示是否有趨勢、季節性周期、異常值等等。它讓我們對數據有了感覺。
我們可以通過在數據幀中調用 plot() 函數來輕鬆繪製 Pandas 中的數據。
讓我們考慮下面的例子來說明這一點:
示例:
# importing the required modules from libraries
from pandas import read_csv
from matplotlib import pyplot
# loading the data
filepath = '/content/cars_monthly_sale.csv'
dFrame = read_csv(filepath, header = 0)
# plotting the time series
dFrame.plot()
pyplot.show()
輸出:
說明:
在上面的代碼片段中,我們從各自的庫中導入了 read_csv 函數以及 pyplot 模塊。然後我們初始化了 CSV 文件的路徑。然後,我們使用 read_csv 函數讀取該文件並將其轉換為數據幀。然後,我們使用繪圖()功能繪製圖形,使用顯示()功能向用戶顯示圖形。
因此,我們可以清楚地看到一段時間內的銷售趨勢以及每月的銷售季節性模式。這些是我們期望預測模型考慮的模式。
現在我們已經熟悉了數據集,讓我們探索如何利用fbprophet
庫進行預測。
用 Python 中的 Prophet 預測汽車銷量
在下一節中,我們將討論如何使用fbprophet
庫來預測汽車銷售數據集。
讓我們首先在數據集上擬合一個模型。
擬合先知模型
為了使用預言家進行預測,我們將首先定義一個預言家()對象並對其進行配置。然後我們將調用 fit() 函數,並傳遞數據以使其適合數據集。
Prophet() 對象接受參數以根據喜好配置模型類型,如生長類型、季節性類型等。默認情況下,模型會努力自動計算出幾乎所有的事情。
fit() 函數接受時間序列數據的數據幀。數據幀應該具有特定的格式。第一列的名稱必須是“ ds ,由日期時間組成。第二列的名稱必須是“ y ,並且由觀察值組成。
該語句意味着我們要更改數據集中列的名稱。它還希望將第一列轉換為日期時間對象(如果它們還沒有轉換的話)。例如,這可以通過使用適當的參數將數據集加載到 read_csv() 函數來實現。
現在,讓我們考慮下面的語法,說明我們如何修改加載的數據集,使其具有預期的結構。
示例:
# preparing the expected column names
dFrame.columns = ['ds', 'y']
dFrame['ds']= to_datetime(dFrame['ds'])
說明:
在上面的語法中,我們更改了數據幀列的名稱,使其具有預期的結構。
現在,讓我們看看在汽車銷售數據集上擬合先知模型的完整示例,如下所示:
示例:
# importing the required functions and modules
from pandas import read_csv
from pandas import to_datetime
from fbprophet import Prophet
# loading the data
filepath = '/content/cars_monthly_sale.csv'
dFrame = read_csv(filepath, header = 0)
# preparing the expected names of the columns
dFrame.columns = ['ds', 'y']
dFrame['ds']= to_datetime(dFrame['ds'])
# defining the model
prophet_model = Prophet()
# fitting the model
prophet_model.fit(dFrame)
輸出:
INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
說明:
我們已經導入了所需的庫,並在上面的代碼片段中加載了數據。然後,我們準備了列的預期名稱。最後,我們定義了預測模型,並對數據集進行了擬合。
下一步是做預測。
進行樣本內預測
這將有助於對歷史數據進行預測。
我們可以對用作訓練模型輸入的數據進行預測。理想情況下,模型之前已經看過數據,並且會做出適當的預測。
然而,這不是場景,因為模型試圖在數據中的所有情況下進行歸納。
這個過程被稱為進行樣本內(在訓練集樣本中)預測,並且檢查輸出可以提供對模型有多好的洞察。也就是它對訓練數據的學習程度。
通過調用 predict() 函數並傳遞一個數據幀來進行預測,該數據幀由名為‘ds’的一列和帶有預測間隔的日期時間的行組成。
有多種方法可以創建這個“”的 _forecast ”數據幀。例如,在數據集中的最後十二個月,為每個月創建一個字符串。在下面的例子中,我們將循環一年的日期。然後,我們將把日期列錶轉換成一個數據幀,並將字符串的值轉換成日期時間對象。
讓我們考慮下面的語法來證明這一點。
示例:
# defining the period for which we want a prediction
future = list()
for i in range(1, 13):
date = '1968-%02d' % i
future.append([date])
future = DataFrame(future)
future.columns = ['ds']
future['ds'] = to_datetime( future['ds'] )
說明:
在上面的代碼片段中,我們將列表定義為未來。然後我們用的循環迭代 1968 年的幾個月,並返回那個時期的數據。然後,我們將該數據幀入列名為‘ds’的數據幀中,並將該列設置為顯示日期時間。
我們現在可以將數據幀提供給預測()功能,以便評估預測。
predict() 函數的結果將是一個由多列組成的數據幀。也許最重要的欄目是:
- 預測日期時間(‘ds’)。
- 預測值(‘yhat’)。
- 提供預測不確定性的預測值的下限和上限(‘yhat _ lower’和‘yhat _ upper’)。
讓我們考慮下面的代碼片段,我們已經打印了前幾個預測:
示例:
# summarizing the forecast
print(the_forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head())
說明:
在上面的代碼片段中,我們已經打印了前幾個預測的導入列。
Prophet 還提供了一個內置的實用程序來可視化訓練數據集中的預測。這可以使用模型上的繪圖()功能完成,並將其傳遞給結果數據幀。它將創建訓練數據集的圖,並用預測日期的上限和下限覆蓋預測。
同樣的語法如下:
示例:
# plotting the forecast
prophet_model.plot(the_forecast)
pyplot.show()
說明:
在上面的代碼片段中,我們在模型上使用了 plot() 函數,並向它傳遞了一個結果數據幀。然後,我們使用顯示()功能來顯示結果圖。
現在,讓我們看看製作樣本內預測的完整程序。
示例:
# importing the required functions and modules
from pandas import read_csv
from pandas import to_datetime
from pandas import DataFrame
from fbprophet import Prophet
from matplotlib import pyplot
# loading the data
filepath = '/content/cars_monthly_sale.csv'
dFrame = read_csv(filepath, header = 0)
# preparing the expected column names
dFrame.columns = ['ds', 'y']
dFrame['ds']= to_datetime(dFrame['ds'])
# defining the model
prophet_model = Prophet()
# fitting the model
prophet_model.fit(dFrame)
# defining the period for which we want a prediction
future = list()
for i in range(1, 13):
date = '1968-%02d'%i
future.append([date])
future = DataFrame(future)
future.columns = ['ds']
future['ds']= to_datetime( future['ds'] )
# using the model to make a forecast
the_forecast = prophet_model.predict(future)
# summarizing the forecast
print(the_forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].head())
# plotting the forecast
prophet_model.plot(the_forecast)
pyplot.show()
輸出:
INFO:fbprophet:Disabling weekly seasonality. Run prophet with weekly_seasonality=True to override this.
INFO:fbprophet:Disabling daily seasonality. Run prophet with daily_seasonality=True to override this.
ds yhat yhat_lower yhat_upper
0 1968-01-01 14334.737769 12802.203888 15949.723255
1 1968-02-01 14905.955964 13337.420778 16552.309312
2 1968-03-01 20842.150502 19242.348853 22460.757530
3 1968-04-01 22870.095215 21341.988780 24473.330178
4 1968-05-01 24176.211162 22508.496756 25726.410744
說明:
我們可以觀察到,上面的代碼片段將返回數據集最後 12 個月的預測。
報告了預測的前五個月,我們還可以觀察到這些值與數據集中的原始銷售值沒有太大變化。
此外,我們還可以注意到,已經創建了一個情節。訓練數據用黑點表示,預測是一條藍色線,在藍色陰影區域有上下限。
最後,我們可以理解,預測的 12 個月與實際觀測值非常吻合,特別是在考慮邊界的情況下。
原創文章,作者:U11KN,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/127785.html