1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        【統(tǒng)計(jì)學(xué)&Python】數(shù)據(jù)異常如何檢驗(yàn)?14種檢驗(yàn)方法!

        共 19416字,需瀏覽 39分鐘

         ·

        2024-04-11 03:24

        7523a119c5a53b102b4c9490bcec9250.webp


        、基于分布的方法

        1. 3sigma

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


        dff86ca059f8ac67348f823c542473ec.webp圖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ù)點(diǎn)和平均值的距離,若A與平均值相差2個(gè)標(biāo)準(zhǔn)差,Z-score為2。當(dāng)把Z-score=3作為閾值去剔除異常點(diǎn)時(shí),便相當(dāng)于3sigma。

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

        3. boxplot

        箱線圖時(shí)基于四分位距(IQR)找異常點(diǎn)的。


        3636ab3cabb8e77d1fe0320ea1c22de1.webp圖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è)檢驗(yàn)

        資料來源:

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

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

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

        • H0: 數(shù)據(jù)集中沒有異常值H1: 數(shù)據(jù)集中有一個(gè)異常值使用Grubbs測試需要總體是正態(tài)分布的。 算法流程: 1.樣本從小到大排序2.求樣本的mean和dev3.計(jì)算min/max與mean的差距,更大的那個(gè)為可疑值4.求可疑值的z-score (standard score),如果大于Grubbs臨界值,那么就是outlier
        • Grubbs臨界值可以查表得到,它由兩個(gè)值決定:檢出水平α(越嚴(yán)格越?。?,樣本數(shù)量n,排除outlier,對剩余序列循環(huán)做 1-4 步驟 [1]。詳細(xì)計(jì)算樣例可以參考:

                  from outliers import smirnov_grubbs as grubbs
          print(grubbs.test([891019], alpha=0.05))
          print(grubbs.min_test_outliers([891019], alpha=0.05))
          print(grubbs.max_test_outliers([891019], alpha=0.05))
          print(grubbs.max_test_indices([8910509], alpha=0.05))

          局限:

          1.只能檢測單維度數(shù)據(jù)2.無法精確的輸出正常區(qū)間3.它的判斷機(jī)制是“逐一剔除”,所以每個(gè)異常值都要單獨(dú)計(jì)算整個(gè)步驟,數(shù)據(jù)量大吃不消。4.需假定數(shù)據(jù)服從正態(tài)分布或近正態(tài)分布



          二、基于距離的方法

        1. KNN

        資料來源:

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

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

        y_train_scores = clf.decision_scores_

            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ù)上的異常值 (分值越大越異常)

        三、基于密度的方法

        1. Local Outlier Factor(LOF)

        資料來源:

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

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


        b3e67af11f78ba1a97f5de5df6feaf33.webp圖3:LOF異常檢測


        數(shù)據(jù)點(diǎn)P的局部相對密度(局部異常因子)=點(diǎn)P鄰域內(nèi)點(diǎn)的平均局部可達(dá)密度 跟 數(shù)據(jù)點(diǎn)P的局部可達(dá)密度 的比值:

        a883b08991f9900a402d00b6420b7cf2.webp

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

        142facf9d10c50ec72140688573a3654.webp

        點(diǎn)P到點(diǎn)O的第k可達(dá)距離=max(點(diǎn)O的k近鄰距離,點(diǎn)P到點(diǎn)O的距離)。

        3527d3acf748e99d17e1f25334cfcfaa.webp


        2c4caaa69de78fe8cc721ca6ef120795.webp圖4:可達(dá)距離


        點(diǎn)O的k近鄰距離=第 k個(gè)最近的點(diǎn)跟點(diǎn)O之間的距離。

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

        • 對于每個(gè)數(shù)據(jù)點(diǎn),計(jì)算它與其他所有點(diǎn)的距離,并按從近到遠(yuǎn)排序;
        • 對于每個(gè)數(shù)據(jù)點(diǎn),找到它的K-Nearest-Neighbor,計(jì)算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 Science176, 1420-1429.

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

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


        0d579ba9fb3afefd4bb727a51172eaa7.webp圖5:Set based nearest Path


        假使我們今天我們的k=5,所以F的neighbor為B、C、D、E、G。而對于F離他最近的點(diǎn)為E,所以SBN Path的第一個(gè)元素是F、第二個(gè)是E。離E最近的點(diǎn)為D所以第三個(gè)元素為D,接下來離D最近的點(diǎn)為C和G,所以第四和五個(gè)元素為C和G,最后離C最近的點(diǎn)為B,第六個(gè)元素為B。所以整個(gè)流程下來,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}。

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

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

        9fc91fe9bb8d4f1e6100b47665eb560a.webp

        有了ac_distance后,我們就可以計(jì)算COF:

        66d8dda6448b9f9b8a7dbe7a12b6e9da.webp

            # 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算法,會(huì)返回一個(gè)異常概率值向量(每個(gè)點(diǎn)對應(yīng)一個(gè))。SOS的思想是:當(dāng)一個(gè)點(diǎn)和其它所有點(diǎn)的關(guān)聯(lián)度(affinity)都很小的時(shí)候,它就是一個(gè)異常點(diǎn)。


        2aafb1f94e69375ad95afd5e3dbc6872.webp圖6:SOS計(jì)算流程


        SOS的流程:

        1. 計(jì)算相異度矩陣D;
        2. 計(jì)算關(guān)聯(lián)度矩陣A;
        3. 計(jì)算關(guān)聯(lián)概率矩陣B;
        4. 算出異常概率向量。

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


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


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

        7d1e453ad5e145e14fdb852e0ec9304a.webp

            # 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)的輸入和輸出如下,對于無法形成聚類簇的孤立點(diǎn),即為異常點(diǎn)(噪聲點(diǎn))。

        • 輸入:數(shù)據(jù)集,鄰域半徑Eps,鄰域中數(shù)據(jù)對象數(shù)目閾值MinPts;
        • 輸出:密度聯(lián)通簇。


        f3f5053425cc5214ac3ba148f403973f.webp圖9:DBSCAN


        處理流程如下。

        1. 從數(shù)據(jù)集中任意選取一個(gè)數(shù)據(jù)對象點(diǎn)p;
        2. 如果對于參數(shù)Eps和MinPts,所選取的數(shù)據(jù)對象點(diǎn)p為核心點(diǎn),則找出所有從p密度可達(dá)的數(shù)據(jù)對象點(diǎn),形成一個(gè)簇;
        3. 如果選取的數(shù)據(jù)對象點(diǎn) p 是邊緣點(diǎn),選取另一個(gè)數(shù)據(jù)對象點(diǎn);
        4. 重復(fù)以上2、3步,直到所有點(diǎn)被處理。

        # -1:最后一個(gè)為異常點(diǎn),不屬于任何一個(gè)群

            # Ref: https://zhuanlan.zhihu.com/p/515268801
        from sklearn.cluster import DBSCAN
        import numpy as np
        X = np.array([[12], [22], [23],
                      [87], [88], [2580]])
        clustering = DBSCAN(eps=3, min_samples=2).fit(X)

        clustering.labels_
        array([ 0,  0,  0,  1,  1-1])
        # 0,,0,,0:表示前三個(gè)樣本被分為了一個(gè)群
        # 1, 1:中間兩個(gè)被分為一個(gè)群

        五、基于樹的方法

        1. Isolation Forest (iForest)

        資料來源:

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

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

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

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

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

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


        5cff48be9a90bad8fed213676135d468.webp圖10:孤立森林


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

        b4dd8bcb57128f764d545ecb405c6572.webp

        • E(h(x)):為樣本在t棵iTree的PathLength的均值;
        • h(x):為樣本在iTree上的PathLength;
        • c(n):為n個(gè)樣本構(gòu)建一個(gè)二叉搜索樹BST中的未成功搜索平均路徑長度(均值h(x)對外部節(jié)點(diǎn)終端的估計(jì)等同于BST中的未成功搜索)。

        是對樣本x的路徑長度h(x)進(jìn)行標(biāo)準(zhǔn)化處理。H(n-1)是調(diào)和數(shù),可使用ln(n-1)+0.5772156649(歐拉常數(shù))估算。

        6df31a86ba47f72b36c2d7289eba8a12.webp

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

            # 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] 機(jī)器學(xué)習(xí)-異常檢測算法(三):Principal Component Analysis - 劉騰飛,知乎:https://zhuanlan.zhihu.com/p/29091645

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

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

        1. 將數(shù)據(jù)映射到低維特征空間,然后在特征空間不同維度上查看每個(gè)數(shù)據(jù)點(diǎn)跟其它數(shù)據(jù)的偏差;
        2. 將數(shù)據(jù)映射到低維特征空間,然后由低維特征空間重新映射回原空間,嘗試用低維特征重構(gòu)原始數(shù)據(jù),看重構(gòu)誤差的大小。

        PCA在做特征值分解,會(huì)得到:

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

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

        在前面提到第一種做法中,樣本的異常分?jǐn)?shù)為該樣本在所有方向上的偏離程度:166b9d910fa965e8849ed877090eff0a.webp其中, 為樣本在重構(gòu)空間里離特征向量的距離。若存在樣本點(diǎn)偏離各主成分越遠(yuǎn),會(huì)越大,意味偏移程度大,異常分?jǐn)?shù)高。是特征值,用于歸一化,使不同方向上的偏離程度具有可比性。

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

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

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

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

        a747944058401bd8667d4d720f42160e.webp

         

        fb033d0443a2949fcf2422b46c1c4dce.webp


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


        基于低維特征進(jìn)行數(shù)據(jù)樣本的重構(gòu)時(shí),舍棄了較小的特征值對應(yīng)的特征向量方向上的信息。換一句話說,重構(gòu)誤差其實(shí)主要來自較小的特征值對應(yīng)的特征向量方向上的信息?;谶@個(gè)直觀的理解,PCA在異常檢測上的兩種不同思路都會(huì)特別關(guān)注較小的特征值對應(yīng)的特征向量。所以,我們說PCA在做異常檢測時(shí)候的兩種思路本質(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ì)算異常分?jǐn)?shù)
        lambdas = pca.singular_values_
        M = ((y*y)/lambdas)

        # 前k個(gè)特征向量和后r個(gè)特征向量
        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)

        # 對每個(gè)樣本點(diǎn)進(jìn)行距離求和的計(jì)算
        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進(jìn)行無監(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ù)點(diǎn)較好地還原,導(dǎo)致還原誤差較大。因此如果一個(gè)新樣本被編碼,解碼之后,它的誤差超出正常數(shù)據(jù)編碼和解碼后的誤差范圍,則視作為異常數(shù)據(jù)。需要注意的是,AutoEncoder訓(xùn)練使用的數(shù)據(jù)是正常數(shù)據(jù)(即無異常值),這樣才能得到重構(gòu)后誤差分布范圍是多少以內(nèi)是合理正常的。所以AutoEncoder在這里做異常檢測時(shí),算是一種有監(jiān)督學(xué)習(xí)的方法。


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


        c9f165319c6a2b55fa7a51244c63593d.webp


        2:One-Class SVM

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

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

        0ee9500be779d252a64f97ddd867d617.webp

        C是調(diào)節(jié)松弛變量的影響大小,說的通俗一點(diǎn)就是,給那些需要松弛的數(shù)據(jù)點(diǎn)多少松弛空間,如果C比較小,會(huì)給離群點(diǎn)較大的彈性,使得它們可以不被包含進(jìn)超球體。詳細(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ù)課堂】時(shí)間序列異常檢測 - 時(shí)序人,文章:https://mp.weixin.qq.com/s/9TimTB_ccPsme2MNPuy6uA

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


        aae91c111c0242e884edf51ce9d83bad.webp




        圖13:基于預(yù)測的方法
        九、總結(jié)

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


        e037c8b8413a5af709fc86bd8b4f3a0d.webp


        來源:宅碼 原作者:AI


        GPT-4又幫了我一個(gè)小忙

        AI學(xué)習(xí)群,僅剩六個(gè)名額

        Google Gemini 1.5 Pro和 OpenAI Sora的一些資料

        用GPT-4學(xué)習(xí)董宇輝的文旅小作文風(fēng)格,回復(fù)城市名,自動(dòng)撰寫同款

        叫板GPT-4的Gemini,我做了一個(gè)聊天網(wǎng)頁,可圖片輸入,附教程


        瀏覽 25
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評論
        圖片
        表情
        推薦
        點(diǎn)贊
        評論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            www.啪 | 亚洲人成人无码网www国产 | 一区二区三区日韩免费 | 久久字幕 | 韩国sejin室拍大尺度人体 | 精品极品国产色在 | 久久精品免费一区二区三 | 成人黄色小说在线观看 | 婷婷色五月综合 | 蓝色七导航曰韩中文勉费满看 |