머신러닝

머신러닝 기초 – 이상치 탐지(Outlier Detection) 기법

move84 2025. 2. 20. 23:31
반응형

머신러닝에서 이상치(Outlier)는 데이터 분포에서 벗어나 있는 비정상적인 데이터를 의미한다. 이상치는 데이터 분석 결과에 큰 영향을 미칠 수 있기 때문에 이를 탐지하고 적절히 처리하는 것이 중요하다. 이번 글에서는 머신러닝에서 사용하는 주요 이상치 탐지(Outlier Detection) 기법을 소개한다.


🧐 이상치(Outlier)란?

이상치는 일반적인 데이터 분포에서 크게 벗어난 값으로, 다양한 원인으로 인해 발생할 수 있다.

  • 측정 오류(Measuring Error): 센서 고장, 데이터 입력 오류 등
  • 극단적인 현상(Extreme Events): 금융 시장의 급등락, 자연재해 등
  • 데이터 왜곡(Data Corruption): 전처리 과정에서 발생하는 오류
  • 특별한 패턴(Pattern Anomalies): 특정 조건에서만 발생하는 특이한 행동

✨ 이상치 탐지가 중요한 이유

이상치를 제대로 처리하지 않으면 머신러닝 모델의 성능이 저하될 수 있다. 예를 들어, 이상치가 포함된 데이터를 학습하면 모델이 이를 과적합(overfitting)할 가능성이 높아진다. 따라서 적절한 탐지 기법을 사용하여 이상치를 식별하고, 필요하면 제거하거나 조정해야 한다.


📌 이상치 탐지 기법

이상치 탐지 방법은 크게 통계 기반 기법, 거리 기반 기법, 밀도 기반 기법, 기계학습 기반 기법으로 나눌 수 있다.

1️⃣ 통계 기반 기법 (Statistical Methods)

✅ Z-Score (표준 점수)

Z-Score는 데이터가 평균으로부터 얼마나 떨어져 있는지를 표준편차 단위로 측정하는 방법이다.

[
Z = \frac{x - \mu}{\sigma}
]

  • ( \mu ) = 평균(mean)
  • ( \sigma ) = 표준편차(standard deviation)
  • Z 값이 특정 임계값(일반적으로 ±3 이상)을 넘으면 이상치로 간주

🔹 파이썬 예제:

import numpy as np
from scipy import stats

# 데이터 생성
data = np.array([10, 12, 15, 14, 13, 100])  # 100이 이상치
z_scores = np.abs(stats.zscore(data))

# 이상치 판별
threshold = 3
outliers = np.where(z_scores > threshold)
print(outliers)  # 이상치의 인덱스 출력

✅ IQR (Interquartile Range, 사분위수 범위)

IQR은 데이터의 1사분위(Q1)와 3사분위(Q3) 사이의 범위를 기준으로 이상치를 탐지하는 기법이다.

[
IQR = Q3 - Q1
]
[
\text{Lower Bound} = Q1 - 1.5 \times IQR
]
[
\text{Upper Bound} = Q3 + 1.5 \times IQR
]

🔹 파이썬 예제:

import numpy as np

# 데이터 생성
data = np.array([10, 12, 15, 14, 13, 100])  

# 사분위수 계산
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1

# 이상치 기준 설정
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 이상치 판별
outliers = np.where((data < lower_bound) | (data > upper_bound))
print(outliers)

2️⃣ 거리 기반 기법 (Distance-Based Methods)

✅ k-Nearest Neighbors (kNN)

kNN을 활용한 이상치 탐지는 특정 데이터 포인트와 가장 가까운 k개의 이웃들과의 거리를 계산하여 이상치를 찾는 방법이다.

  • 평균적으로 거리가 먼 점일수록 이상치일 가능성이 높다.
  • 유클리드 거리(Euclidean Distance)를 많이 사용한다.

🔹 파이썬 예제 (Scikit-learn 활용):

from sklearn.neighbors import LocalOutlierFactor

# 데이터 생성
X = np.array([[10], [12], [15], [14], [13], [100]])  

# LOF 모델 적용
lof = LocalOutlierFactor(n_neighbors=2)
outlier_scores = lof.fit_predict(X)

# 이상치 판별 (-1이면 이상치)
print(outlier_scores)

3️⃣ 밀도 기반 기법 (Density-Based Methods)

✅ DBSCAN (Density-Based Spatial Clustering of Applications with Noise)

DBSCAN은 데이터의 밀도를 기반으로 이상치를 탐지하는 방법이다.

  • 밀집된 지역에 포함되지 않은 노이즈 포인트(noise points)를 이상치로 간주한다.

🔹 파이썬 예제:

from sklearn.cluster import DBSCAN

# 데이터 생성
X = np.array([[10], [12], [15], [14], [13], [100]])

# DBSCAN 적용
dbscan = DBSCAN(eps=3, min_samples=2)
labels = dbscan.fit_predict(X)

# -1이면 이상치
print(labels)

4️⃣ 머신러닝 기반 기법 (Machine Learning-Based Methods)

✅ Isolation Forest

Isolation Forest는 이상치를 격리하는 방식으로 동작하는 앙상블 학습 기반 기법이다.

  • 이상치는 랜덤한 분할 과정에서 더 적은 단계로 분리된다.

🔹 파이썬 예제:

from sklearn.ensemble import IsolationForest

# 데이터 생성
X = np.array([[10], [12], [15], [14], [13], [100]])

# Isolation Forest 적용
iso_forest = IsolationForest(contamination=0.1, random_state=42)
outlier_predictions = iso_forest.fit_predict(X)

# -1이면 이상치
print(outlier_predictions)

🚀 이상치 처리 방법

이상치를 탐지한 후에는 다음과 같은 방법으로 처리할 수 있다.

  1. 제거(Deletion): 이상치를 데이터셋에서 삭제 (데이터가 충분할 때 가능)
  2. 대체(Imputation): 평균, 중앙값 또는 예측값으로 이상치를 대체
  3. 변환(Transformation): 로그 변환(Log Transformation) 등으로 이상치의 영향을 줄임
  4. 모델링(Modeling): 이상치를 감안한 모델 사용 (예: 로버스트 회귀 Robust Regression)

🏁 정리

기법 방식 장점 단점
Z-Score 통계 기반 간단하고 직관적 정규분포에서만 효과적
IQR 통계 기반 강건한 기법 이상치 경계가 주관적
kNN 거리 기반 비선형 데이터 탐지 가능 계산 비용이 높음
DBSCAN 밀도 기반 군집 기반 이상치 탐지 가능 하이퍼파라미터 설정이 중요
Isolation Forest 머신러닝 비지도 학습으로 활용 가능 데이터 크기에 따라 성능 변화

🔑 키워드

  • 이상치 탐지
  • Z-Score
  • IQR
  • Isolation Forest
반응형