머신러닝 기초 – 이상치 탐지(Outlier Detection) 기법
머신러닝에서 이상치(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)
🚀 이상치 처리 방법
이상치를 탐지한 후에는 다음과 같은 방법으로 처리할 수 있다.
- 제거(Deletion): 이상치를 데이터셋에서 삭제 (데이터가 충분할 때 가능)
- 대체(Imputation): 평균, 중앙값 또는 예측값으로 이상치를 대체
- 변환(Transformation): 로그 변환(Log Transformation) 등으로 이상치의 영향을 줄임
- 모델링(Modeling): 이상치를 감안한 모델 사용 (예: 로버스트 회귀 Robust Regression)
🏁 정리
기법 | 방식 | 장점 | 단점 |
---|---|---|---|
Z-Score | 통계 기반 | 간단하고 직관적 | 정규분포에서만 효과적 |
IQR | 통계 기반 | 강건한 기법 | 이상치 경계가 주관적 |
kNN | 거리 기반 | 비선형 데이터 탐지 가능 | 계산 비용이 높음 |
DBSCAN | 밀도 기반 | 군집 기반 이상치 탐지 가능 | 하이퍼파라미터 설정이 중요 |
Isolation Forest | 머신러닝 | 비지도 학습으로 활용 가능 | 데이터 크기에 따라 성능 변화 |
🔑 키워드
- 이상치 탐지
- Z-Score
- IQR
- Isolation Forest