Menu
CoddyTech

处理异常值

本课属于 Coddy Machine Learning 学习旅程的“机器学习统计学”单元。第 27 课,共 64 课。

有 10 套公寓的用水量都在 10 m³ 左右,但一次漏水让其中一套的用水量升到了 64。你可以剔除这个值,也可以把它限制在最近的围栏处:

三行显示 10 套公寓的用水量。保留:9 个点接近 10,漏水值为 64,平均值为 15.2。剔除:移除漏水值,平均值为 9.8。限制:将漏水值拉回到 14 处的围栏,平均值为 10.2

np.clip(a, low, high) 会限制整个数组中的值:

water = np.array([8, 11, 9, 10, 12, 9, 64, 10, 11, 8])
low, high = 6.0, 14.0  # IQR 的上下界
dropped = water[(water >= low) & (water <= high)]
capped = np.clip(water, low, high)
print(len(dropped), len(capped))
print(capped)

这会打印:

9 10
[ 8. 11.  9. 10. 12.  9. 14. 10. 11.  8.]

模型会追着这一个异常值跑,所以要在训练前做出决定。修正或删除拼写错误;保留真正的极端值,或限制它们的上限。不要悄悄删除:说明你修改了多少个。

challenge icon

挑战

中等

一款骑行应用记录了 15 次骑行的平均速度,保存在 speeds 中;其中两次看起来不太正常。起始代码已将 IQR 界限存入 low 和 high。

  1. 创建 dropped,保存界限内(包括界限值)的速度,并创建 capped。
  2. 分别打印一行,显示保留、剔除和封顶后的骑行次数、平均值及 .std(),并四舍五入到小数点后 2 位。
  3. 打印封顶处理改变了多少次骑行。

另一位骑手的 10 次骑行数据如下:

Keep: 10 rides, mean 21.38, std 6.58
Drop: 9 rides, mean 19.2, std 0.77
Cap: 10 rides, mean 19.45, std 1.04
Capping changed 1 of 10 rides

亲手试试

import numpy as np


# 返回数组的 IQR 下界和上界
def iqr_fences(a):
    q1 = np.percentile(a, 25)
    q3 = np.percentile(a, 75)
    iqr = q3 - q1
    return q1 - 1.5 * iqr, q3 + 1.5 * iqr


speeds = np.array([24.5, 22.8, 26.1, 23.9, 3.1, 25.4, 21.7, 24.2, 27.3, 78.4, 23.1, 25.8, 22.4, 24.9, 26.6])
low, high = iqr_fences(speeds)

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

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

机器学习统计学中的所有课

自己练习: Python 在线编译器