局部離群因子 (LocalOutlierFactor)#

class sklearn.neighbors.LocalOutlierFactor(n_neighbors=20, *, algorithm='auto', leaf_size=30, metric='minkowski', p=2, metric_params=None, contamination='auto', novelty=False, n_jobs=None)[原始碼]#

使用局部離群因子 (LOF) 的無監督離群值偵測。

每個樣本的異常分數稱為局部離群因子。它衡量給定樣本相對於其鄰居的局部密度偏差。它是局部的,因為異常分數取決於該物件相對於周圍鄰域的隔離程度。更精確地說,局部性由 k 最近鄰給出,其距離用於估計局部密度。通過將樣本的局部密度與其鄰居的局部密度進行比較,可以識別出密度遠低於其鄰居的樣本。這些被視為離群值。

在版本 0.19 中新增。

參數:
n_neighborsint, default=20

預設用於 kneighbors 查詢的鄰居數。如果 n_neighbors 大於提供的樣本數,將使用所有樣本。

algorithm{‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’}, default=’auto’

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

  • ‘ball_tree’ 將使用 BallTree

  • ‘kd_tree’ 將使用 KDTree

  • ‘brute’ 將使用暴力搜尋。

  • ‘auto’ 將嘗試根據傳遞給 fit 方法的值決定最適合的演算法。

注意:對稀疏輸入進行擬合將覆蓋此參數的設定,並使用暴力搜尋。

leaf_sizeint, default=30

傳遞給 BallTreeKDTree 的葉子大小。這可能會影響建構和查詢的速度,以及儲存樹所需的記憶體。最佳值取決於問題的性質。

metricstr 或 callable, default=’minkowski’

用於距離計算的度量。預設為 “minkowski”,當 p = 2 時會產生標準歐幾里得距離。請參閱 scipy.spatial.distance 的文件和 distance_metrics 中列出的度量,以取得有效的度量值。

如果度量為 “precomputed”,則假設 X 為距離矩陣,並且在擬合期間必須為方形。X 可以是 稀疏圖形,在這種情況下,只能將 “nonzero” 元素視為鄰居。

如果度量是可呼叫的函式,則它會將兩個表示 1D 向量的陣列作為輸入,並且必須傳回一個值,表示這些向量之間的距離。這適用於 Scipy 的度量,但效率不如以字串形式傳遞度量名稱。

pfloat, default=2

來自 sklearn.metrics.pairwise_distances 的 Minkowski 度量的參數。當 p = 1 時,這相當於使用 manhattan_distance (l1),而對於 p = 2,則相當於 euclidean_distance (l2)。對於任意 p,使用 minkowski_distance (l_p)。

metric_paramsdict, default=None

度量函式的其他關鍵字引數。

contamination‘auto’ 或 float, default=’auto’

資料集的污染量,即資料集中離群值的比例。擬合時,這用於定義樣本分數的閾值。

  • 如果為 ‘auto’,則閾值的確定方式與原始論文中相同,

  • 如果為 float,則污染應在範圍 (0, 0.5] 內。

在版本 0.22 中變更:contamination 的預設值從 0.1 變更為 'auto'

noveltybool, default=False

預設情況下,LocalOutlierFactor 僅用於離群值偵測 (novelty=False)。如果要將 LocalOutlierFactor 用於新奇值偵測,請將 novelty 設定為 True。在這種情況下,請注意,您應該僅在新未見的資料上使用 predict、decision_function 和 score_samples,而不要在訓練集上使用;並請注意,以這種方式獲得的結果可能與標準 LOF 結果不同。

在版本 0.20 中新增。

n_jobsint, default=None

用於鄰居搜尋的平行工作數。None 表示 1,除非在 joblib.parallel_backend 環境中。-1 表示使用所有處理器。請參閱 詞彙表 以取得更多詳細資訊。

屬性:
negative_outlier_factor_形狀為 (n_samples,) 的 ndarray

訓練樣本的相反 LOF。值越高,越正常。內部值傾向於具有接近 1 的 LOF 分數(negative_outlier_factor_ 接近 -1),而離群值傾向於具有較大的 LOF 分數。

樣本的局部離群因子 (LOF) 會捕獲其假設的「異常程度」。它是樣本的局部可達性密度與其 k 個最近鄰居的局部可達性密度的比率的平均值。

n_neighbors_int

用於 kneighbors 查詢的實際鄰居數。

offset_float

用於從原始分數中取得二元標籤的偏移量。具有小於 offset_ 的 negative_outlier_factor 的觀測值被偵測為異常。偏移量設定為 -1.5(內部值的分數約為 -1),除非提供了與 “auto” 不同的污染參數。在這種情況下,偏移量的定義方式為,我們在訓練中獲得預期的離群值數量。

在版本 0.20 中新增。

effective_metric_str

用於距離計算的有效度量。

effective_metric_params_dict

度量函式的有效其他關鍵字引數。

n_features_in_int

擬合 期間看到的特徵數。

在版本 0.24 中新增。

feature_names_in_形狀為 (n_features_in_,) 的 ndarray

fit 過程中看到的特徵名稱。只有當 X 具有全部為字串的特徵名稱時才定義。

在 1.0 版本中新增。

n_samples_fit_int

這是擬合數據中的樣本數量。

另請參閱

sklearn.svm.OneClassSVM

使用支持向量機進行無監督異常值檢測。

參考文獻

[1]

Breunig, M. M., Kriegel, H. P., Ng, R. T., & Sander, J. (2000, May). LOF: identifying density-based local outliers. In ACM sigmod record.

範例

>>> import numpy as np
>>> from sklearn.neighbors import LocalOutlierFactor
>>> X = [[-1.1], [0.2], [101.1], [0.3]]
>>> clf = LocalOutlierFactor(n_neighbors=2)
>>> clf.fit_predict(X)
array([ 1,  1, -1,  1])
>>> clf.negative_outlier_factor_
array([ -0.9821...,  -1.0370..., -73.3697...,  -0.9821...])
decision_function(X)[原始碼]#

X 的局部異常因子 (Local Outlier Factor) 的反向偏移。

越大越好,即較大的值對應於內圍點。

僅適用於新穎性偵測(當 novelty 設定為 True 時)。 偏移量允許零閾值表示為異常值。參數 X 應該包含新數據:如果 X 包含來自訓練集的點,則會將後者視為其自身的鄰域。此外,X 中的樣本不被視為任何點的鄰域。

參數:
X{類陣列, 稀疏矩陣},形狀為 (n_samples, n_features)

要計算相對於訓練樣本的局部異常因子的查詢樣本或多個樣本。

返回:
shifted_opposite_lof_scores形狀為 (n_samples,) 的 ndarray

每個輸入樣本的局部異常因子的反向偏移。數值越低,越不正常。負分代表異常值,正分代表內圍點。

fit(X, y=None)[原始碼]#

從訓練數據集擬合局部異常因子偵測器。

參數:
X{類陣列, 稀疏矩陣},形狀為 (n_samples, n_features) 或 (n_samples, n_samples)(如果 metric='precomputed')

訓練數據。

y已忽略

不使用,根據慣例為了 API 一致性而存在。

返回:
selfLocalOutlierFactor

擬合好的局部異常因子偵測器。

fit_predict(X, y=None)[原始碼]#

將模型擬合到訓練集 X 並返回標籤。

不適用於新穎性偵測(當 novelty 設定為 True 時)。 根據 LOF 分數和汙染參數,內圍點的標籤為 1,異常值的標籤為 -1。

參數:
X{類陣列, 稀疏矩陣},形狀為 (n_samples, n_features),預設為 None

要計算相對於訓練樣本的局部異常因子的查詢樣本或多個樣本。

y已忽略

不使用,根據慣例為了 API 一致性而存在。

返回:
is_inlier形狀為 (n_samples,) 的 ndarray

異常值/離群值返回 -1,內圍點返回 1。

get_metadata_routing()[原始碼]#

取得此物件的中繼資料路由。

請查看 使用者指南 以了解路由機制如何運作。

返回:
routingMetadataRequest

一個 MetadataRequest,封裝了路由資訊。

get_params(deep=True)[原始碼]#

取得此估算器的參數。

參數:
deepbool,預設為 True

如果為 True,將返回此估算器以及其中包含的子物件(也是估算器)的參數。

返回:
paramsdict

參數名稱對應到它們的值。

kneighbors(X=None, n_neighbors=None, return_distance=True)[原始碼]#

找到一個點的 K 個鄰居。

返回每個點的鄰居的索引和距離。

參數:
X{類陣列, 稀疏矩陣},形狀為 (n_queries, n_features),或 (n_queries, n_indexed)(如果 metric == 'precomputed'),預設為 None

查詢點或多個點。如果未提供,則返回每個索引點的鄰居。在這種情況下,查詢點不被視為其自身的鄰居。

n_neighborsint,預設為 None

每個樣本所需的鄰居數。預設值為傳遞給建構函式的值。

return_distancebool,預設為 True

是否返回距離。

返回:
neigh_dist形狀為 (n_queries, n_neighbors) 的 ndarray

表示到各點的長度的陣列,僅在 return_distance=True 時存在。

neigh_ind形狀為 (n_queries, n_neighbors) 的 ndarray

母體矩陣中最近點的索引。

範例

在以下範例中,我們從一個表示數據集的陣列建構一個 NearestNeighbors 類別,並詢問哪個點最接近 [1,1,1]:

>>> samples = [[0., 0., 0.], [0., .5, 0.], [1., 1., .5]]
>>> from sklearn.neighbors import NearestNeighbors
>>> neigh = NearestNeighbors(n_neighbors=1)
>>> neigh.fit(samples)
NearestNeighbors(n_neighbors=1)
>>> print(neigh.kneighbors([[1., 1., 1.]]))
(array([[0.5]]), array([[2]]))

如您所見,它返回 [[0.5]] 和 [[2]],這表示該元素距離為 0.5,並且是樣本的第三個元素(索引從 0 開始)。您也可以查詢多個點:

>>> X = [[0., 1., 0.], [1., 0., 1.]]
>>> neigh.kneighbors(X, return_distance=False)
array([[1],
       [2]]...)
kneighbors_graph(X=None, n_neighbors=None, mode='connectivity')[原始碼]#

計算 X 中各點的 k 個鄰居的(加權)圖。

參數:
X{類陣列, 稀疏矩陣},形狀為 (n_queries, n_features),或 (n_queries, n_indexed)(如果 metric == 'precomputed'),預設為 None

查詢點或多個點。如果未提供,則返回每個索引點的鄰居。在這種情況下,查詢點不被視為其自身的鄰居。對於 metric='precomputed',形狀應為 (n_queries, n_indexed)。否則,形狀應為 (n_queries, n_features)。

n_neighborsint,預設為 None

每個樣本的鄰居數。預設值為傳遞給建構函式的值。

mode{‘connectivity’, ‘distance’},預設為 ‘connectivity’

返回的矩陣類型:'connectivity' 將返回一個由 1 和 0 組成的連通性矩陣,在 'distance' 中,邊是點之間的距離,距離類型取決於 NearestNeighbors 類別中選定的 metric 參數。

返回:
A形狀為 (n_queries, n_samples_fit) 的稀疏矩陣

n_samples_fit 是擬合數據中的樣本數。A[i, j] 給出了將 i 連接到 j 的邊的權重。該矩陣為 CSR 格式。

另請參閱

NearestNeighbors.radius_neighbors_graph

計算 X 中各點的鄰居的(加權)圖。

範例

>>> X = [[0], [3], [1]]
>>> from sklearn.neighbors import NearestNeighbors
>>> neigh = NearestNeighbors(n_neighbors=2)
>>> neigh.fit(X)
NearestNeighbors(n_neighbors=2)
>>> A = neigh.kneighbors_graph(X)
>>> A.toarray()
array([[1., 0., 1.],
       [0., 1., 1.],
       [1., 0., 1.]])
predict(X=None)[原始碼]#

根據 LOF 預測 X 的標籤(1 表示內圍點,-1 表示異常值)。

僅適用於新穎性偵測(當 novelty 設定為 True 時)。 此方法允許將預測推廣到新的觀察值(不在訓練集中)。請注意,clf.fit(X) 然後 clf.predict(X)novelty=True 的結果可能與 clf.fit_predict(X)novelty=False 的結果不同。

參數:
X{類陣列, 稀疏矩陣},形狀為 (n_samples, n_features)

要計算相對於訓練樣本的局部異常因子的查詢樣本或多個樣本。

返回:
is_inlier形狀為 (n_samples,) 的 ndarray

異常值/離群值返回 -1,內圍點返回 +1。

score_samples(X)[原始碼]#

X 的局部異常因子的反向。

它是反向的,因為越大越好,即較大的值對應於內圍點。

僅適用於新穎性偵測(當 novelty 設定為 True 時)。 參數 X 應該包含新數據:如果 X 包含來自訓練集的點,則會將後者視為其自身的鄰域。此外,X 中的樣本不被視為任何點的鄰域。因此,通過 score_samples 獲得的分數可能與標準 LOF 分數不同。訓練數據的標準 LOF 分數可通過 negative_outlier_factor_ 屬性獲得。

參數:
X{類陣列, 稀疏矩陣},形狀為 (n_samples, n_features)

要計算相對於訓練樣本的局部異常因子的查詢樣本或多個樣本。

返回:
opposite_lof_scores形狀為 (n_samples,) 的 ndarray

每個輸入樣本的局部異常因子的反向。數值越低,越不正常。

set_params(**params)[原始碼]#

設定此估算器的參數。

該方法適用於簡單估算器以及巢狀物件(例如 Pipeline)。後者具有 <component>__<parameter> 形式的參數,以便可以更新巢狀物件的每個元件。

參數:
**paramsdict

估算器參數。

返回:
self估算器實例

估算器實例。