Menu
CoddyTech

StandardScaler

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

每个新样本都必须按照训练数据的缩放方式进行缩放。scikit-learn 的 StandardScaler 会进行标准化,并记住具体的缩放方式:

示意图:一位窗户清洁工过去 4 份工作的数据 X_train 经过 fit,传入一个缩放器。缩放器会记住 mean_ 为 8 和 22,scale_ 为 4.47 和 9.72。一份新工作的数据 8 和 30 经过 transform,使用这些数值进行转换,结果为 0.00 和 0.82

在代码中,每项工作由清洁的窗户数量和耗时分钟数表示:

from sklearn.preprocessing import StandardScaler

X_train = np.array([[2, 8], [10, 25], [6, 20], [14, 35]])
scaler = StandardScaler()
scaler.fit(X_train)
X_new = np.array([[8, 30]])  # 一个样本:只有一行的表
print(np.round(scaler.transform(X_new), 2))

这会打印:

[[0.   0.82]]

fit会学习每一列的均值和标准差(除以 n,与 np.std 一样),并将它们保存在 scaler.mean_ 和 scaler.scale_ 中。transform 会应用这些值。

绝不要在新数据上拟合:这样得到的均值会是数据自身的均值,结果会变成 [[0. 0.]]。对于训练数据,fit_transform 会在一次调用中完成这两步。

challenge icon

挑战

中等

一个分类器从 X_train 中的牛油果数据学到了重量、硬度和采摘后的天数。程序将一个新的牛油果读入只有一行的表 new_avocado,但起始代码的缩放结果对每个牛油果都显示为 [[0. 0. 0.]]。

  1. 修复它:使用训练数据的均值和标准差缩放新牛油果。
  2. 统计它的测量值中,与训练数据均值相差超过 2 个标准差的数量,无论偏高还是偏低,并按下面的格式打印。

对于另一批数据:

New avocado: [[2.98 0.   0.09]]
1 of 3 measurements are more than 2 std from the training avocados

亲手试试

import numpy as np
from sklearn.preprocessing import StandardScaler

# 训练用的牛油果,每行一个:重量(克)、硬度(1 到 10)、采摘后经过的天数
X_train = np.array([[210, 8, 2],
                    [185, 5, 6],
                    [240, 7, 3],
                    [170, 3, 9],
                    [225, 6, 5],
                    [195, 4, 7]])
# 传送带上的一个新牛油果
weight = float(input())
firmness = float(input())
days = float(input())
new_avocado = np.array([[weight, firmness, days]])

# 每个牛油果都会输出 [[0. 0. 0.]]:请修复这个问题
scaler = StandardScaler()
scaled = scaler.fit_transform(new_avocado)
print("New avocado:", np.round(scaled, 2))

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

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

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

自己练习: Python 在线编译器