❗ 비지도학습 기법 중 이상 탐지는 정상 패턴에서 벗어난 특이한 패턴을 식별하여, 금융·제조업 등 다양한 산업에서 사전 예방과 효율 극대화를 위해 활용되는 핵심 기술을 알아보겠습니다!
데이터에서 ‘정상(normal) 패턴’과 크게 다른 행위를 보이는 특이한 패턴(이상, anomaly)을 찾는 기법
금융 사기
제조업
보안
이상치 탐지(Outlier Detection)는 단순히 통계적으로 극단값(Outlier)을 찾는 데 초점을 둔다. 예를 들어 평균에서 크게 벗어난 데이터 포인트를 찾는 방식
이상 탐지(Anomaly Detection)는 단순 극단값 뿐 아니라, 맥락(Context)이나 시계열 상의 패턴을 함께 고려하여 ‘비정상’인지를 판단하는 것을 의미하는 경우가 많다.
이제 대표적인 알고리즘을 알아보겠습니다. 각 알고리즘은 비지도학습(레이블이 없는 상황)에서 데이터의 분포/패턴을 학습하고, 그로부터 크게 벗어나는 포인트를 ‘이상’으로 간주합니다.

https://medium.com/@mail.garima7/one-class-svm-oc-svm-9ade87da6b10
알고리즘 원리
특징

알고리즘 원리
특징
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
# 1. 데이터 로드: Iris 데이터셋
from sklearn.datasets import load_iris
data = load_iris()
X = data.data
y = data.target # 여기서는 실제 라벨을 이용하지 않음
# 간단히 2개 특성만 사용 (예: 꽃받침 길이, 꽃받침 너비) --> 시각화 편의를 위해
X_2d = X[:, :2] # shape: (150, 2)
# 2. One-Class SVM
from sklearn.svm import OneClassSVM
oc_svm = OneClassSVM(nu=0.05) # 예시 파라미터
oc_svm.fit(X_2d)
# 예측: 1(정상), -1(이상치)
y_pred_oc = oc_svm.predict(X_2d)
# 3. Isolation Forest
from sklearn.ensemble import IsolationForest
iso_forest = IsolationForest(contamination=0.05, random_state=42)
iso_forest.fit(X_2d)
# 예측: 1(정상), -1(이상치)
y_pred_if = iso_forest.predict(X_2d)
# 4. 이상치로 예측된 샘플 인덱스 추출
outliers_oc = np.where(y_pred_oc == -1)[0] # One-Class SVM이 예측한 이상치
outliers_if = np.where(y_pred_if == -1)[0] # Isolation Forest가 예측한 이상치
print("=== One-Class SVM ===")
print("이상치로 탐지된 샘플 개수:", len(outliers_oc))
print("이상치 인덱스:", outliers_oc)
print("\n=== Isolation Forest ===")
print("이상치로 탐지된 샘플 개수:", len(outliers_if))
print("이상치 인덱스:", outliers_if)
# 5. 시각화
# 2차원 특성 공간에서 이상치로 판별된 점들을 빨간색으로 표시
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
axes[0].scatter(X_2d[:, 0], X_2d[:, 1], label='Normal')
axes[0].scatter(X_2d[outliers_oc, 0], X_2d[outliers_oc, 1],
color='red', edgecolors='k', label='Outliers')
axes[0].set_title("One-Class SVM")
axes[0].set_xlabel("Sepal Length")
axes[0].set_ylabel("Sepal Width")
axes[0].legend()
axes[1].scatter(X_2d[:, 0], X_2d[:, 1], label='Normal')
axes[1].scatter(X_2d[outliers_if, 0], X_2d[outliers_if, 1],
color='red', edgecolors='k', label='Outliers')
axes[1].set_title("Isolation Forest")
axes[1].set_xlabel("Sepal Length")
axes[1].set_ylabel("Sepal Width")
axes[1].legend()
plt.tight_layout()
plt.show()
load_iris()로 Iris 데이터셋을 불러옵니다.X[:, :2]) 사용합니다.OneClassSVM(nu=0.05)로 모델을 생성합니다.fit(X_2d)로 학습한 뒤, predict(X_2d) 결과로 1(정상), -1(이상치) 레이블을 받습니다.nu는 데이터 스케일이나 분포에 따라 조정 가능하며, nu=0.05는 전체 데이터 중 약 5% 정도를 이상치로 잡겠다는 것입니다.IsolationForest(contamination=0.05, random_state=42)로 모델을 생성합니다.fit(X_2d)로 학습 후, predict(X_2d) 결과로 1(정상), -1(이상치) 레이블을 받습니다.contamination=0.05로 이상치 비율(오염도)을 대략 5%로 가정합니다.np.where(y_pred_oc == -1), np.where(y_pred_if == -1)로 각각 이상치로 분류된 샘플의 인덱스를 찾습니다.scatter에서 다른 색상으로 표시).

카드 사기 거래(Fraud Detection)
돈세탁 의심 거래(Money Laundering)
설비 고장 예측
품질 이상 탐지
Wine 데이터셋을 로드하세요.
변수(특성) 2개만 간단히 선택하세요. (예: 첫 번째와 두 번째 컬럼)
One-Class SVM과 Isolation Forest를 각각 적용하여, 이상치(Outlier)를 찾아보세요.
nu 파라미터를 적절히 설정하세요.contamination을 적절히 설정하세요.두 모델에서 도출된 이상치 샘플들을 그래프에서 빨간색으로 표시한 2차원 산점도를 시각화하세요.
[코드스니펫] 이상 탐지 실습 사전 코드
import numpy as np
import matplotlib.pyplot as plt
# 1. Wine 데이터셋 로드
from sklearn.datasets import load_wine
wine = load_wine()
X = wine.data
y = wine.target
# 변수 2개만 선택 (예: 컬럼 0, 1)
X_2d = X[:, :2] # shape: (178, 2)
feature_names = [wine.feature_names[0], wine.feature_names[1]]
import numpy as np
import matplotlib.pyplot as plt
# 1. Wine 데이터셋 로드
from sklearn.datasets import load_wine
wine = load_wine()
X = wine.data
y = wine.target
# 변수 2개만 선택 (예: 컬럼 0, 1)
X_2d = X[:, :2] # shape: (178, 2)
feature_names = [wine.feature_names[0], wine.feature_names[1]]


1️⃣ 이상 탐지(Anomaly Detection)는 정상 패턴과 다른 데이터를 찾아내는 기법이다.
2️⃣ 이상치 탐지(Outlier Detection)와 유사하지만, 맥락과 패턴 학습 측면에서 조금 더 넓은 범위를 다룬다.
3️⃣ 대표 알고리즘
4️⃣ 금융(카드 사기, 돈세탁)과 제조업(설비 고장 예측, 품질 관리) 등 다양한 분야에서 활용할 수 있다.
Q1: 이상 탐지를 위해 라벨이 전혀 없는 데이터만 있어도 모델을 학습할 수 있나요?
A1: 네, 비지도학습 방식인 One-Class SVM, Isolation Forest 등은 기본적으로 정상 레이블만(혹은 완전히 라벨이 없는 데이터)으로도 이상 패턴을 학습할 수 있습니다. 그러나 정확도 향상을 위해 일부 라벨이 있거나, 정상 데이터만 정확히 확보할 수 있다면 훨씬 유리합니다.
Q2: Isolation Forest에서 contamination 파라미터는 어떻게 결정하나요?
A2: contamination은 이상치(또는 이상 데이터) 비율을 의미합니다. 실제 데이터셋에서 예상되는 이상치 비율을 추정해 설정하는 것이 일반적이고, 도메인 지식이나 사전 샘플링을 통해 결정하는 경우가 많습니다. 예를 들어, 전체 거래의 1%가 사기일 것으로 가정한다면 contamination=0.01로 설정할 수 있습니다.
Q3: 실무에서 임계값(threshold)은 어떻게 정하나요?
A3: 모델이 산출한 이상 스코어(복원 오차, 결정 함수 값 등)의 분포를 확인해 적절한 지점을 선택합니다. 일반적으로 정상 데이터에서의 분포를 기준으로, 허용 가능한 오탐(false positive)과 미탐(false negative)의 비율을 고려해 최적점을 찾습니다.
Q4: 이상 탐지를 강화하기 위해 다른 방법들과 혼합해 쓸 수 있나요?
A4: 네, 가능합니다. 예를 들어, One-Class SVM과 Isolation Forest 결과를 앙상블로 합산하는 등의 방법으로 더 정교한 이상 탐지 시스템을 구축할 수 있습니다.