7.5特征工程进阶
本章学习目标:
- 理解特征工程的本质:从原始数据中提取对预测更有帮助的信息
- 掌握特征交叉、统计特征、时间特征等进阶构造方法
- 了解特征选择的方法(方差阈值、相关性过滤、特征重要性)
- 了解降维的基本思想(PCA是什么、什么时候用)
- 核心能力:知道“特征决定了模型效果的上限”
一、什么是特征工程?
1.1 一个经典比喻
“数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。”
类比做菜:
| 步骤 | 机器学习 | 做菜 |
|---|---|---|
| 原料 | 原始数据 | 食材 |
| 特征工程 | 洗菜、切菜、调味 | 处理食材 |
| 建模 | 烹饪 | 炒菜 |
没有好的特征,再好的模型也白搭。
1.2 特征工程的定义
特征工程:将原始数据转化为更能代表问题本质的输入特征的过程。
| 阶段 | 内容 | 目的 |
|---|---|---|
| 特征提取 | 从原始数据中提取信息 | 获取基础特征 |
| 特征构造 | 创造新特征 | 提升模型表达能力 |
| 特征选择 | 筛选有用的特征 | 减少噪音和冗余 |
| 降维 | 压缩特征维度 | 加速训练、可视化 |
1.3 好的特征 vs 坏的特征
| 好特征 | 坏特征 |
|---|---|
| 与目标变量强相关 | 与目标变量无关 |
| 数据质量高、完整 | 大量缺失、错误 |
| 业务可解释 | 业务说不通 |
| 预测时可获取 | 预测时才产生 |
注意:匿名特征(如v_3)虽然业务说不通,但预测效果好,也要保留。
二、特征构造
2.1 数值特征变换
为什么要做变换? 让数据分布更接近模型假设,或让特征更有业务意义。
| 变换类型 | 公式 | 作用 | 适用场景 |
|---|---|---|---|
| 对数变换 | log(x) | 压缩偏态分布 | 价格、收入等右偏数据 |
| 平方根变换 | √x | 轻度压缩 | 计数数据 |
| Box-Cox变换 | 自动选择最佳λ | 让数据更接近正态 | 通用 |
| 标准化 | (x-μ)/σ | 均值0,标准差1 | 线性模型、距离计算 |
| 归一化 | (x-min)/(max-min) | 范围[0,1] | 神经网络、固定范围 |
实战案例:二手车价格
# 二手车价格严重右偏,直接建模效果差
# 对价格做对数变换
log_price = log(price)
# 变换后的分布更接近正态分布,模型效果更好
2.2 组合特征
核心思想:两个特征组合起来,可能比单独使用更有预测力。
| 组合类型 | 构造方式 | 业务含义 | 例子 |
|---|---|---|---|
| 算术组合 | A + B, A - B, A × B, A ÷ B | 两个因素的联合效应 | 功率/车重(比功率) |
| 交互特征 | 类别A × 数值B | 不同类别有不同斜率 | 品牌 × 车龄 |
| 比例特征 | A / (A+B) | 占比、结构 | 手机消费占比 |
实战案例:二手车
| 原始特征 | 构造特征 | 业务含义 |
|---|---|---|
| 功率、车重 | 功率/车重(比功率) | 动力性能更准确 |
| 价格、里程 | 价格/里程(每公里价格) | 性价比指标 |
| 车龄、品牌 | 品牌 × 车龄交互 | 不同品牌折旧率不同 |
2.3 统计特征
核心思想:用分组统计量作为新特征,捕捉群体行为。
| 统计量 | 构造方式 | 业务含义 |
|---|---|---|
| 均值 | 按品牌分组,计算该品牌的平均价格 | 该品牌的基准价格 |
| 中位数 | 按车型分组,计算中位数价格 | 更稳健的基准 |
| 标准差 | 按品牌分组,计算价格标准差 | 该品牌价格波动 |
| 计数 | 按用户分组,统计购买次数 | 用户活跃度 |
| 排名 | 按价格排名,算出百分位 | 相对位置 |
2.4 时间特征
核心思想:从时间戳中提取周期性信息。
| 提取类型 | 示例 | 业务含义 |
|---|---|---|
| 绝对时间 | 年、月、日、小时 | 季节性、趋势 |
| 相对时间 | 距离今天的天数 | 新鲜度、车龄 |
| 周期特征 | 星期几、是否周末、是否节假日 | 周期性行为 |
| 时间差 | 两个事件之间的天数 | 间隔、周期 |
| 时间分段 | 凌晨/上午/下午/晚上 | 时段偏好 |
实战案例:用户最后一次使用距今天数
# 用户活跃度:天数越小越活跃
# 用于流失预测模型中
recency_days = (current_date - last_visit_date).days
2.5 分箱/分桶
核心思想:把连续数值离散化成几个区间,捕捉非线性关系。
| 分箱方式 | 方法 | 适用场景 |
|---|---|---|
| 等距分箱 | 按数值范围等分 | 分布均匀 |
| 等频分箱 | 按百分位数分,每箱样本数相同 | 分布不均匀 |
| 自定义分箱 | 按业务含义分 | 有业务阈值 |
示例:车龄分箱
# 连续车龄:1.2年, 3.5年, 5.8年...
# ↓ 分箱后
# 车龄分段:1年内, 1-3年, 3-5年, 5-8年, 8年以上
# 业务价值:不同区间的折旧率不同
# 1-3年:贬值快
# 5年以上:贬值慢
2.6 编码
核心思想:为类别变量创造能参与数学表示的数值格式。
| 编码方法 | 原理 | 适用场景 |
|---|---|---|
| 独热编码 | 每个类别一列0/1 | 类别无序、类别数少(<10) |
| 标签编码 | 每个类别一个数字 | 树模型可以处理,线性模型慎用 |
| 目标编码 | 用目标变量的均值代替 | 类别数多、与目标相关 |
| 频次编码 | 用类别的出现次数代替 | 类别数多、反映流行度 |
关于数据泄露的特别重要提醒:
目标编码和频次编码必须仅在训练集上计算,然后应用于验证集和测试集——绝不能用全数据集计算后划分,否则会把未来的信息泄露给模型,造成严重的数据泄露(见7.1节)。
| 特征工程方法 | 数据泄露风险 | 正确做法 |
|---|---|---|
| 独热编码 | ✅ 安全 | 可在全数据集上计算 |
| 标签编码 | ✅ 安全 | 可在全数据集上计算 |
| 频次编码 | ⚠️ 有风险 | 必须只在训练集计算 |
| 目标编码 | ⚠️ 有风险 | 必须只在训练集计算 |
三、特征选择
3.1 为什么要做特征选择?
| 问题 | 后果 |
|---|---|
| 特征太多 | 训练慢、内存大、易过拟合 |
| 无关特征 | 引入噪音,降低效果 |
| 冗余特征 | 多重共线性,模型不稳定 |
3.2 特征选择三大类方法
| 方法类型 | 原理 | 例子 |
|---|---|---|
| 过滤法 | 根据统计指标筛选,独立于模型 | 方差阈值、相关系数 |
| 包裹法 | 用模型评估特征子集好坏 | 递归特征消除 |
| 嵌入法 | 模型训练时自动选择 | L1正则化、树模型重要性 |
3.3 过滤法
方法一:方差阈值
删除方差极小的特征(取值几乎不变)。
特征A:0,0,0,0,0,0,1,0,0(方差小 → 删除)
特征B:0,1,0,1,0,1,0,1,0(方差大 → 保留)
方法二:相关系数
与目标变量相关系数低的特征可以删除(但注意:相关系数只检测线性关系)。
| 相关系数 | 判断 |
|---|---|
| > 0.5 或 < -0.5 | 保留 |
| 0.1 ~ 0.5 | 可保留,建模后看重要性 |
| < 0.1 | 可尝试删除(先验证) |
3.4 嵌入法
树模型特征重要性(最常用、最推荐)。
随机森林/决策树/GDBT训练后会输出每个特征的重要性分数(参考7.2节案例)。
| 重要性 | 操作 |
|---|---|
| 高(>0.05) | 必须保留 |
| 中(0.01-0.05) | 可保留,效果影响不大 |
| 低(<0.01) | 可尝试删除 |
3.5 三种方法对比
| 方法 | 速度 | 考虑特征交互 | 依赖模型 | 推荐场景 |
|---|---|---|---|---|
| 过滤法 | 快 | 否 | 否 | 初筛 |
| 包裹法 | 慢 | 是 | 是 | 追求极致效果 |
| 嵌入法 | 中 | 是 | 是 | 通用首选 |
四、降维:PCA主成分分析
4.1 为什么需要降维?
| 场景 | 问题 | 降维的作用 |
|---|---|---|
| 高维数据(>100列) | 训练慢、过拟合 | 压缩维度 |
| 特征高度相关 | 多重共线性 | 去除冗余 |
| 需要可视化 | 无法画高维图 | 降到2D/3D |
4.2 PCA的核心思想
一句话概括:找数据中信息量最大的几个方向。
类比:给一个立方体拍照,从不同角度拍。正面能看到长和高,侧面能看到宽和高,俯视能看到长和宽。如果要理解这个立方体,需要几张照片?如果只能拍一张,哪张信息量最大?
PCA:自动找到“信息量最大”的视角。
4.3 PCA的工作原理
原来有50个特征
↓ PCA
压缩成10个“主成分”(每个是原特征的加权组合)
↓
保留90%以上的信息量
# 假设原始数据有50个特征,PCA降维到10维
# 解释方差比例 = 0.92(保留了92%的信息)
4.4 什么时候用PCA?
| 适合 | 不适合 |
|---|---|
| 特征高度相关 | 需要特征可解释 |
| 维度太高(>100) | 类别特征太多 |
| 做可视化(降到2-3维) | 小数据集 |
| 线性模型 | 特征含义需要明确 |
注意:树模型(决策树、随机森林)对高维不敏感,一般不需要PCA。
五、特征工程工作流
第1步:从原始数据提取基础特征
↓
第2步:构造新特征(组合、统计、时间等)
↓
第3步:编码类别特征
↓
第4步:数值特征变换(标准化/归一化)
↓
第5步:特征选择(删除低重要性特征)
↓
第6步:迭代验证(清洗→构造→训练→评估)
实战案例:二手车特征工程流程
| 步骤 | 操作 | 新增特征数 |
|---|---|---|
| 基础特征 | 车龄、里程、功率、品牌、变速箱 | 10个 |
| 特征构造 | 车龄分段、品牌×车龄交互、价格/里程比 | +8个 |
| 编码 | 品牌、车型独热编码 | +15个 |
| 特征选择 | 随机森林重要性筛选 | 保留18个 |
六、如何向AI描述特征工程需求
| 你的需求 | 你应该这样告诉AI |
|---|---|
| 构造组合特征 | “创建新特征:power_per_weight = 功率 / 车重” |
| 对数变换 | “对价格做对数变换,新列叫log_price” |
| 分箱 | “把车龄分成5段:1年/1-3年/3-5年/5-8年/8年以上” |
| 时间差 | “计算注册日期到交易日期的时间差(天数),作为车龄” |
| 特征选择 | “用随机森林的特征重要性,删掉重要性低于0.01的特征” |
| PCA降维 | “对50个数值特征做PCA,降到10维,保留90%方差” |
| 编码 | “对品牌列做独热编码,对车型做频次编码” |
| 缺失处理 | “对燃油类型缺失值用众数填充” |
七、本章总结
特征工程核心心法
“特征决定了模型效果的上限。与其花时间调参,不如花时间构造更好的特征。”
特征构造速记
| 类型 | 方法 | 例子 |
|---|---|---|
| 变换 | log、sqrt、标准化 | log(价格) |
| 组合 | +、-、×、÷ | 功率/车重 |
| 统计 | 均值、计数、排名 | 品牌平均价格 |
| 时间 | 差值、周期性 | 注册到交易的天数 |
| 分箱 | 等距、等频、自定义 | 车龄分段 |
特征选择速记
| 方法 | 原理 | 何时用 |
|---|---|---|
| 方差阈值 | 删除不变的 | 初筛 |
| 相关系数 | 过滤无关的 | 快速筛选 |
| 特征重要性 | 模型自动排序 | 通用首选 |
PCA速记
| 场景 | 推荐 |
|---|---|
| 需要可视化 | ✅ 降到2-3维 |
| 高维线性模型 | ✅ 考虑使用 |
| 树模型 | ❌ 不需要 |
| 需要特征解释 | ❌ 不适合 |
八、思考题
-
为什么说“特征决定了模型效果的上限,模型只是逼近这个上限”?
-
车龄(连续值)和车龄分段(分箱),在树模型中哪个效果更好?为什么?
-
如果你想创建一个“性价比”特征,你会用哪两个原始特征组合?计算公式是什么?
-
特征选择时,发现两个特征相关系数为0.95。你会怎么处理?为什么?
-
在什么场景下,你宁愿保留50个原始特征而不是用PCA压缩成10个主成分?
下一节预告:第8部分 时间序列分析 —— 如何处理带时间戳的数据?预测明天的销量?
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)