본문 바로가기
카테고리 없음

Anomaly Detection_LOF

by Foxy현 2023. 4. 14.
728x90
반응형

LOF(Local Outlier Factor) 이상탐지는 데이터셋에서 이상치(outlier)를 찾는 기술 중 하나입니다. 이 기술은 데이터 포인트의 군집(clustering)과 밀도(density)를 기반으로 이상치를 탐지합니다.

LOF 이상탐지는 다음과 같은 세 단계로 구성됩니다.

  1. k-Nearest Neighbor(NN) 구하기: 각 데이터 포인트에서 k개의 가장 가까운 이웃을 찾습니다.
  2. Reachability Distance 구하기: 각 데이터 포인트에서 이웃까지의 거리를 계산합니다.
  3. Local Outlier Factor 계산하기: 각 데이터 포인트의 이웃들과의 Reachability Distance를 비교하여 LOF를 계산합니다.

이론적으로는 LOF가 1인 데이터 포인트는 군집에 속해 있으며,

LOF가 1보다 큰 데이터 포인트는 이상치로 간주됩니다.

LOF가 1보다 작은 경우는 드물게 발생하는데, 이 경우 해당 데이터 포인트는 상대적으로 밀도가 높은 지역에 위치해 있음을 나타냅니다.

 

LOF 이상탐지는 매우 유용한 기술이지만, 데이터셋에 따라서는 정확도가 떨어질 수 있습니다.

특히, 데이터셋이 높은 차원에서 작동할 때 문제가 발생할 수 있습니다.

또한, k값을 선택하는 것이 중요한데, k값을 지나치게 작게 선택하면 군집화의 정확성이 낮아지고, k값을 지나치게 크게 선택하면 이상치 탐지의 정확도가 떨어집니다.

 

예시 코드는 아래와 같습니다.

 

import numpy as np
import pandas as pd
from sklearn.neighbors import LocalOutlierFactor
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 학습 데이터 생성 (hour, attendance, score feature)
df_train = pd.DataFrame([
    [2,1,3],
    [3,2,5],
    [3,4,7],
    [5,5,10],
    [6,5,11],
    [2,4,6],
    [3,5,8],
    [10,30,40],
    [9,9,12],
    [20,30,40]
],columns=['hour','attendance','score'])

# 테스트 데이터 생성 (hour, attendance, score feature)
df_test = pd.DataFrame([
    [9,2,13],
    [6,10,12],
    [2,4,6]
],columns=['hour','attendace','score'])

# Local Outlier Factor 모델 학습 및 이상치 판단
outlier = LocalOutlierFactor(n_neighbors=2, contamination=0.2)
y_predict = outlier.fit_predict(df_train)
df_train['outlier'] = y_predict

# 3차원 산점도 그리기
fig = plt.figure(figsize=(9,6))
ax = fig.add_subplot(111,projection='3d')

# 이상치를 나타내는 데이터는 빨간색으로, 정상 데이터는 초록색으로 표시
df_red = df_train[df_train['outlier']==-1]
df_green = df_train[df_train['outlier']==1]

ax.scatter(df_red['hour'], df_red['attendance'], df_red['score'], color='r',alpha=0.5)
ax.scatter(df_green['hour'], df_green['attendance'], df_green['score'], color='g', alpha=0.5)

plt.show()

 

 

 

 

 

728x90
반응형