Local Outlier Factor
本课属于 Coddy Machine Learning 学习旅程的“无监督学习”单元。第 36 课,共 51 课。
一些异常点藏在数据范围内。局部离群因子(LOF)会比较每个点所在位置的拥挤程度与其邻居所在位置的拥挤程度:
购物者有时会待 6 小时。但这辆车周围的车辆都是通勤者,挤得很紧,而它离这群车很远:
from sklearn.neighbors import LocalOutlierFactor
lof = LocalOutlierFactor(n_neighbors=20, contamination=0.02)
flags = lof.fit_predict(X)答案和之前一样:-1 表示异常,1 表示正常。n_neighbors 用来设置比较的局部范围。
挑战
中等一家电话公司要找出与邻近账户不同的账户。起始代码会缩放数据,并使用孤立森林标记账户;程序会读取 k。
- 使用 LOF 标记账户:
n_neighbors=k,contamination=0.03。 - 输出每个检测器标记的账户数量,以及两个检测器都标记的账户数量。
- 按表格顺序列出只有 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)
# 在下方编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
无监督学习中的所有课
自己练习: Python 在线编译器