Menu
CoddyTech

Local Outlier Factor

Coddy Machine Learning 여정의 비지도 학습 섹션에 포함된 레슨. 51개 중 36번째.

일부 이상한 점들은 데이터의 범위 안에 숨어 있습니다. 국소 이상치 계수인 LOF는 각 점이 있는 위치가 이웃 점들의 위치와 비교해 얼마나 밀집되어 있는지 비교합니다:

주차장의 자동차들. 가로축은 도착 시간, 세로축은 주차 시간입니다. 통근자는 8:00 무렵에 도착해 9시간 동안 빽빽하게 주차되어 있고, 쇼핑객은 하루 종일 몇 시간씩 널리 퍼져 있으며, 8:18에 도착해 6.6시간 주차한 자동차 한 대가 빨간색 원으로 표시되어 LOF에 의해 이상치로 식별됨

쇼핑객들은 때때로 6시간 동안 머뭅니다. 하지만 이 차의 이웃들은 출퇴근하는 사람들로, 빽빽하게 모여 있고, 이 차는 그 무리에서 멀리 떨어져 있습니다:

from sklearn.neighbors import LocalOutlierFactor
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.02)
flags = lof.fit_predict(X)

이전과 같은 답입니다. -1은 이상치, 1은 정상입니다. n_neighbors는 비교의 지역성을 설정합니다.

challenge icon

챌린지

중급

한 전화 회사가 주변 계정들과 다른 계정을 찾습니다. 시작 코드는 데이터를 스케일링하고 Isolation Forest로 계정에 플래그를 지정합니다. 프로그램은 k를 읽습니다.

  1. LOF로 계정에 플래그를 지정합니다: n_neighbors=k, contamination=0.03.
  2. 각 탐지기의 개수와 두 탐지기가 모두 플래그를 지정한 계정 수를 출력합니다.
  3. 아래와 같이 LOF만 플래그를 지정한 계정을 테이블 순서대로 나열합니다.

더 작은 회사와 10의 경우:

Isolation forest: 5 accounts
LOF: 5 accounts
Both: 4 accounts
Only LOF:
  A118: 960 minutes, 6.2 GB

직접 해보기

import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor

# 전화 계정당 한 행: 한 달간의 통화 시간과 모바일 데이터 사용량
accounts = pd.read_csv("accounts.csv")
X = StandardScaler().fit_transform(accounts[["call_minutes", "data_gb"]])
k = int(input())

# Isolation Forest 결과: 포레스트가 이상하다고 판단한 계정에는 -1
forest_flags = IsolationForest(contamination=0.03, random_state=0).fit_predict(X)

# 아래에 코드를 작성하세요
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

비지도 학습의 모든 레슨

직접 연습해 보세요: 온라인 Python 컴파일러