Menu
CoddyTech

Z 分数规则

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

某农场称了 300 个鸡蛋,随后手动输入了两个重量:6.2 g 和 94.6 g,但这两个都是输错的。它们的z 分数(与平均值的距离,以标准差为单位)暴露了问题:

300 个鸡蛋重量的 z 分数直方图,所有数据都在 -3 到 3 之间,位于标注为 3 个标准差以内的阴影区域中。两个红点远远超出该区域:6.2 g 对应 z = -9.9,94.6 g 对应 z = 6.3

np.abs 会去掉负号,因此一次比较就能捕捉到两侧的值:

rng = np.random.default_rng(3)
eggs = np.concatenate([rng.normal(60, 4, size=300), np.array([6.2, 94.6])])
z = (eggs - eggs.mean()) / eggs.std()
print(np.abs(np.array([-4, 2, -1])))
print(eggs[np.abs(z) > 3])

这会打印:

[4 2 1]
[ 6.2 94.6]

在钟形分布的数据中,99.7% 的值位于 3 个标准差以内,因此 np.abs(z) > 3 会标记出训练前需要检查的罕见值。

但离群值会使标准差变大,因此小样本中不容易发现它:这时使用 IQR 规则。

challenge icon

挑战

中等

面包店的秤称了 250 个面包,并将它们放入 loaves,另外 3 个面包则是手动输入的。程序会读取一个阈值。

  1. 使用数组的 .mean() 和 .std() 计算每个面包的 z 分数。
  2. 按位置顺序,打印 z 分数与 0 的距离大于阈值的每个面包:包括它的位置、重量(保留 1 位小数)和 z 分数(保留 2 位小数)。
  3. 打印你列出的面包数量。

换一天,阈值为 3 时:

Loaf 200: 702.5 g, z = -5.38
Loaf 201: 889.3 g, z = 4.91
Loaves to re-weigh: 2

亲手试试

import numpy as np

# 不要修改下面的代码:前 250 个面包的重量由秤测得,后 3 个重量是手动输入的。
rng = np.random.default_rng(25)
loaves = np.concatenate([rng.normal(800, 15, size=250), np.array([731.4, 868.9, 912.3])])
cutoff = float(input())

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

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

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

自己练习: Python 在线编译器