单元四
第14课 标准化 StandardScaler 为何重要

一、任务目标
对比「未标准化」与「标准化」对近邻分类的影响。
二、核心概念讲清楚
StandardScaler 把特征变成均值约 0、方差约 1。务必在训练集上 fit,再 transform 训练/测试。
- fit 只在训练集做
- transform 用于 train 与 test
- 测试集不要单独重新 fit 一套均值方差(泄漏)
1划分数据先 split
2scaler.fit(X_train)学均值方差
3transform 两边得到缩放后的 X
4再训练模型用缩放后的特征
三、跟着想一遍(小例子)
身高 170、体重 60,量纲不同;标准化后两者对距离的贡献更均衡。
易错:用全体数据(含测试)fit scaler。
正确:只在 train 上 fit,再 transform test。
想一想:为什么测试集不能参与 fit scaler?(提示:考试不能偷看答案分布。)
四、解题思路
任务:对比「未标准化」与「标准化」对近邻分类的影响。 先想清楚:输入是什么、处理后得到什么、屏幕上应出现什么。
本课主要用到:屏幕输出。
- 1明确任务「对比「未标准化」与「标准化」对近邻分类的影响。」:运行后你希望看到什么结果(文字、图形或计算结果)。
- 2用 print 把结果说出来,确认屏幕上出现预期内容。
- 3对照参考代码跑通后,只改一个参数,观察结果如何变化。
流程示意(可对照左侧文字)
五、语句功能讲解
本课用到的 Mixly 图形块均已在前面的课讲过。请直接对照编程练习搭积木;若有遗忘,回到该积木首次出现的课页复习。
六、知识点讲解
特征缩放让不同量纲的特征可比;许多距离型/梯度型算法需要先缩放。
先弄清本课输入与输出,再进编程练习对照现象。
七、编程练习
先理解上面的例子,再在下方 Mixly 运行与检查(含 scikit-learn)。
对比两行正确率。
参考代码(对照抄写到下方 Mixly)
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
# 特征1:年龄;特征2:收入(数值大很多)
X = [[15, 1000], [16, 1200], [15, 1100], [40, 8000], [42, 8500], [41, 8200]]
y = [0, 0, 0, 1, 1, 1]
X_test = [[16, 1300], [41, 8100]]
y_test = [0, 1]
clf_raw = KNeighborsClassifier(n_neighbors=1).fit(X, y)
print("未标准化正确率:", accuracy_score(y_test, clf_raw.predict(X_test)))
scaler = StandardScaler()
X_s = scaler.fit_transform(X)
X_test_s = scaler.transform(X_test)
clf_s = KNeighborsClassifier(n_neighbors=1).fit(X_s, y)
print("标准化后正确率:", accuracy_score(y_test, clf_s.predict(X_test_s)))
正在载入编程环境
正在载入 Mixly 文本编程环境…
八、课堂练习
先完成两道正误判断,再做其余题目;选出后点「检查」。
判断:只抄参考代码,不看运行输出,也不改参数验证。
判断:先跑通,再对照「StandardScaler」改一处输入/参数,确认输出按预期变化;答错小测时读讲解。
对测试集应使用?
StandardScaler 主要帮助?
九、本节小结
特征量纲差太大时,先标准化再交给对距离敏感的模型。