scikit-learn 奇異值和異常值檢測(cè)

2023-02-20 13:45 更新

許多應(yīng)用程序要有能力判斷新觀測(cè)值是否與現(xiàn)有觀測(cè)值具有相同的分布(它是一個(gè)內(nèi)點(diǎn)(inlier)),或者應(yīng)該被認(rèn)為是不同的(它是一個(gè)離群值)。通常,這種能力被用于清理實(shí)際數(shù)據(jù)集, 必須做出兩種重要區(qū)分:

離群點(diǎn)檢測(cè): 訓(xùn)練數(shù)據(jù)包含離群點(diǎn),這些離群點(diǎn)被定義為遠(yuǎn)離其它內(nèi)圍點(diǎn)的觀察值。因此,離群點(diǎn)檢測(cè)估計(jì)器會(huì)嘗試擬合出訓(xùn)練數(shù)據(jù)中內(nèi)圍點(diǎn)聚集的區(qū)域, 而忽略異常值觀察。
奇異值檢測(cè): 訓(xùn)練數(shù)據(jù)沒(méi)有受到離群點(diǎn)污染,我們感興趣的是檢測(cè)一個(gè)新的觀測(cè)值是否為離群點(diǎn)。在這種情況下,離群點(diǎn)被認(rèn)為是奇異值。

離群點(diǎn)檢測(cè)和奇異值檢測(cè)都用于異常檢測(cè), 其中一項(xiàng)感興趣的是檢測(cè)異常或異常觀察。離群點(diǎn)檢測(cè)又被稱(chēng)之為無(wú)監(jiān)督異常檢測(cè),奇異值檢測(cè)又被稱(chēng)之為半監(jiān)督異常檢測(cè)。 在。相反的,在奇異值檢測(cè)的背景下,奇異值/異常點(diǎn)只要位于訓(xùn)練數(shù)據(jù)的低密度區(qū)域,是可以形成稠密聚類(lèi)簇的,在此背景下被認(rèn)為是正常的。

scikit-learn項(xiàng)目提供了一組機(jī)器學(xué)習(xí)工具,可用于新穎性或離群值檢測(cè)。通過(guò)以無(wú)監(jiān)督的方式從數(shù)據(jù)中學(xué)習(xí)對(duì)象來(lái)實(shí)現(xiàn)此策略:

estimator.fit(X_train)

然后可以使用以下predict方法將新觀察值分類(lèi)為離群點(diǎn)或內(nèi)圍點(diǎn) :

estimator.predict(X_test)

內(nèi)圍點(diǎn)標(biāo)記為1,而離群點(diǎn)標(biāo)記為-1。預(yù)測(cè)方法利用了估計(jì)器計(jì)算的原始評(píng)分函數(shù)的閾值。通過(guò)該score_samples 可以訪問(wèn)此評(píng)分函數(shù),而閾值可以由contamination 參數(shù)控制。

decision_function還通過(guò)評(píng)分函數(shù)定義該方法,以使負(fù)值是離群點(diǎn),而非負(fù)值不是離群點(diǎn):

estimator.decision_function(X_test)

請(qǐng)注意 neighbors.LocalOutlierFactor 類(lèi)默認(rèn)不支持 predict, decision_functionscore_samples 方法,而只支持 fit_predict 方法, 因?yàn)檫@個(gè)估計(jì)器從本來(lái)就是被用到離群點(diǎn)檢測(cè)中去的??梢酝ㄟ^(guò) negative_outlier_factor_屬性來(lái)獲取訓(xùn)練樣本的異常性得分。

如果您真的想把neighbors.LocalOutlierFactor用于奇異值檢測(cè),即預(yù)測(cè)新的樣本標(biāo)簽或計(jì)算新的未知數(shù)據(jù)的異常分?jǐn)?shù),則可以在擬合估計(jì)器之前把novelty參數(shù)設(shè)置為True。在這種情況下,fit_predict不可用。

警告 :使用局部離群因子進(jìn)行奇異值檢測(cè)

當(dāng)novelty參數(shù)設(shè)置為 True 時(shí),在新的未見(jiàn)過(guò)的數(shù)據(jù)上,你只能使用 predict, decision_functionscore_samples ,而不能用在訓(xùn)練數(shù)據(jù)上, 因?yàn)闀?huì)導(dǎo)致錯(cuò)誤的結(jié)果。訓(xùn)練樣本的異常性得分始終可以通過(guò)negative_outlier_factor_屬性獲取。

neighbors.LocalOutlierFactor下表中總結(jié)了離群點(diǎn)檢測(cè)和奇異值檢測(cè)中的行為。

方法 離群點(diǎn)檢測(cè) 新穎性檢測(cè)
fit_predict 可用 無(wú)法使用
predict 無(wú)法使用 僅用于新數(shù)據(jù)
decision_function 無(wú)法使用 僅用于新數(shù)據(jù)
score_samples 采用 negative_outlier_factor_ 僅用于新數(shù)據(jù)

2.7.1. 離群點(diǎn)檢測(cè)方法一覽

比較scikit-learn中的離群點(diǎn)檢測(cè)算法。局部離群點(diǎn)因子(Local Outlier Factor, LOF)并沒(méi)有顯示黑色的決策邊界,因?yàn)楫?dāng)它用于離群點(diǎn)檢測(cè)時(shí),它沒(méi)有適用于新數(shù)據(jù)的 predict 方法。


ensemble.IsolationForestneighbors.LocalOutlierFactor 在此處用到的數(shù)據(jù)集上表現(xiàn)很好。svm.OneClassSVM被認(rèn)為對(duì)離群點(diǎn)敏感并因此對(duì)離群點(diǎn)檢測(cè)執(zhí)行的不是很好。最后, covariance.EllipticEnvelope假設(shè)數(shù)據(jù)服從高斯分布并學(xué)習(xí)一個(gè)橢圓。有關(guān)不同估計(jì)器的更多詳細(xì)信息,請(qǐng)參閱示例 玩具數(shù)據(jù)集異常檢測(cè)算法的比較研究以及以下各節(jié)。

示例:

2.7.2. Novelty Detection(奇異值檢測(cè))

考慮一個(gè)由 個(gè)特征描述的相同分布的 個(gè)觀測(cè)的數(shù)據(jù)集。 現(xiàn)在考慮我們?cè)谶@個(gè)數(shù)據(jù)集中再增加一個(gè)觀測(cè)值。 這個(gè)新觀測(cè)是否與其他的觀測(cè)值有很大差異,我們就可以懷疑它是否是常規(guī)值 (即它否來(lái)自相同的分布?)或者相反,如果新觀測(cè)與原有觀測(cè)非常相似以至于我們就無(wú)法將其與原有觀測(cè)值分開(kāi)? 這是奇異值檢測(cè)工具和方法所解決的問(wèn)題。

一般來(lái)說(shuō),它是要學(xué)習(xí)出一個(gè)粗略的、封閉的邊界劃定出初始觀測(cè)分布的輪廓,繪制在嵌入的 維空間中。然后,如果進(jìn)一步的觀測(cè)值位于這個(gè)邊界劃分的子空間內(nèi),則認(rèn)為它們來(lái)自與初始觀測(cè)值來(lái)自同一處。 否則,如果它們位于邊界之外,我們就可以說(shuō)根據(jù)我們?cè)u(píng)估給定的置信度而言,它們是異常的。

Sch?lkopf 等人已經(jīng)采用One-Class SVM(單類(lèi)支持向量機(jī))來(lái)實(shí)現(xiàn)新奇檢測(cè),并在屬于 支持向量機(jī) 模塊的 svm.OneClassSVM 對(duì)象中實(shí)現(xiàn)。 它需要選擇一個(gè) kernel 和 scalar 參數(shù)來(lái)定義邊界。 雖然沒(méi)有精確的公式或算法來(lái)設(shè)置RBF核的帶寬參數(shù),但通常選擇RBF核。這是scikit-learn實(shí)現(xiàn)中的默認(rèn)設(shè)置。參數(shù) ,也稱(chēng)為單類(lèi)支持向量機(jī)的邊沿,對(duì)應(yīng)于在邊界之外找到新的但常規(guī)的觀測(cè)值的概率。

參考資料:

示例:


2.7.3. Outlier Detection(離群點(diǎn)檢測(cè))

離群點(diǎn)檢測(cè)與新奇性檢測(cè)類(lèi)似,其目的是將常規(guī)觀測(cè)的核心數(shù)據(jù)與被稱(chēng)為離群點(diǎn)的污染數(shù)據(jù)分離開(kāi)來(lái)。然而,在離群點(diǎn)檢測(cè)的情況下,我們沒(méi)有一個(gè)清晰的數(shù)據(jù)集來(lái)表示常規(guī)觀測(cè)的總體,這些數(shù)據(jù)集可以用來(lái)訓(xùn)練任何工具。

2.7.3.1. Fitting an elliptic envelope(橢圓模型擬合)

執(zhí)行離群值檢測(cè)的一種常見(jiàn)方法是假設(shè)常規(guī)數(shù)據(jù)來(lái)自一個(gè)已知分布(例如數(shù)據(jù)是高斯分布的)。根據(jù)這一假設(shè),我們一般嘗試定義數(shù)據(jù)的“形狀”,并可以將邊緣觀測(cè)定義為距離擬合形狀足夠遠(yuǎn)的觀測(cè)值。

scikit-learn 提供了 covariance.EllipticEnvelope對(duì)象,橢圓包絡(luò)線,它對(duì)數(shù)據(jù)進(jìn)行穩(wěn)健的協(xié)方差估計(jì),從而對(duì)中心數(shù)據(jù)點(diǎn)進(jìn)行擬合出一個(gè)橢圓,忽略中心模式之外的點(diǎn)。

例如,假設(shè)內(nèi)部數(shù)據(jù)是高斯分布的,它將以一種可靠的方式(即不受離群值的影響)估算離群位置和協(xié)方差。從這個(gè)估計(jì)值得到的馬氏距離用來(lái)得出離群度的度量。這個(gè)策略如下所示。


示例:

參考資料:

  • Rousseeuw, P.J., Van Driessen, K. “A fast algorithm for the minimum covariance determinant estimator” Technometrics 41(3), 212 (1999)

2.7.3.2. Isolation Forest

在高維數(shù)據(jù)集中實(shí)現(xiàn)離群點(diǎn)檢測(cè)的一種有效方法是使用隨機(jī)森林。ensemble.IsolationForest 通過(guò)隨機(jī)選擇一個(gè)特征,然后隨機(jī)選擇一個(gè)被選擇特征的最大值和最小值之間的分割值來(lái)“隔離”觀察結(jié)果。

由于遞歸劃分可以由樹(shù)形結(jié)構(gòu)表示,因此隔離樣本所需的分割次數(shù)等于從根節(jié)點(diǎn)到終止節(jié)點(diǎn)的路徑長(zhǎng)度。

在這樣的隨機(jī)樹(shù)的森林中取平均值就是這條路徑的長(zhǎng)度,是對(duì)數(shù)據(jù)正態(tài)性和我們的決策函數(shù)的一種度量。

隨機(jī)劃分能為異常觀測(cè)產(chǎn)生明顯的更短路徑。 因此,當(dāng)隨機(jī)樹(shù)的森林為特定樣本共同產(chǎn)生較短的路徑長(zhǎng)度時(shí),他們很可能是異常的。

ensemble.IsolationForest的實(shí)現(xiàn),是基于tree.ExtraTreeRegressor全體。按照Isolation Forest原始,每棵樹(shù)的最大深度設(shè)置為,其中n是構(gòu)建樹(shù)所用的樣本數(shù)量(詳見(jiàn):(Liu et al., 2008) )

該算法如下圖所示。


ensemble.IsolationForest支持warm_start=True,可以讓你添加更多的樹(shù)到已擬合好的模型中:

>>> from sklearn.ensemble import IsolationForest
>>> import numpy as np
>>> X = np.array([[-1, -1], [-2, -1], [-3, -2], [0, 0], [-20, 50], [3, 5]])
>>> clf = IsolationForest(n_estimators=10, warm_start=True)
>>> clf.fit(X)  # fit 10 trees  
>>> clf.set_params(n_estimators=20)  # add 10 more trees  
>>> clf.fit(X)  # fit the added trees  

Examples:

References:

  • Liu, Fei Tony, Ting, Kai Ming and Zhou, Zhi-Hua. “Isolation forest.” Data Mining, 2008. ICDM’08. Eighth IEEE International Conference on.

2.7.3.3. Local Outlier Factor(局部離群因子)

對(duì)中等高維數(shù)據(jù)集(即維數(shù)勉強(qiáng)算是高維)執(zhí)行離群點(diǎn)檢測(cè)的另一種有效方法是使用局部離群因子(LOF)算法。

neighbors.LocalOutlierFactor LocalOutlierFactor (LOF)算法計(jì)算一個(gè)反映觀測(cè)異常程度的得分(稱(chēng)為局部離群因子)。 它測(cè)量給定數(shù)據(jù)點(diǎn)相對(duì)于相鄰數(shù)據(jù)點(diǎn)的局部密度偏差。這樣做的目的是為了檢測(cè)出那些比近鄰的密度低得多的樣本。

實(shí)際應(yīng)用中,局部密度從 k 個(gè)最近鄰求得的。 觀測(cè)數(shù)據(jù)的 LOF 得分等于其 k 個(gè)最近鄰的平均局部密度與其本身密度的比值:正常數(shù)據(jù)集預(yù)計(jì)與其近鄰有著相似的局部密度,而異常數(shù)據(jù)則預(yù)計(jì)比近鄰的局部密度要小得多。

k個(gè)近鄰數(shù)(別名參數(shù) n_neighbors )通常選擇 1) 大于一個(gè)聚類(lèi)簇必須包含的最小數(shù)量的對(duì)象,所以其它對(duì)象可以成為該聚類(lèi)簇的局部離散點(diǎn),并且 ,2) 小于可能成為聚類(lèi)簇對(duì)象的最大數(shù)量, 減少這K個(gè)近鄰成為離群點(diǎn)的可能性。在實(shí)踐中,這樣的信息通常不可用,并且使 n_neighbors = 20 似乎都能使算法有很好的表現(xiàn)。 當(dāng)離群點(diǎn)的比例較高時(shí)(大于 10% 時(shí),如下面的示例),n_neighbors 應(yīng)該較大(在下面的示例中,n_neighbors = 35)。

LOF 算法的優(yōu)點(diǎn)是考慮到數(shù)據(jù)集的局部和全局屬性:即使在具有不同潛在密度的離群點(diǎn)數(shù)據(jù)集中,它也能夠表現(xiàn)得很好。 問(wèn)題不在于樣本是如何被分離的,而是樣本與周?chē)彽姆蛛x程度有多大。

在使用 LOF 進(jìn)行離群點(diǎn)檢測(cè)時(shí),不能使用 predict, decisionfunction 和 score_samples 方法, 只能用 fit_predict 方法。訓(xùn)練樣本的異常性得分可通過(guò) negative_outlier_factor 屬性來(lái)獲得。 注意當(dāng)使用LOF算法進(jìn)行奇異值檢測(cè)的時(shí)候(novelty 設(shè)為 True), predict, decision_function 和 score_samples 函數(shù)可被用于新的未知數(shù)據(jù)。請(qǐng)查看具有局部離群因子(LOF)的新穎性檢測(cè).

該策略如下所示。


示例:

參考資料:

2.7.4. 使用LOF進(jìn)行奇異值檢測(cè)

為了使用 neighbors.LocalOutlierFactor 進(jìn)行奇異值檢測(cè), 即對(duì)新的未見(jiàn)過(guò)的樣本預(yù)測(cè)其標(biāo)簽或計(jì)算異常性得分,在擬合之前,你必須在實(shí)例化估計(jì)器時(shí), 將novelty參數(shù)設(shè)為 True:

lof = LocalOutlierFactor(novelty=True)
lof.fit(X_train)Copy

請(qǐng)注意此情況下fit_predict 不再適用。

警告 :使用局部離群因子(Local Outlier Factor,LOF)進(jìn)行奇異值檢測(cè)

要注意,在新的未見(jiàn)過(guò)的數(shù)據(jù)上,當(dāng)novelty參數(shù)被設(shè)為 True 時(shí)只能使用 predict, decision_functionscore_samples ,不能把這幾個(gè)函數(shù)用在訓(xùn)練數(shù)據(jù)上, 否則會(huì)導(dǎo)致錯(cuò)誤的結(jié)果。訓(xùn)練樣本的異常性得分可以通過(guò) negative_outlier_factor_屬性來(lái)訪問(wèn)獲取。

使用局部離群因子進(jìn)行奇異值檢測(cè)的示例見(jiàn)下圖:



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)