Menu
CoddyTech

Local Outlier Factor

本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 36 课,共 51 课。

一些异常点藏在数据范围内。局部离群因子(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

挑战

中等

一家电话公司要找出与邻近账户不同的账户。起始代码会缩放数据,并使用孤立森林标记账户;程序会读取 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 在线编译器