이상 감지의 다양한 기술 학습

이상 감지의 다양한 기술 학습

소스 노드 : 1867449

표준 스케일러를 사용하여 데이터를 정상으로 만들고 산포 그래프를 그렸습니다.

이제 클러스터에 포인트를 제공하기 위해 DBSCAN을 가져올 것입니다. 실패하면 -1로 표시됩니다.

이제 결과가 나왔지만 어떤 값이 최소값인지 최대값인지 그리고 -1 값인지 여부를 어떻게 확인합니까? arg min 값을 사용하여 클러스터에서 가장 작은 값을 확인합니다.

결과에서 -1인 XNUMX개의 값을 볼 수 있습니다.

이제 산포 그래프를 그려봅시다.

우리가 적용한 위의 방법은 단변량 이상치에 대한 것입니다.

다변량 이상치를 감지하려면 다변량 이상치를 이해해야 합니다.

예를 들어 자동차 측정값을 가져옵니다. 우리는 차량이 움직이는 속도를 기록하거나 측정하는 주행 거리계용 판독 미터와 분당 자동차 휠의 회전 수를 기록하는 rpm 판독 값인 XNUMX개의 판독 미터를 보았습니다.

주행 거리계가 0-60mph 범위에서 표시되고 rpm이 0-750에서 표시된다고 가정합니다. 우리는 오는 모든 값이 서로 상관관계가 있다고 가정합니다. 주행 거리계에 속도가 50으로 표시되고 rpm에 섭취량이 0으로 표시되면 판독값이 잘못된 것입니다. 주행 거리계에 0보다 큰 값이 표시되면 자동차가 움직이고 있다는 의미이므로 rpm 값이 더 높아야 하지만 이 경우에는 XNUMX 값을 표시합니다. 즉, 다변량 이상치.

C. 마할라노비스 거리법

DBSCAN에서는 유클리드 거리 측정법을 사용했지만 이 경우에는 Mahalanobis 거리 방법에 대해 이야기하고 있습니다. DBSCAN과 함께 Mahalanobis 거리를 사용할 수도 있습니다.

DBSCAN(eps=0.5, min_samples=3, metric='mahalanobis', metric_params={'V':np.cov(X)}, algorithm='brute', leaf_size=30, n_jobs=-1)

유클리드가 서로 상관 관계가 있는 엔터티에 적합하지 않은 이유는 무엇입니까? 유클리드 거리는 두 점이 얼마나 가까운지에 대한 잘못된 데이터를 찾지 못하거나 제공합니다.

Mahalanobis 방법은 깨끗한 데이터인 점과 분포 사이의 거리를 사용합니다. 유클리드 거리는 종종 두 지점 사이에 있으며 z 점수는 x 빼기 평균으로 계산하고 표준 편차로 나눕니다. Mahalanobis에서 z 점수는 x에서 평균을 공분산 행렬로 나눈 값을 뺀 값입니다.

따라서 공분산 행렬로 나누면 어떤 효과가 있습니까? 데이터 세트의 변수가 높은 상관 관계를 갖는 경우 공분산 값이 높아집니다.

마찬가지로 공분산 값이 낮으면 데이터가 상관되지 않으면 거리가 크게 줄어들지 않습니다. 그것은 변수 문제의 규모와 상관 관계를 모두 다룰 정도로 잘 수행됩니다.

암호

데이터 세트는 다음에서 가져올 수 있습니다. 메인의 Anomaly-/caret.csv · aster28/Anomaly- (github.com)

df = pd.read_csv('caret.csv').iloc[:, [0,4,6]] df.head()

거리 함수를 x= 없음, 데이터= 없음, 공분산 = 없음으로 정의했습니다. 함수 내에서 데이터의 평균을 취하고 거기에 있는 값의 공분산 값을 사용했습니다. 그렇지 않으면 공분산 행렬을 계산합니다. T는 조옮김을 나타냅니다.

예를 들어 배열 크기가 XNUMX 또는 XNUMX이고 두 개의 변수에 포함하려는 경우 행렬을 전치해야 합니다.

np.random.multivariate_normal(mean, cov, size = 5)
array([[ 0.0509196, 0.536808 ], [ 0.1081547, 0.9308906], [ 0.4545248, 1.4000731], [ 0.9803848, 0.9660610], [ 0.8079491 , 0.9687909]])
np.random.multivariate_normal(mean, cov, size = 5).T
array([[ 0.0586423, 0.8538419, 0.2910855, 5.3047358, 0.5449706], [ 0.6819089, 0.8020285, 0.7109037, 0.9969768, -0.7155739]])

우리는 선형 대수학인 sp.linalg를 사용했으며 선형 대수학에서 수행할 다른 기능을 가지고 있습니다. 행렬 반전을 위한 inv 함수가 있습니다. NumPy는 행렬의 곱셈을 위한 수단입니다.

import scipy as sp def distance(x=None, data=None, cov=None): x_m = x - np.mean(data) if not cov: cov = np.cov(data.values.T) inv_cov = sp. linalg.inv(cov) 왼쪽 = np.dot(x_m, inv_cov) m_distance = np.dot(left, x_m.T) return m_distance.diagonal() df_g= df[['캐럿', '깊이', '가격' ]].head(50) df_g['m_distance'] = 거리(x=df_g, data=df[['캐럿', '깊이', '가격']]) df_g.head()

B. 이상치 검출을 위한 Tukey의 방법

Tukey 방법은 종종 Box and Whisker 또는 Box plot 방법이라고도 합니다.

Tukey 방법은 상한 및 하한 범위를 활용합니다.

상위 범위 = 75번째 백분위수 -k*IQR

낮은 범위 = 25번째 백분위수 + k* IQR

박스 플롯을 사용하여 연령 변수가 있는 타이타닉 데이터를 살펴보겠습니다.

sns.boxplot(타이타닉['age'].values)

이미지에서 Seaborn이 생성한 상자 얼룩은 55세에서 80세 사이의 많은 점이 사분위수 내에 있지 않은 이상값임을 보여줍니다. outliers_detect 함수를 만들어 하한 및 상한 범위를 감지합니다.

def outliers_detect(x, k = 1.5): x = np.array(x).copy().astype(float) 첫 번째 = np.quantile(x, .25) 세 번째 = np.quantile(x, .75) # IQR 계산 iqr = 세 번째 - 첫 번째 #상한 범위 및 하한 범위 lower = 첫 번째 - (k * iqr) upper = 세 번째 + (k * iqr) return lower, upper
outliers_detect(타이타닉['연령'], k = 1.5)
(2.5, 54.5)

D. PyCaret에 의한 검출

우리는 PyCaret에 의한 탐지를 위해 동일한 데이터 세트를 사용할 것입니다.

pycaret.anomaly 가져오기에서 * setup_anomaly_data = setup(df)

Pycaret는 비지도 학습 모델을 사용하여 이상값을 감지하는 오픈 소스 기계 학습입니다. pycaret 자체에서 데이터 세트를 사용하기 위한 get_data 메서드, 감지 전 전처리 작업을 위한 set_up, 일반적으로 데이터 프레임을 사용하지만 ignore_features 등과 같은 다른 많은 기능도 있습니다.

알고리즘을 사용하기 위한 다른 메서드 create_model. 먼저 Isolation Forest를 사용합니다.

ifor = create_model("iforest") plot_model(ifor) ifor_predictions = predict_model(ifor, data = df) print(ifor_predictions) ifor_anomaly = ifor_predictions[ifor_predictions["이상"] == 1] print(ifor_anomaly.head()) print( ifor_anomaly.shape)

Anomaly 1은 이상값을 나타내고 Anomaly 0은 이상값을 표시하지 않습니다.

여기서 노란색은 이상값을 나타냅니다.

이제 다른 알고리즘인 KNN(K Nearest Neighbors)을 살펴보겠습니다.

knn = create_model("knn") plot_model(knn) knn_pred = 예측_모델(knn, 데이터 = df) print(knn_pred) knn_anomaly = knn_pred[knn_pred["이상"] == 1] knn_anomaly.head() knn_anomaly.shape

이제 우리는 클러스터링 알고리즘을 사용할 것입니다.

clus = create_model("클러스터") plot_model(clus) clus_pred = 예측_모델(clus, 데이터 = df) 인쇄(clus_pred) clus_anomaly = clus_predictions[clus_pred["이상"] == 1] 인쇄(clus_anomaly.head()) clus_anomaly. 모양

E. PyOD에 의한 이상 탐지

PyOD는 다변량 데이터에서 이상값을 감지하기 위한 Python 라이브러리입니다. 지도 학습과 비지도 학습 모두에 좋습니다.

pyod.models.iforest에서 IForest 가져오기 pyod.models.knn에서 가져오기 KNN 

라이브러리와 알고리즘을 가져왔습니다.

from pyod.utils.data import generate_data from pyod.utils.data import evaluate_print from pyod.utils.example import Visualize train= 300 test=100 contaminate = 0.1 X_train, X_test, y_train, y_test = generate_data(n_train=기차, n_test=테스트 , n_features=2,오염=오염,random_state=42)
cname_alg = 'KNN' # 알고리즘의 이름은 K Nearest Neighbors c = KNN() c.fit(X_train) # 알고리즘에 적합 y_trainpred = c.labels_ y_trainscores = c.decision_scores_ y_testpred = c.predict(X_test) y_testscores = c.decision_function(X_test) print("훈련 데이터:") evaluate_print(cname_alg, y_train, y_train_scores) print("테스트 데이터:") evaluate_print(cname_alg, y_test, y_test_scores) Visualize(cname_alg, X_train, y_train, X_test, y_test, y_trainpred,y_testpred, show_figure=참, save_figure=참)

우리는 IForest 알고리즘을 사용할 것입니다.

fname_alg = 'IForest' # 알고리즘의 이름은 K Nearest Neighbors f = IForest() f.fit(X_train) # 알고리즘에 적합 y_train_pred = c.labels_ y_train_scores = c.decision_scores_ y_test_pred = c.predict(X_test) y_test_scores = c.decision_function(X_test) print("훈련 데이터:") evaluate_print(fname_alg, y_train_pred, y_train_scores) print("테스트 데이터:") evaluate_print(fname_alg, y_test_pred, y_test_scores) Visualize(fname_alg, X_train, y_train, X_test, y_test_pred, y_train_pred,y_test_pred, show_figure=참, save_figure=참)

F. 선지자에 의한 이상 탐지

항공 승객 데이터 세트를 시계열과 함께 사용합니다. 메인의 Prophet/example_air_passengers.csv · aster28/prophet(github.com)

예언자에서 예언자 가져오기 예언자에서 예측자 가져오기 예언자 가져오기 m = Prophet()
데이터 = pd.read_csv('air_pass.csv') 데이터.헤드()
data.columns = ['ds', 'y'] data['y'] = np.where(data['y'] != 0, np.log(data['y']), 0)

y 열의 로그는 음수 값을 활성화하지 않습니다. 우리는 데이터를 학습, 테스트로 분할하고 변수 예측에 예측을 저장했습니다.

기차, 테스트= train_test_split(데이터, random_state =42) m.fit(train[['ds','y']]) 예보 = m.predict(테스트) def detect(예측): forcast = 예보[['ds ', 'yhat', 'yhat_lower', 'yhat_upper']].copy() forcast['real']= data['y'] forcast['anomaly'] =0 forcast.loc[forcast['real'] > forcast['yhat_upper'], 'anomaly']=1 forcast.loc[forcast['real']< forcast['yhat_lower'], 'anomaly']=-1 forcast['imp']=0 in_range = forcast ['yhat_upper']-forcast['yhat_lower'] forcast.loc[forcast['anomaly']==1, 'imp'] = forcast['real']-forcast['yhat_upper']/in_range forcast.loc[ forcast['anomaly']==-1, 'imp']= forcast['yhat_lower']-forcast['real']/in_range return forcast
감지(예측)

우리는 이상을 -1로 간주했습니다.

결론

주어진 데이터 세트에서 이상값을 찾는 프로세스를 이상 감지라고 합니다. 이상값은 데이터 세트의 나머지 개체 값에서 눈에 띄고 정상적으로 작동하지 않는 데이터 개체입니다.

이상 감지 작업은 거리 기반 및 밀도 기반 클러스터링 방법을 사용하여 이상값을 클러스터로 식별할 수 있습니다.

여기에서 이상 탐지의 다양한 방법에 대해 논의하고 Titanic, 항공 승객 및 Caret의 세 가지 데이터 세트에 대한 코드를 사용하여 설명합니다.

키 포인트

1. Box-Whisker 방법 또는 DBSCAN을 사용하여 이상치 또는 이상 감지를 감지할 수 있습니다.

2. 상관관계가 없는 항목은 유클리드 거리법을 사용한다.

3. Mahalanobis 방법은 Multivariate outliers와 함께 사용됩니다.

4. 모든 값 또는 포인트가 이상값이 아닙니다. 일부는 쓰레기여야 할 소음입니다. 이상값은 조정이 필요한 유효한 데이터입니다.

5. 우리는 이상값이 0이고 노란색으로 표시되고 이상값이 XNUMX인 이상값이 없는 다른 알고리즘을 사용하여 이상값 감지에 PyCaret을 사용했습니다.

6. Python Outlier 탐지 라이브러리인 PyOD를 사용했습니다. 40개 이상의 알고리즘이 있습니다. 감독 및 감독되지 않은 기술이 사용됩니다.

7. 우리는 Prophet을 사용하고 이상값의 윤곽을 그리기 위해 함수 detect를 정의했습니다.

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

타임 스탬프 :

더보기 분석 Vidhya