본문 바로가기
프로그래밍/Scikit-Learn

[Scikit-Learn] 29. Local Outlier Factor 계산하기 (feat. LocalOutlierFactor)

by 부자 꽁냥이 2023. 5. 14.

Local Outlier Factor(LOF)는 밀도 기반 이상치 지표로써 이상치를 판별하고자 하는 점 주변의 밀도와 그 주변에 있는 점들의 밀도를 고려하여 이상치 여부를 판단하게 해주는 지표로 많이 활용된다. Scikit-Learn(sklearn)에서는 LocalOutlierFactor 클래스를 이용하여 LOF를 계산할 수 있다. 따라서 이번 포스팅에서는 LocalOutlierFactor 클래스 사용법을 알아보고자 한다.

 

LOF에 대한 개념은 아래 포스팅에 자세히 정리해두었으니 궁금하신 분들은 참고하면 좋다.

 

42. Local Outlier Factor(LOF)에 대해서 알아보자 with Python

 

42. Local Outlier Factor(LOF)에 대해서 알아보자 with Python

이번 포스팅에서는 밀도 기반 이상치 여부를 판단하는 지표인 Local Outlier Factor(LOF)에 대한 개념과 파이썬으로 구현해 보는 방법에 대해서 알아보고자 한다. - 목차 - 1. Local Outlier Factor란? 2. 파이

zephyrus1111.tistory.com


   LocalOutlierFactor 사용법

먼저 시뮬레이션용 데이터를 만들어준다.

 

import matplotlib.pyplot as plt
import numpy as np
plt.rcParams['axes.unicode_minus'] = False
from sklearn.neighbors import LocalOutlierFactor

np.random.seed(25)

## 데이터 생성
x1 = 0.3 * np.random.randn(100, 2)
x2 = 3 * np.random.rand(30, 2)
X = np.r_[x1, x2]

## 시각화
fig = plt.figure(figsize=(6,6))
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.scatter(X[:, 0], X[:, 1], color='k', s=10)
plt.show()

 

실험용 데이터

LocalOutlierFactor 사용법은 간단하다. 이웃으로 사용할 데이터 개수 n_neighbors, 거리 측도를 지정하여 초기화한 후 fit 메서드를 이용하면 된다. 이때 사용할 수 있는 거리 측도는 여기에서 확인해볼 수 있다.

 

그러고 나서 negative_outlier_factor_ 속성을 통하여 LOF 값을 알 수 있는데 여기에는 음의 LOF 값으로 저장되어 있다. 이는 큰 값을 정상, 낮은 값을 이상치로 판별하기 위해 이렇게 한 것이다. 따라서 제대로 된 LOF 값을 얻으려면 앞에 마이너스 부호 '-'를 붙여줘야 한다. 아래 코드는 실험용 데이터를 이용하여 LOF를 계산하고 데이터에 대한 LOF를 표현하기 위해 LOF 값에 비례하여 커지는 원을 추가로 표시했다.

 

clf = LocalOutlierFactor(n_neighbors=5,
                         metric='l2' ## 거리 측도
                        ).fit(X)
lof_scores = -clf.negative_outlier_factor_

## 시각화
lof_max = lof_scores.max()
lof_min = lof_scores.min()
radius = (lof_scores - lof_min) / (lof_max - lof_min)

fig = plt.figure(figsize=(6,6))
fig.set_facecolor('white')
ax = fig.add_subplot()
ax.scatter(X[:, 0], X[:, 1], color='k', s=10, label='Data')
ax.scatter(X[:, 0], X[:, 1], s=1000 * radius, facecolors='none', edgecolors='r', label='LOF Score')
legend = ax.legend()
legend.legendHandles[0]._sizes = [10]
legend.legendHandles[1]._sizes = [20]
plt.show()

 

LOF 시각화 결과


댓글


맨 위로