Menu
CoddyTech

标准化

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

当每个特征都以 0 为中心、标准差为 1 时,许多模型的学习效果最好。标准化就是这样做的:每个值都会转换为它所在列中的 z 分数。

5 个南瓜,重量单位为 kg,宽度单位为 cm:

两行点分别位于一条标准差刻度尺上:5 个南瓜的重量从 8 到 40 kg,宽度从 30 到 65 cm,每行都以各自的均值 0 为中心,所有点都在 -1.6 到 1.6 之间

广播机制会一次性标准化所有列:

pumpkins = np.array([[30, 60],
                     [8, 30],
                     [22, 55],
                     [40, 65],
                     [15, 40]])
z = (pumpkins - pumpkins.mean(axis=0)) / pumpkins.std(axis=0)
print(np.round(z.mean(axis=0), 2))
print(np.round(z.std(axis=0), 2))

这会打印:

[0. 0.]
[1. 1.]

检查前先进行舍入:未舍入时,平均值为 0 可能会显示为 2.22044605e-17,这是微小的舍入误差。

与 min-max 不同,这里没有固定范围:大多数值都在 -2 到 2 之间。

challenge icon

挑战

中等

一个奶牛场发现了几头不寻常的奶牛。cows 的每一行代表一头奶牛:features 中列出它的产奶量(每天多少升)、体重(kg)和年龄(年)。程序会读取奶牛的位置 k。

  1. 完成 standardize(X)。检查代码行随后会输出 [0. 0. 0.] 和 [1. 1. 1.]。
  2. 找出奶牛 k 的 z 分数中与 0 相差最远的一个,不考虑正负号,并按下面的格式输出,保留 2 位小数。

对于另一家农场的奶牛:

Column means: [0. 0. 0.]
Column stds: [1. 1. 1.]
Cow 2 stands out by weight: 1.76 std above the herd

亲手试试

import numpy as np

features = ["milk", "weight", "age"]
# 每头奶牛占一行:产奶量以升/天为单位,体重以 kg 为单位,年龄以岁为单位
cows = np.array([[28, 610, 6],
                 [22, 540, 3],
                 [35, 680, 6],
                 [31, 590, 9],
                 [19, 650, 4],
                 [26, 520, 2],
                 [30, 600, 7]])
k = int(input())


# 返回每列都经过标准化的 X:均值为 0,标准差为 1
def standardize(X):
    # 将下面这行替换为标准化代码
    return X


# 不要修改下面三行:它们会检查你的函数
z = standardize(cows)
print("Column means:", np.round(z.mean(axis=0), 2))
print("Column stds:", np.round(z.std(axis=0), 2))

# 在下方编写代码:奶牛 k 有什么特别之处?
quiz icon自我测试

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

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

自己练习: Python 在线编译器