原文鏈接:http://tecdat.cn/?p=22673
原文出處:拓端數據部落公眾號
方法
Prophet異常檢測使用了Prophet時間序列預測。基本的Prophet模型是一個可分解的單變量時間序列模型,結合了趨勢、季節性和節假日效應。該模型預測還包括一個圍繞估計的趨勢部分的不確定性區間。另外,完全的貝葉斯推斷也可以以增加計算量為代價。然后,不確定性區間的上限和下限值可以作為每個時間點的離群點閾值。首先,計算從觀測值到最近的不確定度邊界(上限或下限)的距離。如果觀察值在邊界內,離群點得分等於負距離。因此,當觀測值與模型預測值相等時,離群點得分最低。如果觀察值在邊界之外,得分等於距離測量,觀察值被標記為離群點。然而,該方法的一個主要缺點是,當新的數據進來時,你需要重新調整模型。這對於具有實時檢測的應用來說是不可取的。
數據集
這個例子使用了地球化學研究所記錄的天氣時間序列數據集。該數據集包含14個不同的特征,如空氣溫度、大氣壓力和濕度。這些都是在2003年開始,每10分鍾收集一次。我們只使用2009年至2016年期間收集的數據。
-
import matplotlib.pyplot as plt
-
import numpy as np
-
import os
-
import pandas as pd
-
import tensorflow as tf
加載數據集
-
-
df = pd.read_csv(csv_path)
-
df['Date Time'] = pd.to_datetime(df['Date Time'], format='%d.%m.%Y %H:%M:%S')
-
df.head()
選擇子集來測試Prophet模型。
n_prophet = 10000
Prophet模型需要得到一個有兩列的DataFrame:一列名為ds,包含時間戳,一列名為y,包含要評估的時間序列。我們只看溫度數據。
-
print(df_T.shape)
-
df_T.head()
plt.plot(df_T['ds'], df_T['y'])
加載或定義離群檢測
你可以將預訓練的模型保存在本地目錄的文件路徑中,並加載檢測模型。或者,你也可以從頭開始訓練一個檢測模型。
-
filepath = 'my_path' # 改為下載模型的目錄
-
if outlier_detector: # 加載預訓練的離群檢測器
-
filepath = os.path.join(filepath, detector_name)
-
else: # 初始化、擬合並保存離群檢測
-
od.fit(df_T)
請查看文檔以及原始的Prophet文檔,了解如何定制基於Prophet的異常值檢測器,並添加季節性因素、假期、選擇飽和邏輯增長模型或應用參數正則化。
預測測試數據中的異常值
定義測試數據。重要的是,測試數據的時間與訓練數據一致。下面我們通過比較測試數據框的前幾行和訓練數據框的最后幾行來檢查這一點。
-
-
df_T_test = pd.DataFrame(data=d)
df_T.tail()
預測測試數據的異常值。
-
predict(
-
df_T_test
-
)
結果可視化
我們可以用Prophet將我們的預測結果可視化。包括歷史預測。
-
-
model.predict(future)
-
model.plot(forecast)
我們還可以繪制預測中不同成分的細分。預測的不確定性區間是由外推趨勢的MAP估計值決定的。
plot_component(forecast)
很明顯,我們對未來的預測越遠,決定離群值閾值的不確定性區間就越大。
讓我們把實際數據與離群點閾值的上限和下限預測值疊加起來,檢查我們預測的離群點在哪里。
plot(x='ds', y=['y', 'yhat', 'yhat_upper', 'yhat_lower'])
異常點的得分和預測。
-
np.zeros(n_periods)
-
plot(x='ds', y=['score', 'threshold'])
當我們進一步預測未來時,隨着不確定性的增加,離群點的分數自然呈下降趨勢。
讓我們來看看一些個別的離群值。
-
outlier = fcst.loc[fcst['score'] > 0]
-
print((outlier.shape[0]))
最受歡迎的見解
1.在python中使用lstm和pytorch進行時間序列預測
2.python中利用長短期記憶模型lstm進行時間序列預測分析