日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python+Sklearn實現異常檢測_python

作者:Python數據開發 ? 更新時間: 2023-01-26 編程語言

離群檢測 與 新奇檢測

很多應用場景都需要能夠確定樣本是否屬于與現有的分布,或者應該被視為不同的分布。

  • 離群檢測(Outlier detection):訓練數據包含離群值,這些離群值被定義為與其他觀察值相差甚遠的觀察值。
  • 新奇檢測 (Novelty detection):訓練數據沒有離群點,需要觀察新的樣本是否包含離群點。

離群檢測和新穎性檢測都用于異常檢測,其中人們對檢測異常或不尋常的觀察感興趣。離群檢測也稱為無監督異常檢測,新奇檢測稱為半監督異常檢測。

在離群檢測中離群值不能形成密集的集群,因為可以假設離群值位于低密度區域。相反在新穎性檢測中,新穎性處于訓練數據的低密度區域。

Sklearn 中支持的方法

如下圖為scikit-learn 中異常值檢測算法的比較,IsolationForest和LocalOutlierFactor在此處考慮的數據集上表現相當不錯。而OneClassSVM對離群值很敏感,因此在離群值檢測方面表現不佳。

但OneClassSVM仍可用于異常值檢測,但需要微調其超參數nu以處理異常值并防止過度擬合。SGDOneClassSVM提供了復雜度更低的實現。而EllipticEnvelope假設數據是高斯分布的并學習一個橢圓。

  • ensemble.IsolationForest
  • neighbors.LocalOutlierFactor
  • svm.OneClassSVM
  • linear_model.SGDOneClassSVM
  • covariance.EllipticEnvelope

孤立森林 IsolationForest

孤立森林(Isolation Forest)是一種異常值檢測算法。它通過建立多棵決策樹,并在每棵樹中隨機選取一個特征將數據集劃分為兩個子集來實現異常值檢測。與其他決策樹算法不同的是,孤立森林算法并不是用來預測目標變量的值的,而是用來預測數據點是否是異常值。

為了計算出每個數據點是否是異常值,孤立森林算法對每個數據點計算出一個分數,稱為異常分數。數據點的異常分數越低,說明它越可能是一個異常值。通常情況下,我們可以設定一個閾值,如果數據點的異常分數低于這個閾值,就認為這是一個異常值。

關鍵參數:

  • n_estimators:學習器個數
  • max_samples:采樣最大樣本個數
  • max_features:采樣最大特征個數
from sklearn.ensemble import IsolationForest  
X = [[-1.1], [0.3], [0.5], [100]]  
clf = IsolationForest(random_state=0).fit(X)  
  
# 預測特定樣本是否為異常值  
# 對于每個觀察值,返回 (+1 或 -1) 分別代表正常樣本和異常值  
clf.predict([[0.1], [0], [90]])  

Local Outlier Factor

Local Outlier Factor (LOF) 是一種用于檢測數據集中異常或異常數據點的算法。LOF 背后的基本思想是測量給定數據點與其相鄰數據點的局部偏差。如果一個點與其相鄰點有顯著差異,則將其視為異常值。一個點被視為離群值的程度通過稱為局部離群值因子的度量來量化。

首先確定該點鄰居的密度,密度計算方法是將給定距離內的鄰居數除以具有該距離的球體的體積。較高鄰居密度的點被認為比具有較低鄰居密度的點更不離群。然后將一個點的 LOF 計算為該點與其相鄰點的密度之比。具有高 LOF 值的點被認為是異常值。

關鍵參數:

  • n_neighbors:最近鄰樣本個數
  • metric:距離計算方法
import numpy as np  
from sklearn.neighbors import LocalOutlierFactor  
X = [[-1.1], [0.2], [101.1], [0.3]]  
clf = LocalOutlierFactor(n_neighbors=2)  
  
# 異常/離群值返回 -1,離群值返回 +1  
clf.fit_predict(X)  

OneClassSVM

OneClassSVM是一種用于檢測異常點的算法,是一種無監督學習算法。決策邊界將數據點分為兩類:內點和外點。非離群點是與訓練集中的大多數點相似的點,而離群點是與訓練集中的大多數點顯著不同的點。

為了學習決策邊界,OneClassSVM最大化邊界和內點之間的距離,最終找到合適的超平面。這個超平面可以最大化內點和決策邊界之間的邊距。一旦學習了決策邊界,就可以使用它來將新點分類為內點或異常點。

關鍵參數:

  • kernel:SVM內核類型
  • nu:訓練誤差分數的上限
from sklearn.svm import OneClassSVM  
X = [[0], [0.44], [0.45], [0.46], [1]]  
clf = OneClassSVM(gamma='auto').fit(X)  
  
# 異常/離群值返回 -1,離群值返回 +1  
clf.predict(X)  

在實際使用中OneClassSVM速度較慢,因此可以考慮使用隨機梯度下降求解線性的SVM來代替,也就是SGDOneClassSVM。

Elliptic Envelope

橢圓包絡(Elliptic Envelope)是一種檢測數據集中異常或異常數據點的方法。它是一種無監督學習方法,通過將橢圓擬合到訓練集中的數據點來工作,但假設大多數點遵循高斯分布。

為了擬合橢圓,橢圓包絡估計數據點的均值和協方差,并使用這些估計值來確定橢圓的形狀和方向。一旦學習了橢圓,它就可以用來將新點分類為內點或異常點。

import numpy as np  
from sklearn.covariance import EllipticEnvelope  
true_cov = np.array([[.8, .3],  
                     [.3, .4]])  
X = np.random.RandomState(0).multivariate_normal(mean=[0, 0],  
                                                 cov=true_cov,  
                                                 size=500)  
cov = EllipticEnvelope(random_state=0).fit(X)  
# predict returns 1 for an inlier and -1 for an outlier  
cov.predict([[0, 0],  
             [3, 3]])  

原文鏈接:https://blog.csdn.net/m0_59596937/article/details/128403378

欄目分類
最近更新