6-2分类编码、二值化与非线性转换
📌 一、 课程导入(5 分钟)
复习上节课:我们学会了把“体重(kg)”和“时长(分钟)”缩放到同一量级。
新问题(灵魂拷问): 现在我们有一张“学生信息表”:
| 姓名 | 性别 | 班级 | 是否住校 |
|---|---|---|---|
| 张三 | 男 | 计应1班 | 是 |
| 李四 | 女 | 计应2班 | 否 |
问题:如果我们想把“性别”和“班级”作为特征输入给逻辑回归或 KNN 模型,直接把这些汉字扔进去,代码会直接报错!
思考:机器学习模型是个“数学计算器”,它只认识数字(整数和小数),完全不认识“男”“女”“计应1班”。
引出解决方案:我们必须把这些文本标签翻译成数字。这就是 分类特征编码。
- 👨🏫 教师活动:在 PPT 上展示学生信息表,提问:“如果让你给计算机设计规则,你怎么把‘男’和‘女’变成数字?”
- 🧑🎓 学生活动:学生本能回答“男=1,女=2”或“男=0,女=1”。老师先肯定这是最直接的办法,然后话锋一转——“但是这个简单粗暴的办法藏着大坑!” 吊起胃口。
从学生最熟悉的“班级花名册”切入,让他们意识到机器“不识字”的困境。通过肯定学生“男=1女=0”的直觉,再引出隐患,制造认知冲突。
📖 二、 解决问题过程(一):分类特征编码(核心难点攻克)
1. 场景模拟:给颜色编个号
假设特征“颜色”有 3 个取值:红、绿、蓝。
如果按照直觉编码:红=1,绿=2,蓝=3。
计算距离时:红(1)与绿(2)的距离是 1,红(1)与蓝(3)的距离是 2。
推导出的荒谬结论:模型会认为 “红色跟绿色更像,红色跟蓝色更不像” !
但在现实世界中,颜色只是“类别”,没有数学上的远近之分。红色并不比蓝色更接近绿色!
2. 解决方案 ①:独热编码(One-Hot Encoding) —— 解决“无序类别”的最佳方案
- 原理:一个类别有 N 种取值,就创建 N 个新的 0/1 特征列。
- 例子(红绿蓝):
- 红色 →
[1, 0, 0] - 绿色 →
[0, 1, 0] - 蓝色 →
[0, 0, 1]
- 红色 →
- 结论:任意两个颜色之间的距离都是 \( \sqrt{1^2+1^2} = \sqrt{2} \),绝对平等,没有谁比谁更近!
3. 代码实操(Pandas 一键生成)
4. 解决方案 ②:标签编码(Label Encoding) —— 只用于“有序类别”
- 什么时候用?当类别本身有明确的高低、等级顺序时。比如:
学历= 小学(0)、初中(1)、高中(2)、大学(3)。 - 代码:
from sklearn.preprocessing import LabelEncoder。但职高阶段强烈推荐优先使用独热编码,除非特征取值非常多(超过几十个)且有序。
- 👨🏫 教师活动:
- 在黑板上画出红绿蓝三角形,演示如果编码为 1,2,3 会变成一条直线(不公平),而独热编码变成三维空间三个顶点(平等)。
- 敲代码演示
pd.get_dummies,强调这行代码在职场中每天被使用成千上万次。
- 🧑🎓 学生活动:
- 小组讨论:“手机品牌(华为、小米、苹果)”和“衣服尺码(S、M、L)”分别应该用哪种编码?(答案:品牌用独热,尺码用标签)。
- 学生跟着敲代码,观察列名是如何从“颜色”变成“颜色_红”的。
通过“红绿蓝”的数学证明,彻底粉碎“男=0女=1就行了”的认知误区。让职高生记住一句话:“没有顺序的类别,必须独热!” 这是面试和工作中极易踩的坑。
💻 三、 解决问题过程(二):二值化与非线性转换(辅助技能)
1. 二值化(Binarizer)—— 把数字变成“是与否”开关
场景:预测学生是否玩游戏上瘾。特征“每日在线时长(分钟)”并不需要精确的 125 分钟,我们只关心“是否超过 2 小时(120 分钟)”。
- 操作:设定阈值,大于阈值的变为 1,小于等于的变为 0。
- 代码:
2. 非线性转换(对数变换)—— 收拾“极端大数”刺头
场景:分析居民收入。马云年收入 1 个亿(100000000),普通人年收入 5 万(50000)。
- 问题:如果直接做归一化,马云那个 1 亿会把所有普通人的收入压成接近 0,模型完全看不到普通人的差异。
- 对策:取对数 \( \log(数据) \),把巨大的差距压缩成较小的差距。
- 代码:
- 👨🏫 教师活动:
- 对于二值化,提问:“判断一个人是否成年(18岁),属于什么操作?”(答案:二值化)。
- 对于非线性转换,用“身高”举例:姚明太高,把其他人都显得矮了,取对数就像把姚明的腿锯掉一截拉到同一张图里对比(纯比喻,帮助学生理解压缩)。
- 🧑🎓 学生活动:
- 学生动手运行
Binarizer代码,修改阈值观察变化。 - 学生打印
log1p前后的数组形状,感受“大数变小”的神奇。
- 学生动手运行
这两块属于“锦上添花”的预处理技巧。不求全部记住,但要求学生在脑子里有个印象:“如果遇到 0/1 判断题用二值化,如果遇到有几个数字特别大,用 log 压一压。”
✍️ 四、 解决问题过程(三):课堂实战——清洗“二手汽车”数据
📝 五、 课堂小结(5 分钟)
flowchart LR
root["🧹 预处理(二) 把文本/奇葩数变数字"]
subgraph C1 ["🏷️ 分类编码(核心)"]
direction TB
A1["无序类别(颜色/品牌)"]
A2["👉 独热编码 (get_dummies)"]
A3["有序类别(学历/尺码)"]
A4["👉 标签编码 (LabelEncoder)"]
end
subgraph C2 ["🔌 二值化"]
direction TB
B1["数值 -> 0/1 开关"]
B2["阈值判断(超时/成年)"]
end
subgraph C3 ["📉 非线性转换"]
direction TB
C1["压缩极端大数"]
C2["log1p 让数据分布更集中"]
end
root --> C1
root --> C2
root --> C3
style root fill:#4b6cb7,stroke:#253b6e,color:#fff
style C1 fill:#e3f2fd,stroke:#2196f3
style C2 fill:#fff3e0,stroke:#ff9800
style C3 fill:#e8f5e9,stroke:#4caf50
✏️ 随堂检测与互动练习
📮 六、 课后作业与拓展
📋 七、 板书设计
本课用到的单词
| 单词 | 发音 | 专业英语解释(中文) |
|---|---|---|
| Encoding | /ɪnˈkoʊdɪŋ/ | 编码。将文本或分类数据转换为数值型数据的过程。 |
| One-Hot Encoding | /wʌn hoʊt ɪnˈkoʊdɪŋ/ | 独热编码。将无序分类变量扩展为多个二进制特征列的方法。 |
| Label Encoding | /ˈleɪbəl ɪnˈkoʊdɪŋ/ | 标签编码。将有序分类变量直接映射为整数 0, 1, 2… 的方法。 |
| Binarization | /ˌbaɪnəraɪˈzeɪʃən/ | 二值化。根据阈值将数值特征转换为 0 或 1 的过程。 |
| Log Transformation | /lɔːg ˌtrænsfərˈmeɪʃən/ | 对数变换。使用对数函数压缩数据尺度,常用于处理长尾分布的极端值。 |
| Dummy Variable | /ˈdʌmi ˈveriəbl/ | 虚拟变量。统计学中对独热编码后生成的 0/1 列的称呼。 |
| Threshold | /ˈθrɛʃhoʊld/ | 阈值(或"临界值")。在机器学习中,阈值用于决定模型输出属于哪个类别(如逻辑回归中概率 ≥ 0.5 判定为正类),或控制算法停止迭代的条件(如梯度下降的误差容限)。 |