이상치 탐지(Anomaly Detection)는 데이터에서 비정상적인 패턴을 식별하는 과정이다. 이러한 비정상적인 패턴은 종종 중요한 비즈니스 인사이트를 제공하거나 시스템의 잠재적 문제를 예고할 수 있다. 예를 들어, 금융 분야에서는 사기 거래를 탐지하고, 제조업에서는 결함 제품을 식별하고, IT 보안에서는 보안 침해를 감지하는 데 사용된다.

 

이상치(Anomaly)와 노이즈(Noise)의 차이

  • 이상치(Anomaly): 데이터 세트에서 다른 관측치와 현저하게 다른 데이터 포인트이다. 이상치는 시스템의 변화나 예외적인 사건을 나타낼 수 있으며, 때로는 중요한 정보를 포함할 수 있다.
  • 노이즈(Noise): 데이터 수집, 처리 또는 전송 과정에서 발생하는 임의의 변동이나 오류를 의미한다. 노이즈는 일반적으로 데이터의 질을 저하시키며, 유용한 정보를 포함하기보다는 분석을 방해하는 역할을 한다.

 

데이터 불균형과 Minority Class 관측치

  • 데이터 불균형은 데이터 세트 내에서 한 클래스의 관측치가 다른 클래스에 비해 현저히 적은 경우를 말한다. 이상치 탐지에서는 이상치가 minority class를 형성하며, 대부분의 데이터 포인트는 정상 범주에 속한다. 불균형 데이터는 분류 알고리즘의 성능에 부정적인 영향을 미칠 수 있으며, 특히 minority class의 정확한 식별이 중요한 경우 문제가 된다.

 

분류와 이상치 탐지의 비교

  • 분류(Classification): 데이터 포인트를 사전에 정의된 클래스 또는 범주로 할당하는 과정이다. 분류는 각 클래스에 속하는 충분한 양의 훈련 데이터가 필요다.
  • 이상치 탐지(Anomaly Detection): 대부분의 데이터가 '정상'으로 구성되어 있고, '이상치'는 소수만 존재하는 경우에 적합한 방법이다. 이상치 탐지는 사전에 정의된 클래스가 필요하지 않으며, 이상치가 정상 데이터와 현저히 다르다는 가정 하에 작동한다.

이상치 탐색(Outlier detection)와 신규성 탐색(Novelty detection)의 차이

  • 이상치 탐색(Outlier detection): 데이터 세트에서 다른 관측치의 주요 특성과 현저하게 다른 극단적 데이터 포인트를 탐지한다.
  • 신규성 탐색(Novelty detection): 새로 주어진 데이터 세트에서, 기존 데이터의 특성과 다른 상이한 데이터를 탐지한다.

 

이상치 탐지(Anomaly Detection)의 성능 평가

  • 각 지표는 모델이 얼마나 잘 이상치를 식별하고, 정상적인 데이터 포인트를 올바르게 분류하는지를 다양한 관점에서 평가한다. 여기에는 거짓 양성 비율(FPR), 거짓 수락율(FAR), 평균 등가 오류율(EER), 검출 오류 무역오프(DET) 그래프 등이 포함된다.

 

지표 설명

  • 거짓 양성 비율(False Positive Rate, FPR): 정상 데이터 포인트가 잘못해서 이상치로 분류된 비율이다. FPR은 FP/(FP+TN)으로 계산되며, 여기서 FP는 거짓 양성의 수, TN은 참 음성의 수이다.
  • 거짓 수락율(False Acceptance Rate, FAR): 시스템이 잘못된 입력(예: 비인가 사용자)을 올바른 것으로 수락하는 비율이다. 이상치 탐지에서는 잘못해서 이상치를 정상으로 분류하는 경우에 해당한다. FAR은 보안 시스템에서 특히 중요한 지표로 여겨진다.
  • 평균 등가 오류율(Equal Error Rate, EER): 거짓 수락률과 거짓 거부율(False Rejection Rate, FRR)이 같아지는 지점의 비율이다. EER은 시스템의 전반적인 성능을 나타내는 데 사용되며, 낮을수록 성능이 좋다고 평가된다.
  • 검출 오류 무역오프(DET) 그래프: 거짓 거부률(FRR)과 거짓 수락(FAR)을 동시에 나타내는 그래프로, 시스템의 성능을 시각적으로 비교하는 데 사용된다. DET 그래프는 다양한 임계값 설정에서 시스템의 성능 변화를 보여준다.

 

이상치 탐지용 모델

 

scikit-learn (sklearn) 라이브러리는 여러 가지 이상치 탐지 모델을 제공하고 있다. 이 모델들은 데이터에서 이상치나 아웃라이어를 탐지하는 데 사용될 수 있으며, 주로 비지도 학습 방식에 속한다. 다음은 sklearn에서 제공하는 주요 이상치 탐지 모델들에 대한 개요이다:

 

1.Isolation Forest (IsolationForest):

이상치 탐지를 위해 설계된 앙상블 기반 알고리즘이다.

데이터 포인트를 분리하는 데 필요한 분할의 수를 사용하여 이상치를 식별한다.

데이터 포인트를 분리하는 데 적은 분할이 필요한 경우, 해당 데이터 포인트를 이상치로 간주한다.

 

2.Local Outlier Factor (LOF) (LocalOutlierFactor):

지역 밀도 편차를 이용하여 이상치를 탐지하는 알고리즘이다.

각 샘플의 지역 밀도를 그 주변 이웃의 지역 밀도와 비교하여 이상치를 식별한다.

주변 이웃에 비해 상대적으로 낮은 밀도를 가진 샘플을 이상치로 간주한다.

 

3.One-Class SVM (OneClassSVM):

주어진 데이터를 두 클래스 중 하나로 분류하는 SVM (Support Vector Machine)의 일종으로, 데이터셋에 있는 정상 데이터만을 학습하여 이상치를 탐지한다.

데이터의 분포를 학습하여, 학습된 분포에서 벗어난 데이터 포인트를 이상치로 간주한다.

 

4.Elliptic Envelope (EllipticEnvelope):

데이터의 중심을 둘러싼 타원을 그리고, 이 타원에서 벗어난 포인트를 이상치로 간주하는 방법이다.

주로 다변량 데이터에 대해 정규 분포 가정을 기반으로 이상치를 탐지한다.

 

5.DBSCAN (DBSCAN):

밀도 기반 클러스터링 알고리즘으로, 고밀도 영역을 찾아내어 클러스터를 형성한다.

밀도에 기반하여 이상치를 탐지하며, 밀집된 영역 밖에 위치한 점들을 이상치로 분류한다.

 

모델명 장점 단점
Isolation Forest - 대규모 데이터셋에서 효율적
- 파라미터 설정이 상대적으로 간단
- 데이터 구조에 따라 성능이 달라질 수 있음
Local Outlier Factor (LOF) - 지역 밀도 정보를 활용해 세밀한 탐지 가능
- 이웃을 기반으로 한 직관적인 결과 제공
- 고차원 데이터에서 성능 저하
- 데이터가 밀집되어 있을 경우 이상치 탐지가 어려울 수 있음
One-Class SVM - 비선형 데이터에 잘 작동
- 다양한 커널 선택 가능
- 파라미터 선택에 민감
- 대규모 데이터셋에서는 계산 비용이 높음
Elliptic Envelope - 정규 분포를 따르는 데이터에 효과적
- 이상치 탐지에 명확한 기준 제공
- 정규 분포 가정 필요
- 고차원 데이터에서 성능이 저하될 수 있음
DBSCAN - 밀도 기반으로 자연스러운 클러스터 구조를 탐지
- 클러스터의 형태와 크기에 유연
- 적절한 파라미터 (eps 및 min_samples) 설정이 어려움
- 밀도가 일정하지 않은 데이터에서 성능 저하


1. Isolation Forest 

  • Isolation Forest는 의사결정 나무와 앙상블 기법을 결합하여 만들어진 이상치 탐지를 위한 알고리즘으로, 특히 고차원 데이터셋에서 뛰어난 성능을 보인다. 이 방법은 데이터 포인트를 격리하는 데 필요한 분할의 수를 기반으로 이상치를 식별한다. 기본 가정은 정상 데이터 포인트는 격리하기 위해 많은 분할이 필요하지만, 이상치는 적은 수의 분할로 쉽게 격리될 수 있다는 것이다.
  • Isolation Forest는 여러 개의 Isolation Tree(iTree)로 구성된다. 각 iTree는 데이터 포인트를 무작위로 선택하고, 선택된 포인트를 기반으로 데이터를 분할한다. 이 과정은 재귀적으로 반복되며, 데이터 포인트가 격리될 때까지 계속된다. 데이터 포인트를 격리하는 데 필요한 분할의 수가 적을수록 해당 데이터 포인트는 이상치일 가능성이 높다.

 

iTree (Isolation Tree)

  • iTree는 Isolation Forest 알고리즘에서 사용되는 기본 구성 요소이다. iTree는 이진 결정 트리로, 각 노드에서 데이터를 두 개의 서브셋으로 분할한다. 분할은 무작위로 선택된 특성과 분할 값에 의해 이루어집니다. iTree의 깊이가 깊어질수록, 즉 더 많은 분할이 이루어질수록, 해당 포인트가 정상적인 데이터 포인트일 가능성이 높아집니다.

이상치 점수(Abnomaly Score)

    • Isolation Forest는 각 데이터 포인트를 격리하는 데 필요한 평균 경로 길이를 사용하여 이상치 점수를 계산한다. 이 점수는 정규화되어 0과 1 사이의 값을 가지며, 점수가 높을수록 해당 데이터 포인트는 이상치일 가능성이 높다. 정규화 과정은 iTree의 평균 경로 길이를 이용하여 이루어지며, 이를 통해 다른 데이터셋과 비교할 수 있는 표준화된 이상치 점수를 제공한다.
    • decision_function으로 이상치 점수를 구할 수 있다.

이상치 점수, 클수록 이상치 가능성이 높다.

x: 이상치를 구하려는 데이터 포인트, n : 전체 데이터 크기

경로 길이 h(x) : 데이터 포인트 x의 iTree 경로 길이, 길이가 짧을 수록 이상치일 가능성이 높다.

𝐸[(𝑥)]]: 모든 iTree에서 데이터 포인트에 대한 평균 경로 길이

표준화된 경로 길이 𝑐(𝑛): (𝑥)ℎ(𝑥)를 정규화하기 위한 값으로, iTree의 평균 길이

 

(1)sklearn.ensemble IsolationForest

sklearn.ensemble.IsolationForest는 Scikit-learn 라이브러리의 일부로, 이상치 탐지를 위한 알고리즘이다. 이 알고리즘은 데이터 포인트를 격리하는 데 필요한 경로 길이를 기반으로 이상치를 식별한다. 짧은 경로 길이로 격리되는 데이터 포인트는 이상치로 간주된다. 

Isolation Forest는 특히 고차원 데이터셋에서 효과적인 이상치 탐지 성능을 보인다.

class sklearn.ensemble.IsolationForest(*, n_estimators=100, max_samples='auto', contamination='auto', max_features=1.0, bootstrap=False, n_jobs=None, random_state=None, verbose=0, warm_start=False)

 

주요 하이퍼 파라미터

n_estimators iTree(격리 트리)의 수이다. 기본값은 100이다. 더 많은 수의 트리는 더 나은 성능을 제공할 수 있지만, 계산 비용이 증가한다.
max_samples 각 iTree를 구성하는 데 사용할 데이터 샘플의 수 또는 비율이다. 기본값은 'auto'로, 이 경우 사용할 샘플의 수는 min(256, n_samples)이다. 여기서 n_samples는 학습 데이터의 샘플 수이다.
contamination 데이터셋 내 예상되는 이상치의 비율이다. 이는 이상치 점수의 임계값 결정에 사용된다. 기본값은 'auto'로, 임계값 결정 시 자동으로 설정된다.
max_features 각 iTree를 구성하는 데 사용할 특성(변수)의 수 또는 비율이다. 기본값은 1.0으로, 모든 특성을 사용한다.
bootstrap 트리 구성 시 부트스트랩 샘플링(즉, 중복을 허용하는 샘플링)을 사용할지 여부를 결정한다. 기본값은 False이다.
random_state 난수 생성기의 시드이다. 결과의 재현성을 위해 사용된다.

 

주요 속성

estimators_ 학습된 iTree 객체의 리스트이다.
decision_function 각 샘플의 이상치 점수를 계산하는 함수이다. 점수가 낮을수록 이상치일 가능성이 높다.
score_samples: 각 샘플의 이상치 점수를 반환한다. 이 값은 decision_function에 의해 반환되는 값과 동일하지만, 의미하는 바가 다를 수 있으므로 사용 방법을 잘 확인해야 한다.
n_features_in_  (Scikit-learn 0.24 이상에서 사용 가능): 학습 데이터에 있는 특성의 수이다.

feature_importances_ (버전에 따라 다를 수 있음) 각 특성의 중요도를 나타내는 값이다. 이상치 탐지 문맥에서 특성 중요도를 해석할 때는 주의가 필요하다.

특징

- 데이터 분포에 대한 가정이 필요없다.

- 고차원 데이터에서도 성능 저하가 거리 기반 모델보다 덜하다.

- 데이터 수와 iTree의 개수에 따라 결과가 불안정하다.

 

Isolation Forest의 하이퍼 파라미터는 알고리즘의 성능과 실행 시간에 큰 영향을 미칠 수 있다. 따라서, 특정 문제에 대한 최적의 성능을 달성하기 위해 이러한 파라미터를 조정하는 것이 중요하다. Scikit-learn의 Isolation Forest 구현은 사용하기 쉽고, 다양한 유형의 데이터셋에 적용할 수 있는 강력한 이상치 탐지 도구이다.

# 필요한 라이브러리를 불러옵니다.
import numpy as np
import pandas as pd
from sklearn.ensemble import IsolationForest
from sklearn.datasets import make_classification

# 예제 데이터셋 생성
X, _ = make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, random_state=42)
df = pd.DataFrame(X, columns=['Feature1', 'Feature2'])

# Isolation Forest 모델을 생성하고 학습한다.
clf = IsolationForest(n_estimators=100, contamination=0.1, random_state=42)
clf.fit(df)

# 데이터셋에 대한 이상치 점수를 계산한다.
scores_pred = clf.decision_function(df)

# 이상치 여부를 판단한다. (1: 정상, -1: 이상치)
is_anomaly = clf.predict(df)

# 'score' 및 'anomaly' 컬럼을 데이터프레임에 추가한다.
df['score'] = scores_pred
df['anomaly'] = is_anomaly

# 결과를 출력한다.
df.head()

2. Local Outlier Factor (LOF) 

Local Outlier Factor (LOF)는 밀도기반의 이상치 탐지를 위한 알고리즘으로, 모든 데이터를 고려하지 않고, 해당 데이터 포인트가 그 주변 이웃에 비해 얼마나 밀도가 낮은지를 계산한다. 기본적으로, LOF는 주어진 데이터 포인트의 로컬 밀도와 그 이웃들의 로컬 밀도를 비교한다. 로컬 밀도가 주변보다 현저히 낮은 데이터 포인트는 이상치로 간주된다.

 

LOF의 핵심 개념은 "로컬"이다. 즉, 전체 데이터셋의 밀도가 아닌, 각 데이터 포인트의 주변 이웃의 밀도를 기준으로 판단한다. 이 접근법은 데이터셋이 균일한 밀도를 가지지 않을 때 특히 유용하다.

 


1. k-distance(p) : k-거리는 포인트 p에서 k번째 가장 가까운 이웃과의 거리입니다. 이 거리는 k번째 가까운 이웃까지의 거리로 정의됩니다.
  3-distance(p) : 데이터 포인트 p에서 3번째로 가까운 포인터와의 거리

2. Nk (k-이웃 집합) : Nk는 포인트 p의 k-이웃 집합으로, p에서 k-거리 이내에 있는 모든 포인트의 개수를 의미한다. 거리가 같은 포인트가 있으면 NK(p)는 커일 수 있다.

3. 도달 가능 거리 (Reachability Distance, RD)
도달 가능 거리는 포인트 p에서 다른 포인트 q까지의 거리로, 이 거리는 q의 k-거리와 p와 q 사이의 실제 거리 중 큰 값을 사용합니다. 이는 각 이웃 포인트가 밀집된 지역에 있는지를 평가하는 데 사용됩니다.
     RD(A,B) = max{ k-distance(B), dist(A,B) }

4. Local Reachability Density, LRD
LRD는 포인트 p 주위의 밀도를 나타냅니다. 이는 포인트 p의 k-이웃 집합에 있는 모든 포인트들에 대해 도달 가능 거리의 역수를 평균한 값입니다.

5. Local Outlier Factor, LOF
LOF는 포인트 p가 이상치인 정도를 나타내는 지표입니다. 이는 포인트 p의 국부 도달 가능 밀도를 그 이웃 포인트들의 국부 도달 가능 밀도와 비교한 값입니다. LOF 값이 1에 가까우면 정상, 1보다 크면 이상치일 가능성이 높습니다.

1보다 클 수록 이상치를 의미

 

하이퍼파라미터:

하이퍼파라미터 설명
n_neighbors 이웃의 수. LOF 점수 계산 시 고려되는 이웃의 개수를 결정함.
algorithm 이웃을 검색하기 위한 알고리즘. {'auto', 'ball_tree', 'kd_tree', 'brute'} 중 선택. 'auto'는 데이터에 따라 가장 적합한 알고리즘을 자동으로 선택함.
leaf_size ball_tree 또는 kd_tree를 사용할 때의 leaf size. 트리 구축에 영향을 미침.
metric 거리 계산에 사용되는 메트릭. 기본값은 'minkowski'.
p Minkowski 메트릭의 파라미터. 기본값 2는 유클리디안 거리를 의미함.
contamination 데이터셋에서 이상치의 비율을 가정하는 파라미터. 'auto'는 자동으로 결정됨.
novelty True로 설정하면, novelty detection 모드로 사용. 이 경우에는 fit 메서드에 전달된 데이터를 정상 데이터로 간주하고, predict, decision_function 및 score_samples 메서드를 사용할 수 있음.

 

속성

속성 설명
negative_outlier_factor_ 학습 데이터의 각 샘플에 대한 LOF 점수. 값이 더 낮을수록 이상치일 가능성이 높음.
n_neighbors_ 실제 사용된 이웃의 수.
offset_ 결정 함수에서 사용되는 오프셋. contamination 파라미터가 'auto'로 설정되어 있을 경우, 이 속성은 자동으로 계산됨.

 

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.neighbors import LocalOutlierFactor

# Iris 데이터 로드
iris = load_iris()
X = iris.data
y = iris.target

# LOF 모델 생성 및 학습
clf = LocalOutlierFactor(n_neighbors=20, contamination='auto', novelty=False)
y_pred = clf.fit_predict(X)

# 이상치 플래그와 점수 계산
X_scores = clf.negative_outlier_factor_

# 결과 시각화
plt.title("Local Outlier Factor (LOF)")
plt.scatter(X[:, 0], X[:, 1], color='k', s=3, label='Data points')

radius = (X_scores.max() - X_scores) / (X_scores.max() - X_scores.min())
radius[y_pred == 1] = 0
plt.scatter(X[:, 0], X[:, 1], s=1000 * radius, edgecolors='r',
            facecolors='none', label='Outlier scores')

plt.axis('tight')
plt.legend()
plt.show()

이 코드는 Iris 데이터셋을 로드하고, LocalOutlierFactor 모델을 생성하여 데이터에 적용한다. 각 데이터 포인트는 LOF 점수에 따라 시각화되며, 이상치는 더 큰 원으로 표시된다. n_neighbors 매개변수는 이웃의 수를 정의하며, 이는 LOF 계산에 중요한 역할을 한다.

 

3.One-Class SVM 

One-Class SVM은 데이터의 정상적인 행동을 나타내는 훈련 데이터만 사용하여 이상 탐지를 수행하는 비지도 학습 알고리즘이다. 일반적인 SVM 알고리즘과 달리 두 개의 클래스를 구분하는 대신 데이터 포인트가 정상 범위 내에 있는지 여부를 판단한다.

원리: One-Class SVM은 데이터 포인트를 최대한 원점에서 멀리 떨어뜨리는 초평면(hyperplane)을 찾습니다. 이 초평면은 데이터의 정상적인 분포를 나타내는 경계 역할을 한다. 새로운 데이터 포인트가 이 경계를 넘어서면 이상값으로 간주된다.

장점:

  • 이상 탐지에 효과적이다.
  • 데이터 레이블링이 필요하지 않다.
  • 비교적 간단한 모델이다.

단점:

  • 이상 데이터가 존재하는 경우 모델 성능이 저하될 수 있다.
  • 데이터의 정상 분포에 대한 가정이 필요한다.
  • hyperparameter 조정에 민감한다.

활용 분야:

  • 사기 탐지
  • 네트워크 침입 탐지
  • 시스템 상태 모니터링
  • 제조 결함 감지

 

하이퍼파라미터

하이퍼파라미터 설명
kernel 사용할 커널의 종류이다. 'linear', 'poly', 'rbf', 'sigmoid', 'precomputed' 등이 있다. 기본값은 'rbf'이다.
degree 'poly' 커널의 경우 다항식의 차수를 의미한다. 기본값은 3이다.
gamma 'rbf', 'poly', 'sigmoid' 커널의 경우 커널 계수를 의미한다. 'scale', 'auto' 또는 특정값을 설정할 수 있다. 기본값은 'scale'이다.
coef0 'poly'와 'sigmoid' 커널의 독립항을 의미한다. 기본값은 0.0이다.
tol 정지 기준의 허용오차를 설정한다. 기본값은 1e-3이다.
nu 모델에 의해 허용되는 오류의 비율(이상치의 비율)이다. 0에서 1 사이의 값으로 설정된다.기본값은 0.5이다.
shrinking 축소 휴리스틱을 사용할지 여부를 결정한다. True 또는 False로 설정할 수 있다. 기본값은 True이다.
cache_size 커널 캐시 메모리 크기를 설정한다(MB 단위). 기본값은 200이다.
verbose 자세한 출력을 활성화할지 여부를 결정한다. True 또는 False로 설정할 수 있다. 기본값은 False이다.
max_iter 반복 최대 횟수를 설정한다. -1은 무제한을 의미한다. 기본값은 -1이다.

 

속성

속성 설명
support_ 서포트 벡터의 인덱스이다.
support_vectors_ 서포트 벡터이다.
dual_coef_ 서포트 벡터의 계수이다. One-Class SVM에서는 이상치와 정상 샘플을 구분하는 결정 함수에 기여하는 서포트 벡터의 계수를 의미한다.
coef_ 선형 커널을 사용하는 경우, 특성 공간에서의 모델 가중치이다. 'linear' 커널을 사용할 때만 사용 가능한다.
intercept_ 결정 함수의 상수항이다.
fit_status_ 모델이 제대로 학습되었는지를 나타내는 플래그이다. 0이면 제대로 학습된 것이고, 그렇지 않으면 1이다.
offset_ 결정 함수에서 사용되는 오프셋이다.
from sklearn.svm import OneClassSVM
from sklearn.preprocessing import StandardScaler

# 데이터 전처리: 'Class' 열 제거 및 특성 스케일링
X = data.drop('Class', axis=1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# One-Class SVM 모델 생성 및 학습
model = OneClassSVM(nu=0.01, kernel='rbf', gamma='auto').fit(X_scaled)

# 이상치 탐색
y_pred = model.predict(X_scaled)

# 이상치 탐지 결과 요약
n_total = len(y_pred)
n_outliers = (y_pred == -1).sum()
n_normals = n_total - n_outliers

print(f"총 데이터 포인트 수: {n_total}")
print(f"정상 데이터 포인트 수: {n_normals}")
print(f"이상치 데이터 포인트 수: {n_outliers}")
총 데이터 포인트 수: 5900
정상 데이터 포인트 수: 5771
이상치 데이터 포인트 수: 129




4. EllipticEnvelope

EllipticEnvelope는 Gaussian 분포를 따르는 데이터에서 이상치를 탐지하는 비지도 학습 알고리즘이다. 데이터의 대부분이 타원형 분포를 이루고, 그 경계를 벗어나는 데이터를 이상치로 간주한다.

장점:

  • 이상치 탐지에 효과적이다.
  • 데이터 레이블링이 필요하지 않다.
  • 계산 과정이 비교적 간단하다.

단점:

  • 데이터가 Gaussian 분포를 따르지 않는 경우 성능이 저하될 수 있다.
  • 이상 데이터가 존재하는 경우 모델 성능이 저하될 수 있다.
  • hyperparameter 조정에 민감하다.

 

하이퍼파라미터

하이퍼파라미터 설명 기본값
contamination 데이터셋에 포함된 이상치의 비율이다. 기본값은 0.1이다. 이는 이상치 탐지 경계를 설정하는 데 사용된다. 0.1
support_fraction 지원하는 데이터 포인트의 비율이다. None이면 모든 포인트가 사용된다. 특정 비율을 설정하면 가장 중심에 있는 데이터 포인트만 사용된다. 0.95
store_precision 정밀도 행렬을 저장할지 여부를 결정한다. 기본값은 True이다. 이는 후속 계산에서 필요할 수 있으나, 메모리를 절약하고 싶을 때는 False로 설정할 수 있다. TRUE
method 계산 방식 auto'
assume_centered 데이터 평균이 0인지 가정 FALSE
tol 수렴 기준 0.001
max_iter 최대 반복 횟수 100

 

속성

속성 설명
coef_ 타원형 분포의 주요 축 방향 벡터
location_ 타원형 분포의 중심, 데이터의 추정된 위치이다. assume_centered=False일 때 계산된다.
covariance_ 데이터의 추정된 공분산 행렬이다. store_precision=True일 때 사용 가능한다.
support_ 정상 데이터 포인트의 인덱스, True로 설정된 데이터 포인트의 마스크이다. 이는 support_fraction에 의해 결정된 데이터 포인트를 나타낸다.
offset_ 이상치 경계 오프셋
# 코드 실행 상태가 리셋되어 필요한 라이브러리와 데이터를 다시 로드한다.
import pandas as pd
from sklearn.covariance import EllipticEnvelope
from sklearn.preprocessing import StandardScaler

# 데이터셋 로드
file_path = '/mnt/data/rauds.csv'
data = pd.read_csv(file_path)
# 데이터 전처리: 'Class' 열 제거 및 특성 스케일링
X = data.drop('Class', axis=1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# EllipticEnvelope 모델 생성 및 학습
envelope = EllipticEnvelope(contamination=0.01)  # 이상치 비율 가정
envelope.fit(X_scaled)

# 이상치 탐지
y_pred_env = envelope.predict(X_scaled)

# 이상치 탐지 결과 요약
n_outliers_env = (y_pred_env == -1).sum()
n_normals_env = (y_pred_env == 1).sum()
print(f"정상 데이터 포인트 수: {n_normals_env}")
print(f"이상치 데이터 포인트 수: {n_outliers_env}")
정상 데이터 포인트 수: 5,841
이상치 데이터 포인트 수: 59

이상치 처리

  1. 절단(Trim or Truncaion) : 이상치 제거
  2. 조정(Winsorizing) : 이상치의 상한과 하한값으로 보정하는 방법
  3. 클리핑(Clipping) : 이상치의 상한값과 하한값을 특정값으로 지정해서 해당 범위를 벗어나는 값을 상한값과 하한값으로 조정하는 방법
plt.rcParams['font.family'] = 'Malgun gothic'
# 1. 절단(Trim)
out1 = df[['Malicacid']].drop(outidx)

# 2. 조정(Winsorizing)
out2 = df[['Malicacid']].clip(low, high)

# 3. 클리핑(clipping)
out3 = df[['Malicacid']].clip(1, 5)

fig, axs = plt.subplots(1,4, figsize=(12,4))
axs[0].set_title('절단')
out1.boxplot(ax=axs[0])
axs[1].set_title('조정')
out2.boxplot(ax=axs[1])
axs[2].set_title('클리핑')
out3.boxplot(ax=axs[2])
axs[3].set_title('원본')
df[['Malicacid']].boxplot(ax=axs[3])
plt.show()

 

'전처리' 카테고리의 다른 글

groupby apply transform 동작원리  (0) 2024.10.20
변수선택법 - SelectKBest  (0) 2024.05.15
ColumnTransformer  (0) 2024.04.20
Sklearn Featureselection방법들  (0) 2023.12.28
itertools [변수선택, 유용한 함수]  (0) 2023.10.18

+ Recent posts