Scikit Learn - 異常檢測



在這裡,我們將學習什麼是 Sklearn 中的異常檢測以及它如何用於識別資料點。

異常檢測是一種用於識別資料集中與其餘資料不太匹配的資料點的技術。它在商業中有很多應用,例如欺詐檢測、入侵檢測、系統健康監控、監控和預測性維護。異常值(也稱為離群值)可以分為以下三類:

  • 點異常 - 當單個數據實例相對於其餘資料被認為是異常時發生。

  • 上下文異常 - 此類異常是特定於上下文的。如果資料例項在特定上下文中異常,則會發生這種情況。

  • 集體異常 - 當一系列相關資料例項相對於整個資料集而不是單個值而言是異常時發生。

方法

可以使用兩種方法,即離群點檢測新奇性檢測,進行異常檢測。有必要了解它們之間的區別。

離群點檢測

訓練資料包含遠離其餘資料的離群點。此類離群點定義為觀察值。這就是為什麼離群點檢測估計器總是嘗試擬合具有最集中訓練資料的區域,同時忽略異常觀察值的原因。它也稱為無監督異常檢測。

新奇性檢測

它關注的是檢測訓練資料中未包含的新觀察值中的未觀察到的模式。在這裡,訓練資料沒有被離群點汙染。它也稱為半監督異常檢測。

Scikit-learn 提供了一組 ML 工具,可用於離群點檢測和新奇性檢測。這些工具首先透過使用 fit() 方法如下在無監督的情況下從資料中實現物件學習:

estimator.fit(X_train)

現在,新觀察值將使用 predict() 方法如下被分類為內點(標記為 1)離群點(標記為 -1)

estimator.fit(X_test)

估計器將首先計算原始評分函式,然後預測方法將對該原始評分函式使用閾值。我們可以藉助score_sample方法訪問此原始評分函式,並透過contamination引數控制閾值。

我們還可以定義decision_function方法,該方法將離群點定義為負值,將內點定義為非負值。

estimator.decision_function(X_test)

用於離群點檢測的 Sklearn 演算法

讓我們首先了解什麼是橢圓包絡。

擬合橢圓包絡

該演算法假設常規資料來自已知分佈,例如高斯分佈。對於離群點檢測,Scikit-learn 提供了一個名為covariance.EllipticEnvelop的物件。

此物件將穩健的協方差估計擬合到資料,從而將橢圓擬合到中心資料點。它忽略中心模式之外的點。

引數

下表包含sklearn.covariance.EllipticEnvelop方法使用的引數:

序號 引數及描述
1

store_precision - 布林值,可選,預設值 = True

如果儲存估計的精度,我們可以指定它。

2

assume_centered - 布林值,可選,預設值 = False

如果我們將其設定為 False,它將使用 FastMCD 演算法直接計算穩健位置和協方差。另一方面,如果設定為 True,它將計算穩健位置和協方差的支援。

3

support_fraction - (0., 1.) 中的浮點數,可選,預設值 = None

此引數告訴方法有多少比例的點應包含在原始 MCD 估計的支援中。

4

contamination - (0., 1.) 中的浮點數,可選,預設值 = 0.1

它提供資料集中離群值的比例。

5

random_state - int、RandomState 例項或 None,可選,預設值 = none

此引數表示用於在混洗資料時生成的偽隨機數的種子。以下是選項:

  • int - 在這種情況下,random_state是隨機數生成器使用的種子。

  • RandomState 例項 - 在這種情況下,random_state是隨機數生成器。

  • None - 在這種情況下,隨機數生成器是 np.random 使用的 RandonState 例項。

屬性

下表包含sklearn.covariance.EllipticEnvelop方法使用的屬性:

序號 屬性及描述
1

support_ - 類似陣列,形狀 (n_samples,)

它表示用於計算位置和形狀的穩健估計的觀察值的掩碼。

2

location_ - 類似陣列,形狀 (n_features)

它返回估計的穩健位置。

3

covariance_ - 類似陣列,形狀 (n_features, n_features)

它返回估計的穩健協方差矩陣。

4

precision_ - 類似陣列,形狀 (n_features, n_features)

它返回估計的偽逆矩陣。

5

offset_ - 浮點數

它用於根據原始分數定義決策函式。decision_function = score_samples - offset_

實現示例

import numpy as np^M
from sklearn.covariance import EllipticEnvelope^M
true_cov = np.array([[.5, .6],[.6, .4]])
X = np.random.RandomState(0).multivariate_normal(mean = [0, 0], cov=true_cov,size=500)
cov = EllipticEnvelope(random_state = 0).fit(X)^M
# Now we can use predict method. It will return 1 for an inlier and -1 for an outlier.
cov.predict([[0, 0],[2, 2]])

輸出

array([ 1, -1])

隔離森林

對於高維資料集,一種有效的離群點檢測方法是使用隨機森林。scikit-learn 提供了ensemble.IsolationForest方法,該方法透過隨機選擇特徵來隔離觀察值。之後,它會在所選特徵的最大值和最小值之間隨機選擇一個值。

在這裡,隔離樣本所需的分割次數等於從根節點到終止節點的路徑長度。

引數

下表包含sklearn.ensemble.IsolationForest方法使用的引數:

序號 引數及描述
1

n_estimators - int,可選,預設值 = 100

它表示集合中基本估計器的數量。

2

max_samples - int 或 float,可選,預設值 = “auto”

它表示要從 X 中抽取以訓練每個基本估計器的樣本數量。如果我們選擇 int 作為其值,它將抽取 max_samples 個樣本。如果我們選擇 float 作為其值,它將抽取 max_samples * 𝑋.shape[0] 個樣本。如果我們選擇 auto 作為其值,它將抽取 max_samples = min(256, n_samples)。

3

support_fraction - (0., 1.) 中的浮點數,可選,預設值 = None

此引數告訴方法有多少比例的點應包含在原始 MCD 估計的支援中。

4

contamination - auto 或 float,可選,預設值 = auto

它提供資料集中離群值的比例。如果我們將其設定為預設值,即 auto,它將根據原始論文確定閾值。如果設定為浮點數,則汙染的範圍將在 [0,0.5] 範圍內。

5

random_state - int、RandomState 例項或 None,可選,預設值 = none

此引數表示用於在混洗資料時生成的偽隨機數的種子。以下是選項:

  • int - 在這種情況下,random_state是隨機數生成器使用的種子。

  • RandomState 例項 - 在這種情況下,random_state是隨機數生成器。

  • None - 在這種情況下,隨機數生成器是 np.random 使用的 RandonState 例項。

6

max_features - int 或 float,可選(預設值 = 1.0)

它表示要從 X 中抽取以訓練每個基本估計器的特徵數量。如果我們選擇 int 作為其值,它將抽取 max_features 個特徵。如果我們選擇 float 作為其值,它將抽取 max_features * X.shape[𝟏] 個樣本。

7

bootstrap - 布林值,可選(預設值 = False)

它的預設選項為 False,這意味著將不進行替換地進行取樣。另一方面,如果設定為 True,則表示個體樹將擬合到使用替換進行取樣的訓練資料的隨機子集上。

8

n_jobs - int 或 None,可選(預設值 = None)

它表示要為fit()predict()方法並行執行的作業數。

9

verbose - int,可選(預設值 = 0)

此引數控制樹構建過程的詳細程度。

10

warm_start - 布林值,可選(預設值 = False)

如果 warm_start = true,我們可以重用以前的呼叫解決方案進行擬合,並且可以向集合中新增更多估計器。但如果設定為 false,我們需要擬合一個全新的森林。

屬性

下表包含sklearn.ensemble.IsolationForest方法使用的屬性:

序號 屬性及描述
1

estimators_ - DecisionTreeClassifier 列表

提供所有擬合的子估計器的集合。

2

max_samples_ - 整數

它提供實際使用的樣本數。

3

offset_ - 浮點數

它用於根據原始分數定義決策函式。decision_function = score_samples - offset_

實現示例

下面的 Python 指令碼將使用sklearn.ensemble.IsolationForest方法在給定資料上擬合 10 棵樹。

from sklearn.ensemble import IsolationForest
import numpy as np
X = np.array([[-1, -2], [-3, -3], [-3, -4], [0, 0], [-50, 60]])
OUTDClf = IsolationForest(n_estimators = 10)
OUTDclf.fit(X)

輸出

IsolationForest(
   behaviour = 'old', bootstrap = False, contamination='legacy',
   max_features = 1.0, max_samples = 'auto', n_estimators = 10, n_jobs=None,
   random_state = None, verbose = 0
)

區域性異常因子

區域性異常因子 (LOF) 演算法是另一種有效的演算法,用於對高維資料執行離群點檢測。scikit-learn 提供了neighbors.LocalOutlierFactor方法,該方法計算一個分數(稱為區域性異常因子),反映觀察值的異常程度。該演算法的主要邏輯是檢測其密度與其鄰居相比明顯較低的資料樣本。這就是為什麼它會根據其鄰居測量給定資料點的區域性密度偏差的原因。

引數

下表包含sklearn.neighbors.LocalOutlierFactor方法使用的引數:

序號 引數及描述
1

n_neighbors - int,可選,預設值 = 20

它表示預設情況下 kneighbors 查詢使用的鄰居數量。如果使用 .,則將使用所有樣本。

2

algorithm - 可選

用於計算最近鄰居的演算法。

  • 如果選擇 ball_tree,它將使用 BallTree 演算法。

  • 如果選擇 kd_tree,它將使用 KDTree 演算法。

  • 如果選擇 brute,它將使用蠻力搜尋演算法。

  • 如果選擇 auto,它將根據我們傳遞給 fit() 方法的值來確定最合適的演算法。

3

leaf_size - int,可選,預設值 = 30

此引數的值會影響構建和查詢的速度。它還會影響儲存樹所需的記憶體。此引數傳遞給 BallTree 或 KdTree 演算法。

4

contamination - auto 或 float,可選,預設值 = auto

它提供資料集中離群值的比例。如果我們將其設定為預設值,即 auto,它將根據原始論文確定閾值。如果設定為浮點數,則汙染的範圍將在 [0,0.5] 範圍內。

5

metric - 字串或可呼叫物件,預設值

它表示用於距離計算的度量。

6

P - int,可選(預設值 = 2)

它是 Minkowski 度量的引數。P=1 等效於使用 manhattan_distance,即 L1,而 P=2 等效於使用 euclidean_distance,即 L2。

7

novelty - 布林值(預設值 = False)

預設情況下,LOF 演算法用於離群點檢測,但如果我們設定 novelty = true,則可以將其用於新奇性檢測。

8

n_jobs - int 或 None,可選(預設值 = None)

它表示要為 fit() 和 predict() 方法並行執行的作業數。

屬性

下表包含sklearn.neighbors.LocalOutlierFactor方法使用的屬性:

序號 屬性及描述
1

negative_outlier_factor_ - numpy 陣列,形狀 (n_samples,)

提供訓練樣本的相反 LOF。

2

n_neighbors_ − 整數

它提供了用於鄰居查詢的實際鄰居數量。

3

offset_ - 浮點數

它用於根據原始分數定義二元標籤。

實現示例

下面給出的 Python 指令碼將使用sklearn.neighbors.LocalOutlierFactor方法從與我們的資料集對應的任何陣列構建 NeighborsClassifier 類。

from sklearn.neighbors import NearestNeighbors
samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
LOFneigh = NearestNeighbors(n_neighbors = 1, algorithm = "ball_tree",p=1)
LOFneigh.fit(samples)

輸出

NearestNeighbors(
   algorithm = 'ball_tree', leaf_size = 30, metric='minkowski',
   metric_params = None, n_jobs = None, n_neighbors = 1, p = 1, radius = 1.0
)

示例

現在,我們可以使用下面的 Python 指令碼詢問此構建的分類器中距離[0.5, 1., 1.5]最近的點:

print(neigh.kneighbors([[.5, 1., 1.5]])

輸出

(array([[1.7]]), array([[1]], dtype = int64))

一類SVM

一類SVM由Schölkopf等人提出,是一種無監督的異常檢測方法。它在高維資料中也非常高效,並且可以估計高維分佈的支援向量。它在Sklearn.svm.OneClassSVM物件中的支援向量機模組中實現。為了定義邊界,它需要一個核函式(最常用的是RBF)和一個標量引數。

為了更好地理解,讓我們使用svm.OneClassSVM物件擬合我們的資料:

示例

from sklearn.svm import OneClassSVM
X = [[0], [0.89], [0.90], [0.91], [1]]
OSVMclf = OneClassSVM(gamma = 'scale').fit(X)

現在,我們可以按如下方式獲取輸入資料的score_samples:

OSVMclf.score_samples(X)

輸出

array([1.12218594, 1.58645126, 1.58673086, 1.58645127, 1.55713767])
廣告
© . All rights reserved.