成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python時間序列異常檢測ADTK

開發(fā) 后端
本文介紹了時間序列異常檢測的無監(jiān)督算法工具包ADTK。ADTK提供了簡單的異常檢測算法和時間序列特征加工函數(shù),希望對你有幫助。

[[390668]]

 1. adtk簡介

智能運維AIOps的數(shù)據(jù)基本上都是時間序列形式的,而異常檢測告警是AIOps中重要組成部分。筆者最近在處理時間序列數(shù)據(jù)時有使用到adtk這個python庫,在這里和大家做下分享。

什么是adtk?

adtk(Anomaly Detection Toolkit)是無監(jiān)督異常檢測的python工具包,它提供常用算法和處理函數(shù):

  •  簡單有效的異常檢測算法(detector)
  •  異常特征加工(transformers)
  •  處理流程控制(Pipe)

2. 安裝

  1. pip install adtk 

3. adtk數(shù)據(jù)要求

時間序列的數(shù)據(jù)主要包括時間和相應的指標(如cpu,內存,數(shù)量等)。python中數(shù)據(jù)分析一般都是pandas的DataFrame,adtk要求輸入數(shù)據(jù)的索引必須是DatetimeIndex。

pandas提供了時間序列的時間生成和處理方法。

  •  pd.date_range 
  1. stamps = pd.date_range("2012-10-08 18:15:05", periods=4freq="D" 
  2. # DatetimeIndex(['2012-10-08 18:15:05', '2012-10-09 18:15:05',  
  3. #           '2012-10-10 18:15:05', '2012-10-11 18:15:05'],  
  4. #          dtype='datetime64[ns]'freq='D'
  •  pd.Timestamp 
  1. tmp = pd.Timestamp("2018-01-05") + pd.Timedelta("1 day")  
  2.  print(tmp, tmp.timestamp(), tmp.strftime('%Y-%m-%d'))  
  3.  # 2018-01-06 00:00:00 1515196800.0 2018-01-06  
  4.  pd.Timestamp( tmp.timestamp(), unit='s'tz='Asia/Shanghai' 
  5.  # Timestamp('2018-01-06 08:00:00+0800', tz='Asia/Shanghai'
  •  pd.to_datetime

adtk提供是validate_series來驗證時間序列數(shù)據(jù)的有效性,如是否按時間順序 

  1. import pandas as pd  
  2. from adtk.data import validate_series  
  3. from adtk.visualization import plot  
  4. df = pd.read_csv('./data/nyc_taxi.csv', index_col="timestamp"parse_dates=True 
  5. df = validate_series(df)  
  6. plot(df) 

4. 異常特征加工(transformers)

adtk中transformers提供了許多時間序列特征加工的方法:

  •  一般我們獲取時間序列的特征,通常會按照時間窗口在滑動,采集時間窗口上的統(tǒng)計特征;
  •  還有對于季節(jié)性趨勢做分解,區(qū)分哪些是季節(jié)性的部分,哪些是趨勢的部分
  •  時間序列降維映射:對于細粒度的時間序列數(shù)據(jù),數(shù)據(jù)量大,對于檢測算法來說效率不高。降維方法能保留時間序列的主要趨勢等特征同時,降低維數(shù),提供時間效率。這個對于用CNN的方式來進行時間序列分類特別有效,adtk主要提供基于pca的降維和重構方法,主要應用于多維時間序列。

4.1 滑動窗口

atdk提供單個寬口RollingAggregate和2個窗口DoubleRollingAggregate的滑動方式。統(tǒng)計特征支持均值,中位數(shù),匯總,最大值,最小值,分位數(shù), 方差,標準差,偏度,峰度,直方圖 等,['mean', 'median', 'sum', 'min', 'max', 'quantile', 'iqr', 'idr', 'count', 'nnz', 'nunique', 'std', 'var', 'skew', 'kurt', 'hist']其中

  •  'iqr': 是分位數(shù) 75% 和 25%差值
  •  'idr': 是分位數(shù) 90% 和 10%插值
  •   RollingAggregate 
  1. import pandas as pd  
  2.   from adtk.data import validate_series  
  3.   from adtk.transformer import RollingAggregate  
  4.   from adtk.transformer import DoubleRollingAggregate  
  5.   s = pd.read_csv('./data/nyc_taxi.csv', index_col="timestamp"parse_dates=True 
  6.   s = validate_series(s)  
  7.   s_transformed = RollingAggregate(agg='quantile',agg_params={"q": [0.25, 0.75]}, window=5).transform(s) 

  •  DoubleRollingAggregate 提供了兩個窗口之間統(tǒng)計特征的差異特征,如前5分鐘和后5分鐘,均值的差值等。agg參數(shù)和RollingAggregate中一致,新增的參數(shù)diff主要衡量差距的函數(shù): 
  1. import pandas as pd  
  2. from adtk.data import validate_series  
  3. from adtk.transformer import DoubleRollingAggregate  
  4. s = pd.read_csv('./data/ec2_cpu_utilization_53ea38.csv', index_col="timestamp"parse_dates=True 
  5. s = validate_series(s)  
  6. s_transformed = DoubleRollingAggregate 
  7.     agg="median" 
  8.     window=5 
  9.     diff="diff").transform(s) 
  •  'diff': 后減去前
  •  'rel_diff': Relative difference between values of aggregated metric (right minus left divided left). Only applicable if the aggregated metric is scalar.
  •  'abs_rel_diff': (后-前)/前, 相對差值
  •  'l1': l1正則
  •  'l2': l2正則

4.2 季節(jié)性拆解

時間序列可拆解成趨勢性,季節(jié)性和殘差部分。atdk中ClassicSeasonalDecomposition提供了這三個部分拆解,并移除趨勢和季節(jié)性部分,返回殘差部分。

  •  freq: 設置季節(jié)性的周期
  •  trend:可以設置是否保留趨勢性 
  1. from adtk.transformer import ClassicSeasonalDecomposition  
  2. s = pd.read_csv('./data/nyc_taxi.csv', index_col="timestamp"parse_dates=True 
  3. s = validate_series(s) 
  4. s_transformed = ClassicSeasonalDecomposition().fit_transform(s) 

 

  1. s_transformed = ClassicSeasonalDecomposition(trend=True).fit_transform(s) 

4.3 降維和重構

adtk提供的pca對數(shù)據(jù)進行降維到主成分PcaProjection和重構方法PcaReconstruction。 

  1. df = pd.read_csv('./data/generator.csv', index_col="Time"parse_dates=True 
  2. df = validate_series(df)  
  3. from adtk.transformer import PcaProjection  
  4. s = PcaProjection(k=1).fit_transform(df)  
  5. plot(pd.concat([df, s], axis=1), ts_linewidth=1ts_markersize=3curve_group=[("Speed (kRPM)", "Power (kW)"), "pc0"]); 

 

  1. from adtk.transformer import PcaReconstruction  
  2. df_transformed = PcaReconstruction(k=1).fit_transform(df).rename(columns={"Speed (kRPM)": "Speed reconstruction (kRPM)", "Power (kW)": "Power reconstruction (kW)"}) 
  3. plot(pd.concat([df, df_transformed], axis=1), ts_linewidth=1ts_markersize=3curve_group=[("Speed (kRPM)", "Power (kW)"), ("Speed reconstruction (kRPM)", "Power reconstruction (kW)")]); 
  4. ../_images/notebooks_demo_99_0.png 

5. 異常檢測算法(detector)

adtk提供的主要是無監(jiān)督或者基于規(guī)則的時間序列檢測算法,可以用于常規(guī)的異常檢測。

  •  檢測離群點 離群點是和普通數(shù)據(jù)差異極大的數(shù)據(jù)點。adtk主要提供了包括 adtk.detector.ThresholdAD adtk.detector.QuantileAD adtk.detector.InterQuartileRangeAD adtk.detector.GeneralizedESDTestAD的檢測算法。
    •  ThresholdAD 
  1. adtk.detector.ThresholdAD(low=Nonehigh=None 
  2.  參數(shù):  
  3.  low:下限,小于此值,視為異常  
  4.  high:上限,大于此值,視為異常  
  5.  原理:通過認為設定上下限來識別異常  
  6.  總結:固定閾值算法  
  1. from adtk.detector import ThresholdAD  
  2. threshold_ad = ThresholdAD(high=30low=15 
  3. anomalies = threshold_ad.detect(s) 

  •  QuantileAD 
  1. adtk.detector.QuantileAD(low=Nonehigh=None 
  2. 參數(shù):  
  3. low:分位下限,范圍(0,1),當low=0.25時,表示Q1  
  4. high:分位上限,范圍(0,1),當low=0.25時,表示Q3  
  5. 原理:通過歷史數(shù)據(jù)計算出給定low與high對應的分位值Q_low,Q_high,小于Q_low或大于Q_high,視為異常  
  6. 總結:分位閾值算法  
  1. from adtk.detector import QuantileAD  
  2. quantile_ad = QuantileAD(high=0.99, low=0.01)  
  3. anomalies = quantile_ad.fit_detect(s) 

  •  InterQuartileRangeAD 
  1. adtk.detector.InterQuartileRangeAD(c=3.0)  
  2. 參數(shù):  
  3. c:分位距的系數(shù),用來確定上下限,可為float,也可為(float,float)  
  4. 原理: 
  5. 當c為float時,通過歷史數(shù)據(jù)計算出 Q3+c*IQR 作為上限值,大于上限值視為異常  
  6. c=(float1,float2)時,通過歷史數(shù)據(jù)計算出 (Q1-c1*IQR, Q3+c2*IQR) 作為正常范圍,不在正常范圍視為異常  
  7. 總結:箱線圖算法  
  1. from adtk.detector import InterQuartileRangeAD  
  2. iqr_ad = InterQuartileRangeAD(c=1.5)  
  3. anomalies = iqr_ad.fit_detect(s) 

  •  GeneralizedESDTestAD   
  1. adtk.detector.GeneralizedESDTestAD(alpha=0.05)  
  2.    參數(shù):  
  3.    alpha:顯著性水平 (Significance level),alpha越小,表示識別出的異常約有把握是真異常  
  4.    原理:將樣本點的值與樣本的均值作差后除以樣本標準差,取最大值,通過t分布計算閾值,對比閾值確定異常點  
  5.    計算步驟簡述:  
  6.    設置顯著水平alpha,通常取0.05  
  7.    指定離群比例h,若h=5%,則表示50各樣本中存在離群點數(shù)為2  
  8.    計算數(shù)據(jù)集的均值mu與標準差sigma,將所有樣本與均值作差,取絕對值,再除以標準差,找出最大值,得到esd_1  
  9.    在剩下的樣本點中,重復步驟3,可以得到h個esd值  
  10.    為每個esd值計算critical value: lambda_i (采用t分布計算)  
  11.    統(tǒng)計每個esd是否大于lambda_i,大于的認為你是異常  
  1. from adtk.detector import GeneralizedESDTestAD  
  2. esd_ad = GeneralizedESDTestAD(alpha=0.3)  
  3. anomalies = esd_ad.fit_detect(s) 

  •  突變:Spike and Level Shift 異常的表現(xiàn)形式不是離群點,而是通過和臨近點的比較,即突增或者突降。adtk提供adtk.detector.PersistAD 和 adtk.detector.LevelShiftAD檢測方法
    •  PersistAD   
  1. adtk.detector.PersistAD(window=1c=3.0, side='both'min_periods=Noneagg='median' 
  2.    參數(shù):  
  3.    window:參考窗長度,可為int, str  
  4.    c:分位距倍數(shù),用于確定上下限范圍  
  5.    side:檢測范圍,為'positive'時檢測突增,為'negative'時檢測突降,為'both'時突增突降都檢測  
  6.    min_periods:參考窗中最小個數(shù),小于此個數(shù)將會報異常,默認為None,表示每個時間點都得有值  
  7.    agg:參考窗中的統(tǒng)計量計算方式,因為當前值是與參考窗中產生的統(tǒng)計量作比較,所以得將參考窗中的數(shù)據(jù)計算成統(tǒng)計量,默認'median',表示去參考窗的中位值  
  8.    原理:  
  9.    用滑動窗口遍歷歷史數(shù)據(jù),將窗口后的一位數(shù)據(jù)與參考窗中的統(tǒng)計量做差,得到一個新的時間序列s1;  
  10.    計算s1的(Q1-c*IQR, Q3+c*IQR) 作為正常范圍; 
  11.    若當前值與它參考窗中的統(tǒng)計量之差,不在2中的正常范圍內,視為異常。  
  12.    調參:  
  13.    window:越大,模型越不敏感,不容易被突刺干擾  
  14.    c:越大,對于波動大的數(shù)據(jù),正常范圍放大較大,對于波動較小的數(shù)據(jù),正常范圍放大較小  
  15.    min_periods:對缺失值的容忍程度,越大,越不允許有太多的缺失值  
  16.    agg:統(tǒng)計量的聚合方式,跟統(tǒng)計量的特性有關,如 'median'不容易受極端值影響  
  17.    總結:先計算一條新的時間序列,再用箱線圖作異常檢測  
  1. from adtk.detector import PersistAD  
  2. persist_ad = PersistAD(c=3.0, side='positive' 
  3. anomalies = persist_ad.fit_detect(s) 

  •  LevelShiftAD 
  1. adtk.detector.LevelShiftAD(window, c=6.0, side='both'min_periods=None 
  2.  參數(shù):  
  3.  window:支持(10,5),表示使用兩個相鄰的滑動窗,左側的窗中的中位值表示參考值,右側窗中的中位值表示當前值  
  4.  c:越大,對于波動大的數(shù)據(jù),正常范圍放大較大,對于波動較小的數(shù)據(jù),正常范圍放大較小,默認6.0  
  5.  side:檢測范圍,為'positive'時檢測突增,為'negative'時檢測突降,為'both'時突增突降都檢測  
  6.  min_periods:參考窗中最小個數(shù),小于此個數(shù)將會報異常,默認為None,表示每個時間點都得有值  
  7.  原理: 
  8.  該模型用于檢測突變情況,相比于PersistAD,其抗抖動能力較強,不容易出現(xiàn)誤報  
  1. from adtk.detector import LevelShiftAD  
  2. level_shift_ad = LevelShiftAD(c=6.0, side='both'window=5 
  3. anomalies = level_shift_ad.fit_detect(s) 

  •  季節(jié)性
    •  adtk.detector.SeasonalAD 
  1. adtk.detector.SeasonalAD(freq=Noneside='both'c=3.0, trend=False 
  2. SeasonalAD主要是根據(jù)ClassicSeasonalDecomposition來處理,判斷。  
  3. 參數(shù):  
  4. freq:季節(jié)性周期  
  5. c:越大,對于波動大的數(shù)據(jù),正常范圍放大較大,對于波動較小的數(shù)據(jù),正常范圍放大較小,默認6.0  
  6. side:檢測范圍,為'positive'時檢測突增,為'negative'時檢測突降,為'both'時突增突降都檢測  
  7. trend: 是否考慮趨勢      
  1. from adtk.detector import SeasonalAD  
  2.       seasonal_ad = SeasonalAD(c=3.0, side="both" 
  3.       anomalies = seasonal_ad.fit_detect(s)  
  4.       plot(s, anomaly=anomaliests_markersize=1anomaly_color='red'anomaly_tag="marker"anomaly_markersize=2); 

  •  pipe 組合算法   
  1. from adtk.pipe import Pipeline  
  2.    steps = [  
  3.        ("deseasonal", ClassicSeasonalDecomposition()),  
  4.        ("quantile_ad", QuantileAD(high=0.995, low=0.005))  
  5.    ] 
  6.    pipeline = Pipeline(steps)  
  7.    anomalies = pipeline.fit_detect(s)  
  8.    plot(s, anomaly=anomaliests_markersize=1anomaly_markersize=2anomaly_tag="marker"anomaly_color='red'); 

6. 總結

本文介紹了時間序列異常檢測的無監(jiān)督算法工具包ADTK。ADTK提供了簡單的異常檢測算法和時間序列特征加工函數(shù),希望對你有幫助。總結如下:

  •  adtk要求輸入數(shù)據(jù)為datetimeIndex,validate_series來驗證數(shù)據(jù)有效性,使得時間有序
  •  adtk單窗口和double窗口滑動,加工統(tǒng)計特征
  •  adtk分解時間序列的季節(jié)部分,獲得時間序列的殘差部分,可根據(jù)這個判斷異常點
  •  adtk支持離群點、突變和季節(jié)性異常檢測。通過fit_detect 獲取異常點序列,也可以通過Pipeline聯(lián)通多部異常檢測算法 

 

責任編輯:龐桂玉 來源: Python中文社區(qū) (ID:python-china)
相關推薦

2022-09-21 23:41:40

機器學習開源數(shù)據(jù)

2025-03-28 10:10:30

機器學習PythonMSET

2024-09-09 14:57:31

2024-05-29 11:36:44

2020-10-15 12:00:01

Python 開發(fā)編程語言

2017-06-21 12:22:33

2021-07-02 10:05:45

PythonHot-winters指數(shù)平滑

2021-01-15 12:22:35

異常檢測工具

2021-09-24 12:25:03

谷歌AI人工智能

2021-07-01 21:46:30

PythonHot-Winters數(shù)據(jù)

2023-01-13 16:43:13

深度學習模型數(shù)據(jù)集

2018-08-16 10:05:07

2022-09-30 10:31:06

Python時間序列數(shù)據(jù)

2023-01-05 16:36:55

2020-10-27 10:13:06

Python時間序列代碼

2019-08-06 10:35:25

Python時間序列可視化

2025-01-13 07:23:14

PythonAeon開發(fā)

2021-08-05 13:49:39

Python工具開發(fā)

2024-05-30 12:50:54

2015-10-12 10:37:42

學習算法檢測
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91久久精品国产91久久性色tv | 色婷婷一区 | 中文字幕成人 | 亚洲精品成人网 | 一区二区三区视频在线观看 | 欧美不卡视频一区发布 | 国产精品中文字幕在线观看 | 成人免费视频网站在线观看 | 美女黄视频网站 | 日本一二三区在线观看 | 2018中文字幕第一页 | 插插宗合网 | 国产美女视频一区 | 久久久国产网站 | 国产精品91视频 | 中文字幕亚洲精品 | 日本在线看 | 亚州精品天堂中文字幕 | 91精品在线播放 | jlzzjlzz欧美大全 | 久久精品国产久精国产 | 欧美午夜精品久久久久久浪潮 | 天天干精品 | 日本不卡在线观看 | 欧美激情综合 | 亚洲一区二区三区在线观看免费 | 亚洲视频中文字幕 | 日韩成人中文字幕 | 精品香蕉一区二区三区 | 黑人巨大精品欧美一区二区一视频 | 请别相信他免费喜剧电影在线观看 | 欧美激情精品久久久久久变态 | 亚洲情综合五月天 | av毛片免费 | 精品一区在线免费观看 | 视频精品一区二区三区 | 国产日韩欧美二区 | 99精品视频一区二区三区 | 美女一级a毛片免费观看97 | 亚洲视频免费 | 欧美一区二区在线观看视频 |