本章学习目标

  • 理解特征工程的本质:从原始数据中提取对预测更有帮助的信息
  • 掌握特征交叉、统计特征、时间特征等进阶构造方法
  • 了解特征选择的方法(方差阈值、相关性过滤、特征重要性)
  • 了解降维的基本思想(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维
高维线性模型 ✅ 考虑使用
树模型 ❌ 不需要
需要特征解释 ❌ 不适合

八、思考题

  1. 为什么说“特征决定了模型效果的上限,模型只是逼近这个上限”?

  2. 车龄(连续值)和车龄分段(分箱),在树模型中哪个效果更好?为什么?

  3. 如果你想创建一个“性价比”特征,你会用哪两个原始特征组合?计算公式是什么?

  4. 特征选择时,发现两个特征相关系数为0.95。你会怎么处理?为什么?

  5. 在什么场景下,你宁愿保留50个原始特征而不是用PCA压缩成10个主成分?


下一节预告:第8部分 时间序列分析 —— 如何处理带时间戳的数据?预测明天的销量?

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐