Scikit Learn-이상 탐지
여기에서는 Sklearn에서 이상 감지가 무엇인지, 데이터 포인트 식별에 어떻게 사용되는지에 대해 알아 봅니다.
이상 탐지는 나머지 데이터와 잘 맞지 않는 데이터 세트의 데이터 포인트를 식별하는 데 사용되는 기술입니다. 사기 탐지, 침입 탐지, 시스템 상태 모니터링, 감시 및 예측 유지 관리와 같은 비즈니스에 많은 응용 프로그램이 있습니다. 이상치라고도하는 이상 치는 다음 세 가지 범주로 나눌 수 있습니다.
Point anomalies − 개별 데이터 인스턴스가 나머지 데이터에서 비정상적인 것으로 간주 될 때 발생합니다.
Contextual anomalies− 이러한 종류의 이상은 상황에 따라 다릅니다. 데이터 인스턴스가 특정 컨텍스트에서 비정상적인 경우 발생합니다.
Collective anomalies − 관련 데이터 인스턴스 모음이 개별 값이 아닌 전체 데이터 세트에 대해 비정상적인 경우 발생합니다.
행동 양식
즉 두 가지 방법 outlier detection 과 novelty detection이상 감지에 사용할 수 있습니다. 그들 사이의 차이를 볼 필요가 있습니다.
이상치 감지
훈련 데이터에는 나머지 데이터와는 거리가 먼 이상 치가 포함됩니다. 이러한 이상 치는 관측치로 정의됩니다. 그렇기 때문에 이상치 탐지 추정자는 항상 비정상적인 관찰을 무시하면서 가장 집중된 훈련 데이터가있는 영역을 맞추려고합니다. 비지도 이상 탐지라고도합니다.
참신 감지
훈련 데이터에 포함되지 않은 새로운 관찰에서 관찰되지 않은 패턴을 탐지하는 것과 관련이 있습니다. 여기서 훈련 데이터는 특이 치에 의해 오염되지 않습니다. 반 감독 이상 탐지라고도합니다.
scikit-learn에서 제공하는 ML 도구 세트가 있으며, 이는 이상치 감지와 신규성 감지 모두에 사용할 수 있습니다. 이 도구는 먼저 다음과 같이 fit () 방법을 사용하여 감독되지 않은 데이터에서 객체 학습을 구현합니다.
estimator.fit(X_train)
이제 새 관측 값은 다음과 같이 정렬됩니다. inliers (labeled 1) 또는 outliers (labeled -1) 다음과 같이 predict () 메서드를 사용하여-
estimator.fit(X_test)
추정기는 먼저 원시 스코어링 함수를 계산 한 다음 예측 방법이 해당 원시 스코어링 함수의 임계 값을 사용합니다. 이 원시 채점 기능에 액세스 할 수 있습니다.score_sample 방법으로 임계 값을 제어 할 수 있습니다. contamination 매개 변수.
우리는 또한 정의 할 수 있습니다 decision_function 이상 값을 음수 값으로, 내부 값을 음이 아닌 값으로 정의하는 방법입니다.
estimator.decision_function(X_test)
이상치 탐지를위한 Sklearn 알고리즘
타원 봉투가 무엇인지 이해하는 것으로 시작하겠습니다.
타원 봉투 맞추기
이 알고리즘은 정규 데이터가 가우스 분포와 같은 알려진 분포에서 나온다고 가정합니다. 이상 값 감지를 위해 Scikit-learn은covariance.EllipticEnvelop.
이 객체는 로버 스트 공분산 추정치를 데이터에 맞추므로 타원을 중앙 데이터 포인트에 맞 춥니 다. 중앙 모드 외부의 점은 무시합니다.
매개 변수
다음 표는 sklearn. covariance.EllipticEnvelop 방법-
Sr. 아니요 | 매개 변수 및 설명 |
---|---|
1 | store_precision − 부울, 옵션, 기본값 = True 추정 된 정밀도가 저장되면이를 지정할 수 있습니다. |
2 | assume_centered − 부울, 옵션, 기본값 = False False로 설정하면 FastMCD 알고리즘을 사용하여 강력한 위치와 공분산을 직접 계산합니다. 반면 True로 설정하면 강력한 위치 및 covarian의 지원을 계산합니다. |
삼 | support_fraction − 부동 (0., 1.), 선택 사항, 기본값 = 없음 이 매개 변수는 원시 MCD 추정의 지원에 포함될 포인트의 비율을 방법에 알려줍니다. |
4 | contamination − 부동 (0., 1.), 선택 사항, 기본값 = 0.1 데이터 세트에서 특이 치의 비율을 제공합니다. |
5 | random_state − int, RandomState 인스턴스 또는 None, 선택 사항, 기본값 = 없음 이 매개 변수는 데이터를 섞는 동안 사용되는 생성 된 의사 난수의 시드를 나타냅니다. 다음은 옵션입니다-
|
속성
다음 표는 sklearn. covariance.EllipticEnvelop 방법-
Sr. 아니요 | 속성 및 설명 |
---|---|
1 | support_ − 배열 형, 모양 (n_samples,) 위치와 모양에 대한 강력한 추정치를 계산하는 데 사용되는 관찰의 마스크를 나타냅니다. |
2 | location_ − 배열 형, 모양 (n_features) 추정 된 견고한 위치를 반환합니다. |
삼 | covariance_ − 배열 형, 모양 (n_features, n_features) 추정 된 로버 스트 공분산 행렬을 반환합니다. |
4 | precision_ − 배열 형, 모양 (n_features, n_features) 추정 된 의사 역행렬을 반환합니다. |
5 | offset_ − 플로트 원시 점수에서 결정 기능을 정의하는 데 사용됩니다. decision_function = score_samples -offset_ |
Implementation Example
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]])
Output
array([ 1, -1])
고립의 숲
고차원 데이터 세트의 경우 이상 값 감지를위한 효율적인 방법 중 하나는 랜덤 포레스트를 사용하는 것입니다. scikit-learn은ensemble.IsolationForest특징을 무작위로 선택하여 관찰을 분리하는 방법. 그 후 선택된 기능의 최대 값과 최소값 사이의 값을 무작위로 선택합니다.
여기서 샘플을 분리하는 데 필요한 분할 횟수는 루트 노드에서 종료 노드까지의 경로 길이와 같습니다.
매개 변수
다음 표는에서 사용하는 매개 변수로 구성됩니다. sklearn. ensemble.IsolationForest 방법-
Sr. 아니요 | 매개 변수 및 설명 |
---|---|
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)이 그려집니다. |
삼 | support_fraction − 부동 (0., 1.), 선택 사항, 기본값 = 없음 이 매개 변수는 원시 MCD 추정의 지원에 포함될 포인트의 비율을 방법에 알려줍니다. |
4 | contamination − auto 또는 float, 선택 사항, 기본값 = auto 데이터 세트에서 특이 치의 비율을 제공합니다. 기본값 인 자동으로 설정하면 원본 용지에서와 같이 임계 값이 결정됩니다. float로 설정하면 오염 범위는 [0,0.5] 범위가됩니다. |
5 | random_state − int, RandomState 인스턴스 또는 None, 선택 사항, 기본값 = 없음 이 매개 변수는 데이터를 섞는 동안 사용되는 생성 된 의사 난수의 시드를 나타냅니다. 다음은 옵션입니다-
|
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 − Bool, 선택 사항 (기본값 = False) warm_start = true이면 이전 호출 솔루션을 다시 사용할 수 있고 앙상블에 더 많은 추정기를 추가 할 수 있습니다. 그러나이 false로 설정되면 완전히 새로운 포리스트에 맞아야합니다. |
속성
다음 표는 sklearn. ensemble.IsolationForest 방법-
Sr. 아니요 | 속성 및 설명 |
---|---|
1 | estimators_ − DecisionTreeClassifier 목록 피팅 된 모든 하위 추정량의 수집을 제공합니다. |
2 | max_samples_ − 정수 사용 된 실제 샘플 수를 제공합니다. |
삼 | offset_ − 플로트 원시 점수에서 결정 기능을 정의하는 데 사용됩니다. decision_function = score_samples -offset_ |
Implementation Example
아래 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)
Output
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 (Local Outlier Factor) 알고리즘은 고차원 데이터에서 이상 값 감지를 수행하는 또 다른 효율적인 알고리즘입니다. scikit-learn은neighbors.LocalOutlierFactor관측치의 비정상 성 정도를 반영하는 로컬 특이 치 요인이라고하는 점수를 계산하는 방법입니다. 이 알고리즘의 주요 논리는 이웃보다 밀도가 상당히 낮은 샘플을 감지하는 것입니다. 그렇기 때문에 이웃에 대한 주어진 데이터 포인트의 로컬 밀도 편차를 측정합니다.
매개 변수
다음 표는에서 사용하는 매개 변수로 구성됩니다. sklearn. neighbors.LocalOutlierFactor 방법
Sr. 아니요 | 매개 변수 및 설명 |
---|---|
1 | n_neighbors − int, 선택, 기본값 = 20 kneighbors 쿼리에 기본적으로 사용하는 이웃 수를 나타냅니다. 모든 샘플은. |
2 | algorithm − 선택 사항 최근 접 이웃을 계산하는 데 사용할 알고리즘입니다.
|
삼 | leaf_size − int, 선택, 기본값 = 30 이 매개 변수의 값은 구성 및 쿼리 속도에 영향을 줄 수 있습니다. 또한 트리를 저장하는 데 필요한 메모리에도 영향을줍니다. 이 매개 변수는 BallTree 또는 KdTree 알고리즘에 전달됩니다. |
4 | contamination − auto 또는 float, 선택 사항, 기본값 = auto 데이터 세트에서 특이 치의 비율을 제공합니다. 기본값 인 자동으로 설정하면 원본 용지에서와 같이 임계 값이 결정됩니다. float로 설정하면 오염 범위는 [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 방법-
Sr. 아니요 | 속성 및 설명 |
---|---|
1 | negative_outlier_factor_ − numpy 배열, 모양 (n_samples,) 훈련 샘플의 반대 LOF를 제공합니다. |
2 | n_neighbors_ − 정수 이웃 쿼리에 사용되는 실제 이웃 수를 제공합니다. |
삼 | offset_ − 플로트 원시 점수에서 이진 레이블을 정의하는 데 사용됩니다. |
Implementation Example
아래 주어진 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)
Output
NearestNeighbors(
algorithm = 'ball_tree', leaf_size = 30, metric='minkowski',
metric_params = None, n_jobs = None, n_neighbors = 1, p = 1, radius = 1.0
)
Example
이제 다음 파이썬 스크립트를 사용하여이 구성된 분류 자에서 [0.5, 1., 1.5]에 대한 옷장 지점을 물어볼 수 있습니다.
print(neigh.kneighbors([[.5, 1., 1.5]])
Output
(array([[1.7]]), array([[1]], dtype = int64))
단일 클래스 SVM
Schölkopf 등이 소개 한 One-Class SVM은 감독되지 않은 이상 값 탐지입니다. 또한 고차원 데이터에서 매우 효율적이며 고차원 분포의 지원을 추정합니다. 그것은에서 구현됩니다Support Vector Machines 모듈 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])