국소 이상치 요인(LOF)이란? AI에서 이웃의 밀도와 비교해 이상치를 찾는 방법
TL;DR
국소 이상치 요인(Local Outlier Factor, LOF)은 한 사례의 밀도를 주변 이웃의 밀도와 비교해 이상 정도를 계산하는 알고리즘입니다. 전체 데이터에서 멀리 떨어졌는지만 보지 않고 가까운 사례들에 비해 얼마나 듬성듬성한 곳에 있는지 봅니다. 이웃 수와 거리 기준이 결과를 바꾸며, scikit-learn에서는 음수로 뒤집은 점수를 읽습니다. 기존 데이터의 이상치를 찾는 모드와 새 입력을 판정하는 모드도 구분해야 합니다.
핵심 3줄 요약
- 핵심 1
이웃과의 상대 밀도를 봅니다. 주변도 함께 듬성듬성하다면 단순히 밀도가 낮다는 이유만으로 이상하다고 보지 않습니다. - 핵심 2
점수와 판정 기준은 다릅니다. 원래 LOF는 클수록 이상한 쪽이고 scikit-learn의 negative_outlier_factor_는 낮을수록 이상한 쪽입니다. - 핵심 3
이웃 수와 사용 모드를 확인합니다. n_neighbors, 특징 단위, novelty 설정을 맞추고 실제 문제 여부는 원자료와 검토 결과로 확인합니다.
이 글에서 다룰 내용
- 국소 이상치 요인의 한 문장 정의
- 밀도가 다른 두 집단으로 이해하는 예시
- 가까운 이웃과 도달 가능 밀도의 계산 원리
- LOF 점수·음수 점수·임계값의 차이
- 아이솔레이션 포레스트·DBSCAN·KNN과의 구분
- 이상치 탐지와 새로움 탐지의 사용 모드
- 실전 사용처와 전처리·평가 체크리스트
국소 이상치 요인을 한 문장으로 정의하면 무엇인가요?
국소 이상치 요인은 가까운 이웃들의 평균적인 국소 밀도를 자기 자신의 국소 밀도와 비교해, 주변보다 상대적으로 성긴 위치의 사례에 높은 이상 점수를 주는 비지도 알고리즘입니다.
영문 이름을 줄여 LOF라고 부릅니다. 여기서 국소는 현재 사례 주변의 제한된 이웃을 본다는 뜻입니다. 사례가 전체 평균과 다르다는 사실만으로 판단하지 않고 그 사례가 속한 주변 환경까지 비교합니다.
scikit-learn 공식 문서는 이웃보다 밀도가 상당히 낮은 사례를 이상치로 보는 방법이라고 설명합니다. 정상·이상 정답 없이 계산할 수 있지만 점수의 의미는 선택한 특징과 거리, 함께 넣은 데이터에 달려 있습니다. 사기나 고장의 확률을 직접 학습하는 분류기는 아닙니다.
한 줄 정리: LOF는 나와 이웃 사이의 거리뿐 아니라, 그 이웃들이 자기 주변에서 얼마나 촘촘하게 모여 있는지도 봅니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 장비의 온도와 진동 기록을 살펴본다고 가정해 보겠습니다. 한 운전 모드에서는 측정값이 촘촘히 모이고 다른 모드에서는 정상값이 좀 더 넓게 퍼집니다. 이때 전체에 같은 거리 기준만 적용하면 넓게 퍼진 정상 모드를 잘못 의심할 수 있습니다.
LOF는 넓게 퍼진 집단 안의 사례를 그 주변 이웃과 비교합니다. 자기 주변의 밀도와 이웃들의 밀도가 비슷하면 낮은 밀도만으로 크게 이상하다고 보지 않는 경향이 있습니다. 촘촘한 집단에서 살짝 벗어난 사례는 주변 이웃에 비해 자기 밀도가 낮아 주의 대상으로 떠오를 수 있습니다.
두 사례가 가장 가까운 이웃까지 같은 거리에 있어도 LOF 점수는 다를 수 있습니다. 한쪽 이웃들이 서로 바짝 모여 있고 다른 쪽 이웃들은 원래 넓게 퍼져 있다면 비교 기준이 달라지기 때문입니다. 단순한 최근접 거리와 구분되는 부분입니다.
이 설명은 원리를 이해하기 위한 가정이며 실제 장비 실험 결과가 아닙니다. 운전 모드가 충분히 표본에 담겼는지, 이웃 수를 바꾸면 두 모드가 섞이는지, 경계의 정상 사례를 지나치게 의심하는지 따로 확인합니다.
쉬운 예시: 동네마다 집 사이 간격이 다르다고 생각해 보세요. LOF는 모든 집에 같은 간격 기준을 들이대기보다 주변 집들의 간격과 비교하는 방식에 가깝습니다.
왜 AI에서 국소 이상치 요인이 중요한가요?
밀도가 다른 정상 집단을 함께 살펴봅니다
현실의 데이터는 하나의 일정한 밀도로 모이지 않습니다. LOF는 주변과의 상대적인 차이를 사용하므로 이런 데이터에서 비교할 만한 후보입니다. 그렇다고 밀도 차이를 항상 완벽하게 해결하지는 않습니다. 작은 정상 집단의 크기보다 이웃 수가 크면 다른 집단이 비교 대상에 섞일 수 있습니다.
정답이 부족한 데이터에서 조사 순서를 만듭니다
라벨을 만들기 전 수치 기록을 탐색하거나 먼저 읽을 사례를 고를 때 쓸 수 있습니다. 점수가 크게 튀는 기록을 원자료와 대조해 입력 오류, 드문 정상 상황, 실제 문제를 나눠 검토합니다. 모델이 정답을 요구하지 않아도 결과를 평가할 사람의 확인은 필요합니다.
국소 이상치 요인은 어떻게 작동하나요?
가까운 이웃을 정합니다
각 사례에서 거리가 가까운 이웃을 찾습니다. scikit-learn의
n_neighbors
는 이때 살펴볼 이웃 수이며 기본값은 20입니다. 같은 숫자가 모든 데이터에 맞지는 않습니다. 이웃 수가 작으면 작은 변화에 민감해지고 크게 잡으면 더 넓은 주변을 기준으로 비교하게 됩니다.
이웃의 거리 규모로 도달 거리를 보정합니다
도달 가능 거리라는 보정값을 사용합니다. 비교하는 두 점 사이의 실제 거리와, 상대 이웃에서 그 이웃의 k번째 가까운 점까지의 거리 중 큰 값을 택합니다. 매우 가까운 두 점의 거리만으로 밀도가 지나치게 커지는 일을 줄이려는 계산입니다.
여기서 k번째 이웃 거리는 현재 점이 아니라 비교 상대인 이웃 쪽의 값입니다. 일반적인 두 점 사이 거리와 달리 방향을 바꾸면 보정값이 달라질 수 있습니다. 가까운 점까지의 평균 거리만 계산한 것을 그대로 LOF라고 부르면 이 단계를 빠뜨립니다.
국소 도달 가능 밀도를 계산합니다
현재 점에서 이웃들로 향하는 도달 가능 거리를 평균한 뒤 그 역수를 국소 도달 가능 밀도로 사용합니다. 평균 거리가 작으면 밀도가 높고 크면 낮습니다. 공식 구현은 중복값 때문에 분모가 0이 되는 상황을 피하려고 작은 보정값도 더합니다.
이웃의 밀도와 자기 밀도를 비교합니다
각 이웃의 국소 도달 가능 밀도를 현재 점의 밀도로 나누고 그 비율을 평균합니다. 이것이 원래 LOF 점수의 핵심입니다. 이웃과 비슷한 밀도라면 대체로 1 근처이고, 이웃들은 조밀한데 자기 주변만 성기면 더 큰 값이 나옵니다. 1보다 조금 크다고 곧바로 문제로 확정하지는 않습니다.
LOF 점수와 임계값은 어떻게 읽나요?
원래 점수와 음수 점수를 구분합니다
scikit-learn의
negative_outlier_factor_
는 학습 데이터의 LOF에 음수를 붙인 값입니다. 정상 사례는 대체로 -1 근처에 있고 더 작은 값일수록 더 이상한 쪽입니다. 원래 LOF의 높은 점수를 우선하는 정렬 코드를 그대로 가져오면 순서가 뒤집힙니다.
이 값은 확률이 아니므로 특정 범위 안에 갇힌다고 생각하면 안 됩니다. 서로 다른 특징, 이웃 수, 데이터 묶음으로 계산한 점수를 같은 척도처럼 비교하는 것도 주의해야 합니다. 점수 옆에 계산 조건을 함께 남기는 편이 안전합니다.
contamination은 판정선을 정하는 설정입니다
contamination="auto"
일 때 공식 구현의
offset_
는 -1.5입니다. 수치로 비율을 지정하면 학습 점수 분포의 분위수로 판정선을 정합니다. 음수 점수가 이 기준보다 작은 사례를 이상치로 표시합니다. 자동 설정이 현실의 이상 비율을 추정했다는 뜻은 아닙니다.
새 입력의 판정 함수는 기준점을 뺍니다
새로움 탐지 모드에서
decision_function
은
score_samples
에서
offset_
를 뺀 값입니다. 판정 함수가 음수면 이상치 쪽이며
predict
는 -1, 정상 쪽은 1을 반환합니다. 다만 기본 LOF 모드에는 이런 새 입력용 메서드가 없다는 점을 먼저 확인하세요.
핵심 인사이트: 밀도 차이를 나타내는 점수와 경보를 울릴 판정선은 다른 역할입니다. 판정선을 옮겨 경보 수를 줄였다고 데이터의 문제를 더 잘 찾아낸 것은 아닙니다.
국소 이상치 요인과 헷갈리는 용어는 무엇이 다른가요?
아이솔레이션 포레스트와의 차이
아이솔레이션 포레스트는 무작위 분할 트리에서 사례가 얼마나 짧은 경로로 고립되는지 봅니다. LOF는 가까운 이웃들의 상대 밀도를 봅니다. 같은 이상 탐지 작업에 쓰더라도 계산 근거가 달라 후보 순위가 일치할 필요는 없습니다.
DBSCAN과의 차이
DBSCAN은 이웃 반경과 최소 표본 수로 밀집 영역을 연결해 군집과 노이즈를 나눕니다. LOF는 각 사례의 이상 정도를 연속적인 점수로 나타냅니다. DBSCAN의 노이즈 라벨이 LOF의 높은 점수와 같은 의미는 아니며, LOF가 군집 번호를 찾아 주는 것도 아닙니다.
KNN 거리 점수와의 차이
KNN은 가까운 이웃을 찾는 기본 방식입니다. 이웃까지의 거리만으로 이상 점수를 만들 수도 있지만 LOF는 이웃 쪽의 밀도까지 계산해 비율로 비교합니다. 같은 거리라도 주변 집단의 조밀함에 따라 다르게 판단할 수 있다는 차이가 있습니다.
이상치 탐지와 새로움 탐지의 차이
기본
novelty=False
에서는 이미 모인 데이터 안에서 이상치를 찾습니다.
fit_predict
로 그 데이터의 라벨을 받고
negative_outlier_factor_
로 점수를 확인합니다. 새 데이터를 나중에 넣는 일반 분류기와 똑같이 생각하면 안 됩니다.
정상 기준 데이터로 학습한 뒤 보지 못한 입력을 판정하려면 학습 전에
novelty=True
를 설정합니다. 이 모드에서는
fit_predict
를 쓰지 않습니다. 공식 문서는
predict
,
decision_function
,
score_samples
를 학습 데이터에 다시 적용하지 말라고 경고합니다. 이웃 처리 방식이 달라 기존 점수와 어긋날 수 있기 때문입니다.
실전에서는 어디에 쓰이나요?
센서 기록의 국소적인 이상 후보를 봅니다
온도·진동처럼 수치 특징의 조합이 주변 기록과 다른 사례를 고르는 데 적용할 수 있습니다. 장비와 운전 모드가 다른데 무조건 한 묶음으로 넣지 말고 비교할 이웃이 업무상 타당한지 봅니다. 높은 점수는 점검 순서의 단서이며 고장 원인을 알려 주지는 않습니다.
학습 데이터의 품질 검토를 보조합니다
측정 단위가 바뀐 행이나 드문 수치 조합을 먼저 살펴보는 용도입니다. 원본 식별자와 점수를 함께 남겨 검토 결과를 되돌릴 수 있게 합니다. 소수 집단이나 중요한 예외 사례가 이상치로 표시될 수 있으므로 점수만 보고 학습 데이터를 삭제하지 않습니다.
정상 기준과 새로운 관측을 비교합니다
새로움 탐지 모드는 정상 기준을 먼저 확보한 뒤 들어오는 관측을 비교하는 상황에 맞습니다. 기준 데이터가 오래되면 새로 생긴 정상 패턴도 이상하게 보일 수 있습니다. 운영에 적용할 때는 예측 지연, 기준 데이터 보관 비용, 재학습 주기를 함께 검토합니다.
국소 이상치 요인을 적용할 때 어떤 순서로 확인하나요?
1. 특징 단위와 거리의 의미를 정합니다
금액과 횟수처럼 단위가 다르면 큰 숫자 범위의 특징이 거리에 강하게 반영될 수 있습니다. 분석 목적에 맞게 스케일을 조정하고 결측값과 범주형 값의 처리도 고정합니다. 단순 식별번호를 연속적인 거리로 계산하지 않도록 입력 열의 의미부터 점검합니다.
2. 학습과 평가의 역할을 나눕니다
기존 묶음 자체를 탐색할지, 정상 기준으로 새 입력을 감시할지 먼저 정합니다. 후자라면 전처리 통계와 모델은 훈련 데이터에서만 맞추고 별도의 새 데이터로 평가합니다. 서로 다른 모드를 섞어 학습 데이터의 판정 결과를 운영 성능처럼 보고하지 않습니다.
3. 이웃 수와 후보 순위의 안정성을 봅니다
이웃 수를 여러 조건으로 바꿔 상위 후보가 얼마나 바뀌는지 확인합니다. 작은 정상 집단, 집단의 경계, 알려진 문제 사례를 따로 살펴보면 전체 평균으로 놓칠 차이가 보입니다. 검토할 라벨이 있으면 오탐과 미탐을 확인하고, 없다면 검토 표본을 만들어 근거를 쌓습니다.
4. 점수·임계값·실행 조건을 함께 남깁니다
데이터 버전, 특징 목록, 전처리, 거리 함수, 이웃 수, 모드와 라이브러리 버전을 저장합니다. 원래 점수인지 음수 점수인지도 명시합니다. 이웃 검색 비용은 표본 수와 차원, 거리 함수와 구현에 따라 달라지므로 실제 규모로 넓히기 전에 처리 시간과 메모리를 측정합니다.
사용할 때 무엇을 주의해야 하나요?
이상 사례끼리 모이면 놓칠 수 있습니다. 기본 이상치 탐지에서 비슷한 이상 사례가 충분히 큰 조밀한 집단을 만들면 서로를 정상적인 이웃처럼 보완할 수 있습니다. 국소 밀도를 비교하는 방식의 한계이므로 별도의 업무 규칙이나 다른 탐지 방법과 대조합니다.
중복값과 높은 차원을 확인합니다. 동일한 기록이 많이 반복되면 국소 밀도 계산이 극단적으로 바뀔 수 있습니다. 공식 구현에도 중복값 관련 경고가 있습니다. 차원이 높아 거리의 구별력이 떨어지는 상황에서는 무관한 특징을 줄이는 방법과 거리 선택을 함께 검토합니다.
이웃 수의 기본값을 정답으로 삼지 않습니다. 20은 출발점일 뿐입니다. 표본이 적거나 정상 집단의 크기가 크게 다르면 적절한 주변 범위도 달라집니다. 학습에 실제 사용한 이웃 수는
n_neighbors_
로 확인하며 데이터가 바뀌면 설정을 재평가합니다.
정상 기준의 변화와 자동 조치를 구분합니다. 경보가 갑자기 늘면 실제 문제뿐 아니라 데이터 수집 오류나 정상 환경의 변화도 조사합니다. 계정 제한, 장비 정지, 원본 삭제 같은 조치를 LOF 점수 하나에 맡기지 말고 추가 확인과 승인 기준을 둡니다.
주의: 이웃보다 밀도가 낮다는 것은 현재 표현과 데이터에서 드물다는 신호입니다. 위험한 사람이나 잘못된 데이터라는 판결로 바꾸지 마세요.
자주 묻는 질문
Q1. LOF도 정상·이상 정답 라벨이 필요한가요?
기본 알고리즘은 정답 라벨 없이 이웃 관계로 점수를 계산합니다. 하지만 탐지 품질을 확인하려면 검토된 사례나 업무 기준이 필요합니다. 비지도 방식이라는 이유로 정확도를 확인하지 않아도 되는 것은 아닙니다.
Q2. 점수가 1이면 반드시 정상인가요?
원래 LOF에서 1 근처는 이웃과 밀도가 비슷하다는 뜻입니다. 실제 문제 여부를 보증하지는 않습니다. scikit-learn의 학습 점수는 음수로 저장되므로 같은 상황을 대체로 -1 근처로 읽습니다.
Q3. 학습한 뒤 predict로 새 데이터를 넣으면 되나요?
기본 모드에서는 안 됩니다. 학습 전에
novelty=True
를 설정한 새로움 탐지 모드여야 합니다. 그 모드의 예측 메서드에는 보지 못한 데이터만 넣고 학습 데이터의 기존 점수는 전용 속성에서 확인하세요.
Q4. contamination을 바꾸면 이웃도 달라지나요?
이 설정은 학습 점수에서 정상·이상을 가를 임계값을 정하는 역할입니다. 이웃 범위를 조절하는
n_neighbors
와 구분합니다. 판정 비율을 바꿨다는 사실만으로 이상 사례를 더 잘 구분하게 됐다고 말할 수는 없습니다.
Q5. LOF가 아이솔레이션 포레스트보다 더 좋은가요?
항상 그렇지는 않습니다. LOF는 거리와 상대 밀도에, 아이솔레이션 포레스트는 무작위 분할의 경로 길이에 의존합니다. 같은 평가 데이터에서 놓친 사례, 오탐, 실행 비용을 비교한 뒤 목적에 맞는 방법을 선택합니다.
출처
마무리
국소 이상치 요인은 자기 주변의 밀도를 이웃들의 밀도와 비교하는 방법입니다. 전체에서 멀리 떨어졌는지만 묻지 않고 주변에 비해 상대적으로 성긴 사례를 찾습니다. 이웃 수와 거리 기준이 그 비교의 범위를 정합니다.
처음에는 상대 밀도, 점수의 방향, 사용 모드를 구분하면 충분합니다. 기존 데이터는 fit_predict와 학습 점수로 살펴보고 새 입력은 새로움 탐지 모드에서 평가하세요. 마지막 판정은 원자료와 업무 맥락을 함께 확인할 때 비로소 쓸 만해집니다.
