局部離群因子 (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’
用於計算最近鄰居的演算法
注意:對稀疏輸入進行擬合將覆蓋此參數的設定,並使用暴力搜尋。
- leaf_sizeint, default=30
傳遞給
BallTree
或KDTree
的葉子大小。這可能會影響建構和查詢的速度,以及儲存樹所需的記憶體。最佳值取決於問題的性質。- 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
每個輸入樣本的局部異常因子的反向。數值越低,越不正常。