Menu
CoddyTech

Isolation Forest

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

异常点很容易被分离出来。反复随机切分数据,直到某个点单独出现:

相同的散点图展示了两次,由灰色随机切分线划分。左图:顶部角落的一个远处点经过 2 次切分后单独出现。右图:人群中间的一个点需要经过 8 次切分

距离较远的点需要 2 次切分,密集的点需要 8 次。孤立森林会对 100 棵随机树的切分次数取平均值:

from sklearn.ensemble import IsolationForest
forest = IsolationForest(contamination=0.02, random_state=0)
flags = forest.fit_predict(X)

fit_predict 对异常行返回 -1,对其余行返回 1。contamination 表示你预计的异常行占比。

challenge icon

挑战

中等

一个港口记录了 160 个起重机班次:每小时搬运量和每次搬运的能耗。哪些班次比较异常?

  1. 用孤立森林标记这些班次,设置 contamination=0.03、random_state=0。按下面的格式输出数量。
  2. 用点标出正常班次,标签为 normal。
  3. 圈出被标记的班次:s=150, facecolors="none", edgecolors="red",标签为 flagged。添加图例并显示图表。

对于另一个有 200 个班次的港口:

Flagged: 6 of 200 shifts

起重机班次以点的形式分布在逐渐下降的云状图中,速度更快的起重机每次搬运能耗更低,周围有 6 个孤立的班次用红圈标出,并带有图例

然后 Coddy 会描述你的图表。

亲手试试

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.ensemble import IsolationForest

# 港口每个起重机班次占一行:记录作业速度和能耗
shifts = pd.read_csv("cranes.csv")
X = shifts[["moves_per_hour", "kwh_per_move"]]

# 不要修改下面的代码行
fig, ax = plt.subplots()
ax.set_title("Crane Shifts")
ax.set_xlabel("Moves per hour")
ax.set_ylabel("Energy per move (kWh)")

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

无监督学习中的所有课

自己练习: Python 在线编译器