<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          14種異常檢測方法總結(jié)!

          共 14520字,需瀏覽 30分鐘

           ·

          2022-06-09 13:46


          作者丨Ai
          來源丨宅碼
          編輯丨極市平臺

          導(dǎo)讀

          ?

          本文收集整理了公開網(wǎng)絡(luò)上一些常見的異常檢測方法(附資料來源和代碼)。

          本文收集整理了公開網(wǎng)絡(luò)上一些常見的異常檢測方法(附資料來源和代碼)。不足之處,還望批評指正。

          一、基于分布的方法

          1. 3sigma

          基于正態(tài)分布,3sigma準(zhǔn)則認(rèn)為超過3sigma的數(shù)據(jù)為異常點。

          圖1: 3sigma
          def?three_sigma(s):
          ????mu,?std?=?np.mean(s),?np.std(s)
          ????lower,?upper?=?mu-3*std,?mu+3*std
          ????return?lower,?upper

          2. Z-score

          Z-score為標(biāo)準(zhǔn)分?jǐn)?shù),測量數(shù)據(jù)點和平均值的距離,若A與平均值相差2個標(biāo)準(zhǔn)差,Z-score為2。當(dāng)把Z-score=3作為閾值去剔除異常點時,便相當(dāng)于3sigma。

          def?z_score(s):
          ??z_score?=?(s?-?np.mean(s))?/?np.std(s)
          ??return?z_score

          3. boxplot

          箱線圖時基于四分位距(IQR)找異常點的。

          圖2: boxplot
          def?boxplot(s):
          ????q1,?q3?=?s.quantile(.25),?s.quantile(.75)
          ????iqr?=?q3?-?q1
          ????lower,?upper?=?q1?-?1.5*iqr,?q3?+?1.5*iqr
          ????return?lower,?upper

          4. Grubbs假設(shè)檢驗

          資料來源:

          [1] 時序預(yù)測競賽之異常檢測算法綜述 - 魚遇雨欲語與余,知乎:https://zhuanlan.zhihu.com/p/336944097

          [2] 剔除異常值柵格計算器_數(shù)據(jù)分析師所需的統(tǒng)計學(xué):異常檢測 - weixin_39974030,CSDN:https://blog.csdn.net/weixin_39974030/article/details/112569610

          Grubbs’Test為一種假設(shè)檢驗的方法,常被用來檢驗服從正態(tài)分布的單變量數(shù)據(jù)集(univariate data set)Y中的單個異常值。若有異常值,則其必為數(shù)據(jù)集中的最大值或最小值。原假設(shè)與備擇假設(shè)如下:

          • H0: 數(shù)據(jù)集中沒有異常值

          • H1: 數(shù)據(jù)集中有一個異常值

          使用Grubbs測試需要總體是正態(tài)分布的。算法流程:

          1. 樣本從小到大排序

          2. 求樣本的mean和dev

          3. 計算min/max與mean的差距,更大的那個為可疑值

          4. 求可疑值的z-score (standard score),如果大于Grubbs臨界值,那么就是outlier

          Grubbs臨界值可以查表得到,它由兩個值決定:檢出水平α(越嚴(yán)格越小),樣本數(shù)量n,排除outlier,對剩余序列循環(huán)做 1-4 步驟 [1]。詳細(xì)計算樣例可以參考。

          from?outliers?import?smirnov_grubbs?as?grubbs
          print(grubbs.test([8,?9,?10,?1,?9],?alpha=0.05))
          print(grubbs.min_test_outliers([8,?9,?10,?1,?9],?alpha=0.05))
          print(grubbs.max_test_outliers([8,?9,?10,?1,?9],?alpha=0.05))
          print(grubbs.max_test_indices([8,?9,?10,?50,?9],?alpha=0.05))

          局限:

          1、只能檢測單維度數(shù)據(jù)

          2、無法精確的輸出正常區(qū)間

          3、它的判斷機制是“逐一剔除”,所以每個異常值都要單獨計算整個步驟,數(shù)據(jù)量大吃不消。

          4、需假定數(shù)據(jù)服從正態(tài)分布或近正態(tài)分布

          二、基于距離的方法

          1. KNN

          資料來源:

          [3] 異常檢測算法之(KNN)-K Nearest Neighbors - 小伍哥聊風(fēng)控,知乎:https://zhuanlan.zhihu.com/p/501691799

          依次計算每個樣本點與它最近的K個樣本的平均距離,再利用計算的距離與閾值進行比較,如果大于閾值,則認(rèn)為是異常點。優(yōu)點是不需要假設(shè)數(shù)據(jù)的分布,缺點是僅可以找出全局異常點,無法找到局部異常點。

          from?pyod.models.knn?import?KNN

          #?初始化檢測器clf
          clf?=?KNN(?method='mean',?n_neighbors=3,?)
          clf.fit(X_train)
          #?返回訓(xùn)練數(shù)據(jù)上的分類標(biāo)簽?(0:?正常值,?1:?異常值)
          y_train_pred?=?clf.labels_
          #?返回訓(xùn)練數(shù)據(jù)上的異常值?(分值越大越異常)
          y_train_scores?=?clf.decision_scores_

          三、基于密度的方法

          1. Local Outlier Factor (LOF)

          資料來源:

          [4] 一文讀懂異常檢測 LOF 算法(Python代碼)- 東哥起飛,知乎:https://zhuanlan.zhihu.com/p/448276009

          LOF是基于密度的經(jīng)典算法(Breuning et. al. 2000),通過給每個數(shù)據(jù)點都分配一個依賴于鄰域密度的離群因子 LOF,進而判斷該數(shù)據(jù)點是否為離群點。它的好處在于可以量化每個數(shù)據(jù)點的異常程度(outlierness)。

          圖3:LOF異常檢測

          數(shù)據(jù)點 的局部相對密度(局部異常因子)為點 鄰域內(nèi)點的平均局部可達密度跟數(shù)據(jù) 點 的局部可達密度的比值, 即:

          數(shù)據(jù)點P的局部可達密度=P最近鄰的平均可達距離的倒數(shù)。距離越大,密度越小。

          點P到點O的第k可達距離=max(點O的k近鄰距離,點P到點O的距離)。

          圖4:可達距離

          點O的k近鄰距離=第k個最近的點跟點O之間的距離。

          整體來說,LOF算法流程如下:

          • 對于每個數(shù)據(jù)點,計算它與其他所有點的距離,并按從近到遠排序;

          • 對于每個數(shù)據(jù)點,找到它的K-Nearest-Neighbor,計算LOF得分。

          from?sklearn.neighbors?import?LocalOutlierFactor?as?LOF

          X?=?[[-1.1],?[0.2],?[100.1],?[0.3]]
          clf?=?LOF(n_neighbors=2)
          res?=?clf.fit_predict(X)
          print(res)
          print(clf.negative_outlier_factor_)

          2. Connectivity-Based Outlier Factor (COF)

          資料來源:

          [5] Nowak-Brzezińska, A., & Horyń, C. (2020). Outliers in rules-the comparision of LOF, COF and KMEANS algorithms. *Procedia Computer Science*, *176*, 1420-1429.

          [6] 機器學(xué)習(xí)_學(xué)習(xí)筆記系列(98):基於連接異常因子分析(Connectivity-Based Outlier Factor) ?- 劉智皓 (Chih-Hao Liu)

          COF是LOF的變種,相比于LOF,COF可以處理低密度下的異常值,COF的局部密度是基于平均鏈?zhǔn)骄嚯x計算得到。在一開始的時候我們一樣會先計算出每個點的k-nearest neighbor。而接下來我們會計算每個點的Set based nearest Path,如下圖:

          圖5:Set based nearest Path

          假使我們今天我們的k=5,所以F的neighbor為B、C、D、E、G。而對于F離他最近的點為E,所以SBN Path的第一個元素是F、第二個是E。離E最近的點為D所以第三個元素為D,接下來離D最近的點為C和G,所以第四和五個元素為C和G,最后離C最近的點為B,第六個元素為B。所以整個流程下來,F(xiàn)的SBN Path為{F, E, D, C, G, C, B}。而對于SBN Path所對應(yīng)的距離e={e1, e2, e3,…,ek},依照上面的例子e={3,2,1,1,1}。

          所以我們可以說假使我們想計算p點的SBN Path,我們只要直接計算p點和其neighbor所有點所構(gòu)成的graph的minimum spanning tree,之后我們再以p點為起點執(zhí)行shortest path算法,就可以得到我們的SBN Path。

          而接下來我們有了SBN Path我們就會接著計算,p點的鏈?zhǔn)骄嚯x:

          有了ac_distance后,我們就可以計算COF:

          #?https://zhuanlan.zhihu.com/p/362358580
          from?pyod.models.cof?import?COF
          cof?=?COF(contamination?=?0.06,??##?異常值所占的比例
          ??????????n_neighbors?=?20,??????##?近鄰數(shù)量
          ????????)
          cof_label?=?cof.fit_predict(iris.values)?#?鳶尾花數(shù)據(jù)
          print("檢測出的異常值數(shù)量為:",np.sum(cof_label?==?1))

          3. Stochastic Outlier Selection (SOS)

          資料來源:

          [7] 異常檢測之SOS算法 - 呼廣躍,知乎:https://zhuanlan.zhihu.com/p/34438518

          將特征矩陣(feature martrix)或者相異度矩陣(dissimilarity matrix)輸入給SOS算法,會返回一個異常概率值向量(每個點對應(yīng)一個)。SOS的思想是:當(dāng)一個點和其它所有點的關(guān)聯(lián)度(affinity)都很小的時候,它就是一個異常點。

          圖6:SOS計算流程

          SOS的流程:

          1. 計算相異度矩陣D;

          2. 計算關(guān)聯(lián)度矩陣A;

          3. 計算關(guān)聯(lián)概率矩陣B;

          4. 算出異常概率向量。

          相異度矩陣D是各樣本兩兩之間的度量距離, 比如歐式距離或漢明距離等。關(guān)聯(lián)度矩陣反映的是 度量距離方差, 如圖7, 點 的密度最大, 方差最小; 的密度最小, 方差最大。而關(guān)聯(lián)概率 矩陣 (binding probability matrix)就是把關(guān)聯(lián)矩陣(affinity matrix)按行歸一化得到的, 如圖 8 所 示。

          圖7:關(guān)聯(lián)度矩陣中密度可視化
          圖8:關(guān)聯(lián)概率矩陣

          得到了binding probability matrix,每個點的異常概率值就用如下的公式計算,當(dāng)一個點和其它所有點的關(guān)聯(lián)度(affinity)都很小的時候,它就是一個異常點。

          #?Ref:?https://github.com/jeroenjanssens/scikit-sos
          import?pandas?as?pd
          from?sksos?import?SOS
          iris?=?pd.read_csv("http://bit.ly/iris-csv")
          X?=?iris.drop("Name",?axis=1).values
          detector?=?SOS()
          iris["score"]?=?detector.predict(X)
          iris.sort_values("score",?ascending=False).head(10)

          四、基于聚類的方法

          1. DBSCAN

          DBSCAN算法(Density-Based Spatial Clustering of Applications with Noise)的輸入和輸出如下,對于無法形成聚類簇的孤立點,即為異常點(噪聲點)。

          • 輸入:數(shù)據(jù)集,鄰域半徑Eps,鄰域中數(shù)據(jù)對象數(shù)目閾值MinPts;

          • 輸出:密度聯(lián)通簇。

          圖9:DBSCAN

          處理流程如下:

          1. 從數(shù)據(jù)集中任意選取一個數(shù)據(jù)對象點p;

          2. 如果對于參數(shù)Eps和MinPts,所選取的數(shù)據(jù)對象點p為核心點,則找出所有從p密度可達的數(shù)據(jù)對象點,形成一個簇;

          3. 如果選取的數(shù)據(jù)對象點 p 是邊緣點,選取另一個數(shù)據(jù)對象點;

          4. 重復(fù)以上2、3步,直到所有點被處理。

          #?Ref:?https://zhuanlan.zhihu.com/p/515268801
          from?sklearn.cluster?import?DBSCAN
          import?numpy?as?np
          X?=?np.array([[1,?2],?[2,?2],?[2,?3],
          ??????????????[8,?7],?[8,?8],?[25,?80]])
          clustering?=?DBSCAN(eps=3,?min_samples=2).fit(X)

          clustering.labels_
          array([?0,??0,??0,??1,??1,?-1])
          #?0,,0,,0:表示前三個樣本被分為了一個群
          # 1, 1:中間兩個被分為一個群
          #?-1:最后一個為異常點,不屬于任何一個群

          五、基于樹的方法

          1. Isolation Forest (iForest)

          資料來源:

          [8] 異常檢測算法 -- 孤立森林(Isolation Forest)剖析 - 風(fēng)控大魚,知乎:https://zhuanlan.zhihu.com/p/74508141

          [9] 孤立森林(isolation Forest)-一個通過瞎幾把亂分進行異常檢測的算法 - 小伍哥聊風(fēng)控,知乎:https://zhuanlan.zhihu.com/p/484495545

          [10] 孤立森林閱讀 - Mark_Aussie,博文:https://blog.csdn.net/MarkAustralia/article/details/120181899

          孤立森林中的 “孤立” (isolation) 指的是 “把異常點從所有樣本中孤立出來”,論文中的原文是 “separating an instance from the rest of the instances”。

          我們用一個隨機超平面對一個數(shù)據(jù)空間進行切割,切一次可以生成兩個子空間。接下來,我們再繼續(xù)隨機選取超平面,來切割第一步得到的兩個子空間,以此循環(huán)下去,直到每子空間里面只包含一個數(shù)據(jù)點為止。我們可以發(fā)現(xiàn),那些密度很高的簇要被切很多次才會停止切割,即每個點都單獨存在于一個子空間內(nèi),但那些分布稀疏的點,大都很早就停到一個子空間內(nèi)了。所以,整個孤立森林的算法思想:異常樣本更容易快速落入葉子結(jié)點或者說,異常樣本在決策樹上,距離根節(jié)點更近。

          隨機選擇m個特征,通過在所選特征的最大值和最小值之間隨機選擇一個值來分割數(shù)據(jù)點。觀察值的劃分遞歸地重復(fù),直到所有的觀察值被孤立。

          圖10:孤立森林

          獲得 t 個孤立樹后,單棵樹的訓(xùn)練就結(jié)束了。接下來就可以用生成的孤立樹來評估測試數(shù)據(jù)了,即計算異常分?jǐn)?shù) s。對于每個樣本 x,需要對其綜合計算每棵樹的結(jié)果,通過下面的公式計算異常得分:

          • h(x):為樣本在iTree上的PathLength;

          • E(h(x)):為樣本在t棵iTree的PathLength的均值;

          • : 為 個樣本構(gòu)建一個二叉搜索樹BST中的末成功搜索平均路徑長度 (均值h(x)對外部節(jié)點終端的估計等同于BST中的末成功搜索)。 是對樣本x的路徑長度 進行標(biāo)準(zhǔn)化處理。 是調(diào)和數(shù), 可使用 (歐拉常數(shù)) 估算。

          指數(shù)部分值域為(?∞,0),因此s值域為(0,1)。當(dāng)PathLength越小,s越接近1,此時樣本為異常值的概率越大。

          # Ref:https://zhuanlan.zhihu.com/p/484495545
          from?sklearn.datasets?import?load_iris?
          from?sklearn.ensemble?import?IsolationForest

          data?=?load_iris(as_frame=True)?
          X,y?=?data.data,data.target?
          df?=?data.frame?

          #?模型訓(xùn)練
          iforest?=?IsolationForest(n_estimators=100,?max_samples='auto',??
          ??????????????????????????contamination=0.05,?max_features=4,??
          ??????????????????????????bootstrap=False,?n_jobs=-1,?random_state=1)

          #??fit_predict?函數(shù)?訓(xùn)練和預(yù)測一起?可以得到模型是否異常的判斷,-1為異常,1為正常
          df['label']?=?iforest.fit_predict(X)?

          #?預(yù)測?decision_function?可以得出?異常評分
          df['scores']?=?iforest.decision_function(X)

          六、基于降維的方法

          1. Principal Component Analysis (PCA)

          資料來源:

          [11] 機器學(xué)習(xí)-異常檢測算法(三):Principal Component Analysis - 劉騰飛,知乎:https://zhuanlan.zhihu.com/p/29091645

          [12] Anomaly Detection異常檢測--PCA算法的實現(xiàn) - CC思SS,知乎:https://zhuanlan.zhihu.com/p/48110105

          PCA在異常檢測方面的做法,大體有兩種思路:

          (1) 將數(shù)據(jù)映射到低維特征空間,然后在特征空間不同維度上查看每個數(shù)據(jù)點跟其它數(shù)據(jù)的偏差;

          (2) 將數(shù)據(jù)映射到低維特征空間,然后由低維特征空間重新映射回原空間,嘗試用低維特征重構(gòu)原始數(shù)據(jù),看重構(gòu)誤差的大小。

          PCA在做特征值分解,會得到:

          • 特征向量:反應(yīng)了原始數(shù)據(jù)方差變化程度的不同方向;

          • 特征值:數(shù)據(jù)在對應(yīng)方向上的方差大小。

          所以,最大特征值對應(yīng)的特征向量為數(shù)據(jù)方差最大的方向,最小特征值對應(yīng)的特征向量為數(shù)據(jù)方差最小的方向。原始數(shù)據(jù)在不同方向上的方差變化反應(yīng)了其內(nèi)在特點。如果單個數(shù)據(jù)樣本跟整體數(shù)據(jù)樣本表現(xiàn)出的特點不太一致,比如在某些方向上跟其它數(shù)據(jù)樣本偏離較大,可能就表示該數(shù)據(jù)樣本是一個異常點。

          在前面提到第一種做法中,樣本的異常分?jǐn)?shù)為該樣本在所有方向上的偏離程度:

          其中, 為樣本在重構(gòu)空間里離特征向量的距離。若存在樣本點偏離各主成分越遠, 會越大, 意味偏移程度大, 異常分?jǐn)?shù)高。 是特征值, 用于歸一化, 使不同方向上的偏離程度具有可比性。

          在計算異常分?jǐn)?shù)時,關(guān)于特征向量(即度量異常用的標(biāo)桿)選擇又有兩種方式:

          • 考慮在前k個特征向量方向上的偏差:前k個特征向量往往直接對應(yīng)原始數(shù)據(jù)里的某幾個特征,在前幾個特征向量方向上偏差比較大的數(shù)據(jù)樣本,往往就是在原始數(shù)據(jù)中那幾個特征上的極值點。

          • 考慮后r個特征向量方向上的偏差:后r個特征向量通常表示某幾個原始特征的線性組合,線性組合之后的方差比較小反應(yīng)了這幾個特征之間的某種關(guān)系。在后幾個特征方向上偏差比較大的數(shù)據(jù)樣本,表示它在原始數(shù)據(jù)里對應(yīng)的那幾個特征上出現(xiàn)了與預(yù)計不太一致的情況。

          得分大于閾值C則判斷為異常。

          第二種做法,PCA提取了數(shù)據(jù)的主要特征,如果一個數(shù)據(jù)樣本不容易被重構(gòu)出來,表示這個數(shù)據(jù)樣本的特征跟整體數(shù)據(jù)樣本的特征不一致,那么它顯然就是一個異常的樣本:

          其中, 是基于 維特征向量重構(gòu)的樣本。

          基于低維特征進行數(shù)據(jù)樣本的重構(gòu)時,舍棄了較小的特征值對應(yīng)的特征向量方向上的信息。換一句話說,重構(gòu)誤差其實主要來自較小的特征值對應(yīng)的特征向量方向上的信息。基于這個直觀的理解,PCA在異常檢測上的兩種不同思路都會特別關(guān)注較小的特征值對應(yīng)的特征向量。所以,我們說PCA在做異常檢測時候的兩種思路本質(zhì)上是相似的,當(dāng)然第一種方法還可以關(guān)注較大特征值對應(yīng)的特征向量。

          #?Ref:?[https://zhuanlan.zhihu.com/p/48110105](https://zhuanlan.zhihu.com/p/48110105)
          from?sklearn.decomposition?import?PCA
          pca?=?PCA()
          pca.fit(centered_training_data)
          transformed_data?=?pca.transform(training_data)
          y?=?transformed_data

          #?計算異常分?jǐn)?shù)
          lambdas?=?pca.singular_values_
          M?=?((y*y)/lambdas)

          #?前k個特征向量和后r個特征向量
          q?=?5
          print?"Explained?variance?by?first?q?terms:?",?sum(pca.explained_variance_ratio_[:q])
          q_values?=?list(pca.singular_values_?.2)
          r?=?q_values.index(True)

          #?對每個樣本點進行距離求和的計算
          major_components?=?M[:,range(q)]
          minor_components?=?M[:,range(r,?len(features))]
          major_components?=?np.sum(major_components,?axis=1)
          minor_components?=?np.sum(minor_components,?axis=1)

          #?人為設(shè)定c1、c2閾值
          components?=?pd.DataFrame({'major_components':?major_components,?
          ???????????????????????????????'minor_components':?minor_components})
          c1?=?components.quantile(0.99)['major_components']
          c2?=?components.quantile(0.99)['minor_components']

          #?制作分類器
          def?classifier(major_components,?minor_components):??
          ????major?=?major_components?>?c1
          ????minor?=?minor_components?>?c2????
          ????return?np.logical_or(major,minor)

          results?=?classifier(major_components=major_components,?minor_components=minor_components)

          2. AutoEncoder

          資料來源:

          [13] 利用Autoencoder進行無監(jiān)督異常檢測(Python) - SofaSofa.io,知乎:https://zhuanlan.zhihu.com/p/46188296

          [14] 自編碼器AutoEncoder解決異常檢測問題(手把手寫代碼) - 數(shù)據(jù)如琥珀,知乎:https://zhuanlan.zhihu.com/p/260882741

          PCA是線性降維,AutoEncoder是非線性降維。根據(jù)正常數(shù)據(jù)訓(xùn)練出來的AutoEncoder,能夠?qū)⒄颖局亟ㄟ€原,但是卻無法將異于正常分布的數(shù)據(jù)點較好地還原,導(dǎo)致還原誤差較大。因此如果一個新樣本被編碼,解碼之后,它的誤差超出正常數(shù)據(jù)編碼和解碼后的誤差范圍,則視作為異常數(shù)據(jù)。需要注意的是,AutoEncoder訓(xùn)練使用的數(shù)據(jù)是正常數(shù)據(jù)(即無異常值),這樣才能得到重構(gòu)后誤差分布范圍是多少以內(nèi)是合理正常的。所以AutoEncoder在這里做異常檢測時,算是一種有監(jiān)督學(xué)習(xí)的方法。

          圖11:自編碼器
          #?Ref:?[https://zhuanlan.zhihu.com/p/260882741](https://zhuanlan.zhihu.com/p/260882741)
          import?tensorflow?as?tf
          from?keras.models?import?Sequential
          from?keras.layers?import?Dense

          #?標(biāo)準(zhǔn)化數(shù)據(jù)
          scaler?=?preprocessing.MinMaxScaler()
          X_train?=?pd.DataFrame(scaler.fit_transform(dataset_train),
          ??????????????????????????????columns=dataset_train.columns,
          ??????????????????????????????index=dataset_train.index)
          #?Random?shuffle?training?data
          X_train.sample(frac=1)
          X_test?=?pd.DataFrame(scaler.transform(dataset_test),
          ?????????????????????????????columns=dataset_test.columns,
          ?????????????????????????????index=dataset_test.index)

          tf.random.set_seed(10)
          act_func?=?'relu'
          #?Input?layer:
          model=Sequential()
          #?First?hidden?layer,?connected?to?input?vector?X.
          model.add(Dense(10,activation=act_func,
          ????????????????kernel_initializer='glorot_uniform',
          ????????????????kernel_regularizer=regularizers.l2(0.0),
          ????????????????input_shape=(X_train.shape[1],)
          ???????????????)
          ?????????)
          model.add(Dense(2,activation=act_func,
          ????????????????kernel_initializer='glorot_uniform'))
          model.add(Dense(10,activation=act_func,
          ????????????????kernel_initializer='glorot_uniform'))
          model.add(Dense(X_train.shape[1],
          ????????????????kernel_initializer='glorot_uniform'))
          model.compile(loss='mse',optimizer='adam')
          print(model.summary())

          #?Train?model?for?100?epochs,?batch?size?of?10:
          NUM_EPOCHS=100
          BATCH_SIZE=10
          history=model.fit(np.array(X_train),np.array(X_train),
          ??????????????????batch_size=BATCH_SIZE,
          ??????????????????epochs=NUM_EPOCHS,
          ??????????????????validation_split=0.05,
          ??????????????????verbose?=?1)

          plt.plot(history.history['loss'],
          ?????????'b',
          ?????????label='Training?loss')
          plt.plot(history.history['val_loss'],
          ?????????'r',
          ?????????label='Validation?loss')
          plt.legend(loc='upper?right')
          plt.xlabel('Epochs')
          plt.ylabel('Loss,?[mse]')
          plt.ylim([0,.1])
          plt.show()

          #?查看訓(xùn)練集還原的誤差分布如何,以便制定正常的誤差分布范圍
          X_pred?=?model.predict(np.array(X_train))
          X_pred?=?pd.DataFrame(X_pred,
          ??????????????????????columns=X_train.columns)
          X_pred.index?=?X_train.index

          scored?=?pd.DataFrame(index=X_train.index)
          scored['Loss_mae']?=?np.mean(np.abs(X_pred-X_train),?axis?=?1)
          plt.figure()
          sns.distplot(scored['Loss_mae'],
          ?????????????bins?=?10,
          ?????????????kde=?True,
          ????????????color?=?'blue')
          plt.xlim([0.0,.5])

          #?誤差閾值比對,找出異常值
          X_pred?=?model.predict(np.array(X_test))
          X_pred?=?pd.DataFrame(X_pred,
          ??????????????????????columns=X_test.columns)
          X_pred.index?=?X_test.index
          threshod?=?0.3
          scored?=?pd.DataFrame(index=X_test.index)
          scored['Loss_mae']?=?np.mean(np.abs(X_pred-X_test),?axis?=?1)
          scored['Threshold']?=?threshod
          scored['Anomaly']?=?scored['Loss_mae']?>?scored['Threshold']
          scored.head()

          七、基于分類的方法

          1. One-Class SVM

          資料來源:

          [15] Python機器學(xué)習(xí)筆記:One Class SVM - zoukankan,博文:http://t.zoukankan.com/wj-1314-p-10701708.html

          [16] 單類SVM: SVDD - 張義策,知乎:https://zhuanlan.zhihu.com/p/65617987

          One-Class SVM,這個算法的思路非常簡單,就是尋找一個超平面將樣本中的正例圈出來,預(yù)測就是用這個超平面做決策,在圈內(nèi)的樣本就認(rèn)為是正樣本,在圈外的樣本是負(fù)樣本,用在異常檢測中,負(fù)樣本可看作異常樣本。它屬于無監(jiān)督學(xué)習(xí),所以不需要標(biāo)簽。

          圖12:One-Class SVM

          One-Class SVM又一種推導(dǎo)方式是SVDD(Support Vector Domain Description,支持向量域描述),對于SVDD來說,我們期望所有不是異常的樣本都是正類別,同時它采用一個超球體,而不是一個超平面來做劃分,該算法在特征空間中獲得數(shù)據(jù)周圍的球形邊界,期望最小化這個超球體的體積,從而最小化異常點數(shù)據(jù)的影響。

          假設(shè)產(chǎn)生的超球體參數(shù)為中心 o 和對應(yīng)的超球體半徑r>0,超球體體積V(r)被最小化,中心o是支持行了的線性組合;跟傳統(tǒng)SVM方法相似,可以要求所有訓(xùn)練數(shù)據(jù)點xi到中心的距離嚴(yán)格小于r。但是同時構(gòu)造一個懲罰系數(shù)為C的松弛變量 ζi,優(yōu)化問題入下所示:

          C是調(diào)節(jié)松弛變量的影響大小,說的通俗一點就是,給那些需要松弛的數(shù)據(jù)點多少松弛空間,如果C比較小,會給離群點較大的彈性,使得它們可以不被包含進超球體。詳細(xì)推導(dǎo)過程參考資料[15] [16]。

          from?sklearn?import?svm
          #?fit?the?model
          clf?=?svm.OneClassSVM(nu=0.1,?kernel='rbf',?gamma=0.1)
          clf.fit(X)
          y_pred?=?clf.predict(X)
          n_error_outlier?=?y_pred[y_pred?==?-1].size

          八、基于預(yù)測的方法

          資料來源:

          [17] 【TS技術(shù)課堂】時間序列異常檢測 - 時序人,文章:https://mp.weixin.qq.com/s/9TimTB_ccPsme2MNPuy6uA

          對于單條時序數(shù)據(jù),根據(jù)其預(yù)測出來的時序曲線和真實的數(shù)據(jù)相比,求出每個點的殘差,并對殘差序列建模,利用KSigma或者分位數(shù)等方法便可以進行異常檢測。具體的流程如下:

          圖13:基于預(yù)測的方法

          九、總結(jié)

          異常檢測方法總結(jié)如下:

          參考資料

          [1] 時序預(yù)測競賽之異常檢測算法綜述 - 魚遇雨欲語與余,知乎:https://zhuanlan.zhihu.com/p/336944097

          [2] 剔除異常值柵格計算器_數(shù)據(jù)分析師所需的統(tǒng)計學(xué):異常檢測 - weixin_39974030,CSDN:https://blog.csdn.net/weixin_39974030/article/details/112569610

          [3] 異常檢測算法之(KNN)-K Nearest Neighbors - 小伍哥聊風(fēng)控,知乎:https://zhuanlan.zhihu.com/p/501691799

          [4] 一文讀懂異常檢測 LOF 算法(Python代碼)- 東哥起飛,知乎:https://zhuanlan.zhihu.com/p/448276009

          [5] Nowak-Brzezińska, A., & Horyń, C. (2020). Outliers in rules-the comparision of LOF, COF and KMEANS algorithms. *Procedia Computer Science*, *176*, 1420-1429.

          [6] 機器學(xué)習(xí)_學(xué)習(xí)筆記系列(98):基於連接異常因子分析(Connectivity-Based Outlier Factor) ?- 劉智皓 (Chih-Hao Liu)

          [7] 異常檢測之SOS算法 - 呼廣躍,知乎:https://zhuanlan.zhihu.com/p/34438518

          [8] 異常檢測算法 -- 孤立森林(Isolation Forest)剖析 - 風(fēng)控大魚,知乎:https://zhuanlan.zhihu.com/p/74508141

          [9] 孤立森林(isolation Forest)-一個通過瞎幾把亂分進行異常檢測的算法 - 小伍哥聊風(fēng)控,知乎:https://zhuanlan.zhihu.com/p/484495545

          [10] 孤立森林閱讀 - Mark_Aussie,博文:https://blog.csdn.net/MarkAustralia/article/details/12018189

          [11] 機器學(xué)習(xí)-異常檢測算法(三):Principal Component Analysis - 劉騰飛,知乎:https://zhuanlan.zhihu.com/p/29091645

          [12] Anomaly Detection異常檢測--PCA算法的實現(xiàn) - CC思SS,知乎:https://zhuanlan.zhihu.com/p/48110105

          [13] 利用Autoencoder進行無監(jiān)督異常檢測(Python) - SofaSofa.io,知乎:https://zhuanlan.zhihu.com/p/46188296

          [14] 自編碼器AutoEncoder解決異常檢測問題(手把手寫代碼) - 數(shù)據(jù)如琥珀,知乎:https://zhuanlan.zhihu.com/p/260882741

          [15] Python機器學(xué)習(xí)筆記:One Class SVM - zoukankan,博文:http://t.zoukankan.com/wj-1314-p-10701708.html

          [16] 單類SVM: SVDD - 張義策,知乎:https://zhuanlan.zhihu.com/p/65617987[17] 【TS技術(shù)課堂】時間序列異常檢測 - 時序人,文章:https://mp.weixin.qq.com/s/9TimTB_ccPsme2MNPuy6uA


          往期精彩:

          ?講解視頻來了!機器學(xué)習(xí) 公式推導(dǎo)與代碼實現(xiàn)開錄!

          ?更新!《機器學(xué)習(xí):公式推導(dǎo)與代碼實現(xiàn)》1-16章PPT下載

          《機器學(xué)習(xí) 公式推導(dǎo)與代碼實現(xiàn)》隨書PPT示例

          ?時隔一年!深度學(xué)習(xí)語義分割理論與代碼實踐指南.pdf第二版來了!

          ?新書首發(fā) | 《機器學(xué)習(xí) 公式推導(dǎo)與代碼實現(xiàn)》正式出版!

          《機器學(xué)習(xí)公式推導(dǎo)與代碼實現(xiàn)》將會配套PPT和視頻講解!

          瀏覽 58
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  操逼大秀| 波多野结衣免费AV | 久久水蜜桃视频 | 东京热2网站 | 天天天天射天天天搞天天要 |