Z 分数规则
本课属于 Coddy Machine Learning 学习旅程的“机器学习统计学”单元。第 26 课,共 64 课。
某农场称了 300 个鸡蛋,随后手动输入了两个重量:6.2 g 和 94.6 g,但这两个都是输错的。它们的z 分数(与平均值的距离,以标准差为单位)暴露了问题:
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 规则。
挑战
中等面包店的秤称了 250 个面包,并将它们放入 loaves,另外 3 个面包则是手动输入的。程序会读取一个阈值。
- 使用数组的
.mean()和.std()计算每个面包的 z 分数。 - 按位置顺序,打印 z 分数与 0 的距离大于阈值的每个面包:包括它的位置、重量(保留 1 位小数)和 z 分数(保留 2 位小数)。
- 打印你列出的面包数量。
换一天,阈值为 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())
# 在下面编写你的代码。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
机器学习统计学中的所有课
自己练习: Python 在线编译器