6-3缺失值插补与特征衍生(多项式特征)
📌 一、 课程导入(5 分钟)
情景模拟:老师收作业,有人没交怎么办?
假设老师统计全班同学的“身高”和“体重”来做体育成绩预测。 课代表收上来的表格是这样的:
| 姓名 | 身高 (cm) | 体重 (kg) |
|---|---|---|
| 小明 | 170 | 65 |
| 小红 | NaN (空) | 55 |
| 小刚 | 180 | NaN (空) |
问题来了:
- 如果直接把这两行空数据删掉,小红和小刚的训练样本就浪费了(太可惜)。
- 如果什么都不填,代码直接报错(机器学习模型不接受空值)。
引出解决方案:我们必须用科学的方法“猜”出一个合理的数填进去。这叫 缺失值插补。
第二个问题(预告造武器): 如果我们只有“房间长度”和“房间宽度”预测房价,模型只能看到两个孤立的数。但如果老师告诉你,“长 × 宽 = 面积”,面积才是决定房价的关键!怎么办? 引出解决方案:我们自己动手,用现有的特征相乘,造出新的特征!这叫 生成多项式特征。
- 👨🏫 教师活动:展示带空格的表格,提问:“如果让你给小红的体重填个数,你凭直觉填多少?”(学生凭直觉会说平均值 60)。
- 🧑🎓 学生活动:学生积极回应填平均值。老师顺势引出“插补”概念。接着再问“长和宽那个例子”,激发造新特征的兴趣。
利用“收作业”这个职高学生极其熟悉的场景,立刻化解对“缺失值”的恐惧。再用“长×宽”的朴素常识,让学生理解“特征衍生”并非高深数学,而是生活常识。
📖 二、 解决问题过程(一):缺失值插补——填坑的艺术
1. 先体检:如何发现空值(NaN)?
在 Pandas 中,空值显示为 NaN(Not a Number)。
2. 三大插补策略(重点!)
| 策略 | 代码 | 适用场景 | 优点/缺点 |
|---|---|---|---|
| 均值填充 | SimpleImputer(strategy='mean') |
数据分布对称,无明显异常值 | 简单,但受极端值影响大 |
| 中位数填充 | SimpleImputer(strategy='median') |
数据有明显异常值(如收入) | 稳健,不被马云拉偏 |
| 众数填充 | SimpleImputer(strategy='most_frequent') |
类别型数据(如性别、颜色) | 填出现次数最多的那个值 |
3. 核心代码模板(工业级标准) 职高学生必记口诀:先 fit 训练集,再 transform 训练集和测试集!
⚠️ 血泪警示(数据泄露):绝对禁止先填充全部数据再划分训练集/测试集!那样测试集的均值会偷偷影响训练集,导致模型评估虚高(作弊)!
- 👨🏫 教师活动:
- 重点在黑板强调
fit和transform的分离。 - 演示如果先填充再分集(错误做法)和先分集再填充(正确做法)的区别。
- 重点在黑板强调
- 🧑🎓 学生活动:
- 学生观察
imputer.statistics_的输出,验证它只算了训练集的平均值。 - 学生讨论:“如果测试集有一个缺失值,但训练集没有缺失值,
fit还能用吗?”(答案:能用,因为fit算出均值存着,随时可用)。
- 学生观察
代码模板直接给,不绕弯子。重点不是讲统计学,而是讲 “防止数据泄露” 的工程红线,这是职高生进入企业最容易挨骂的细节。
💻 三、 解决问题过程(二):生成多项式特征——无中生有造武器
1. 核心思想:特征之间的“乘法”和“平方” 线性回归模型只能看到:\( y = w_1 x_1 + w_2 x_2 + b \)。 如果真实规律是 \( y = x_1^2 + x_1 x_2 \)(比如房价受“面积=长×宽”影响),线性模型就抓瞎了。
解决方案:我们手动给数据增加几列,把 \( x_1^2 \) 和 \( x_1 x_2 \) 当作新的特征喂给模型。
2. 生活化类比(厨房调料) 只有“盐”(\( x_1 \))和“醋”(\( x_2 \))两种调料,味道太单调。 多项式特征就是允许你把它们混合成“糖醋汁”(\( x_1 x_2 \))和“超级咸”(\( x_1^2 \)),菜品的味道(模型效果)瞬间上升一个档次!
3. 代码实战(PolynomialFeatures)
运行结果解读:
原始 [长, 宽] 变成了 [长, 宽, 长^2, 长×宽, 宽^2]。
| 长 | 宽 | → | 长 | 宽 | 长² | 长×宽 | 宽² |
|---|---|---|---|---|---|---|---|
| 2 | 3 | → | 2 | 3 | 4 | 6 | 9 |
4. 适用场景与警告
- 适合:特征极少(比如只有2-3个特征),且你怀疑它们之间存在交互关系(如面积、加速度)。
- 警告(铁律):
degree=2会让特征数从n变成n + n + ...(爆炸增长)。如果原始有 10 个特征,degree=3 会变成上百个特征!特征太多容易过拟合(下一章正则化会解决这个问题)。
- 👨🏫 教师活动:
- 在黑板上演算:
(2,3)是如何变成(2,3,4,6,9)的,告诉学生这就是乘法分配律。 - 强调
include_bias=False(不要那列全是1的常数项,交给模型自己去算截距)。
- 在黑板上演算:
- 🧑🎓 学生活动:
- 学生手动填写:如果原始是
(1, 5),转换后是多少?答案:(1, 5, 1, 5, 25)。 - 学生运行
X_poly.shape观察形状变化,直观感受特征变多了。
- 学生手动填写:如果原始是
用“糖醋汁”的比喻让“交叉项”变得极其通俗。重点让学生感受 fit_transform 后矩阵“变胖”了,并记住“多项式能治线性模型的傻病”。
✍️ 四、 解决问题过程(三):课堂实战——“二手房价预测”预处理流水线
📝 五、 课堂小结(5 分钟)
flowchart LR
root["🧹 预处理(三) 填坑与造武器"]
subgraph C1 ["🕳️ 缺失值插补"]
direction TB
A1["检测: isnull() / info()"]
A2["均值 (mean) -> 无异常值"]
A3["中位数 (median) -> 有异常值"]
A4["众数 (most_frequent) -> 类别型"]
A5["⚠️ 铁律:只 fit 训练集!"]
end
subgraph C2 ["🔧 生成多项式特征"]
direction TB
B1["目的:捕捉交互与非线性"]
B2["公式: [a,b] -> [a,b,a²,ab,b²]"]
B3["代码: PolynomialFeatures"]
B4["⚠️ 警告:特征爆炸,易过拟合"]
end
root --> C1
root --> C2
style root fill:#4b6cb7,stroke:#253b6e,color:#fff
style C1 fill:#e3f2fd,stroke:#2196f3
style C2 fill:#fff3e0,stroke:#ff9800
✏️ 随堂检测与互动练习
📮 六、 课后作业与拓展
📋 七、 板书设计
本课用到的单词
| 单词 | 发音 | 专业英语解释(中文) |
|---|---|---|
| Imputation | /ˌɪmpjʊˈteɪʃən/ | 插补。指用统计值(如均值、中位数)替换缺失值的过程。 |
| Missing Value | /ˈmɪsɪŋ ˈvæljuː/ | 缺失值。数据集中未被记录或不可用的数值,通常表示为 NaN。 |
| Median | /ˈmiːdiən/ | 中位数。将数据排序后位于中间的值,对极端异常值不敏感。 |
| Polynomial | /ˌpɑːliˈnoʊmiəl/ | 多项式。由常数、变量和指数组成的数学表达式(如 x² + xy)。 |
| Interaction Term | /ˌɪntərˈækʃən tɜːrm/ | 交互项。两个不同特征相乘生成的新特征,表示它们之间的联合影响。 |
| Data Leakage | /ˈdeɪtə ˈliːkɪdʒ/ | 数据泄露。在训练模型时,测试集的信息意外地泄露给了训练集,导致评估结果不真实。 |
| Feature Engineering | /ˈfiːtʃər ˌendʒɪˈnɪrɪŋ/ | 特征工程。将原始数据转化为更能代表问题本质的特征的过程。 |