Menu
CoddyTech

找出异常项

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

本章将找出异常行。学完后,你会圈出服务器中异常的分钟:

一个夜晚的 Web 服务器分钟数据,横轴为每秒请求数,纵轴为延迟:数据点紧密地向上聚集,红圈圈出两个检测器都认定的四个孤立分钟

异常是与其他行不同的少见行:可能是故障、欺诈或拼写错误。每个新异常都不一样,所以没人能提前为它们贴上标签。

先从 z 分数开始。StandardScaler 会将每一列转换为 z 分数,因此一行代码就能标记任意值超过 3 的行:

z = StandardScaler().fit_transform(X)
odd = (np.abs(z) > 3).sum(axis=1) > 0

桥梁传感器的应变随温度升高而增大。一个远高于其他读数的值被红圈圈出,标记为应变 z 分数超过 3。27 度时有一个读数低于变化趋势,被橙圈圈出:漏掉了

但一行数据在每一列中都可能很普通,只有组合起来才显得奇怪。列的 z 分数无法发现这一点。

challenge icon

挑战

中等

一家超市记录了其 80 台冷柜当天的平均数据。哪些冷柜需要技术人员检查?程序会读取一个阈值。

  1. 将 X 的每一列转换为 z 分数。
  2. 对每一列,打印被标记的冷柜数量:z 分数与 0 的距离大于阈值。
  3. 按表格中的顺序,打印被任意一列标记的每台冷柜。

对于另一家商店,阈值为 3:

temp_c: 1 flagged
power_kw: 2 flagged
door_openings: 0 flagged
defrost_min: 0 flagged
Freezers to check:
  F05
  F13
  F51

亲手试试

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler

# 每台冷冻柜占一行:记录一天的平均值
freezers = pd.read_csv("freezers.csv")
columns = ["temp_c", "power_kw", "door_openings", "defrost_min"]
X = freezers[columns]
cutoff = float(input())

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

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

无监督学习中的所有课

自己练习: Python 在线编译器