领域、比率、多项式与交互特征
把原始字段组合为更贴近任务机制的特征,让简单模型也能表达有意义的非线性关系。
学习前需要掌握
背景与问题
原始列不一定直接表达任务关心的关系。总消费额与订单数分别有用,但客单价、变化率或交互项可能更直接反映某种模式;这些变换应来自可解释的问题结构。
构造新特征也可能制造错误,例如分母为零、未来信息进入聚合、不同单位混算,以及高阶展开带来过多自由度。
概念定义
特征构造用预测时可用的原始信息,通过领域变换、组合、比例或展开产生新的表示。它不同于从现有列中筛选子集的特征选择,虽然两者可以组合。
一个特征需要同时有数学定义与业务可用性:哪段时间、哪些记录、什么单位、缺失或零值怎样处理,都属于定义。
直观理解
把“总量”拆成“次数×平均水平”,可能让模型更容易区分不同类型的用户。但当次数为零时,平均水平没有定义,不能为了让程序跑通就偷偷把分母改为 1。
比率的零分母与二阶展开
构造三名用户的消费额 [100,0,90]、订单数 [4,0,3]。客单价应为 [25,未定义,30],第二名用户的零消费并不能让 0/0 成为一个已观测均值。
另取两项特征 [2,3],不含常数列的二阶展开为 [2,3,4,6,9]:原值、各自平方与交互项。输入两列变成五列,说明增加表达能力也会增加模型需要处理的维度。
核心原理
领域特征应说明机制或假设,并在固定验证协议下检验是否提供增量信息。看起来容易解释不等于必然有预测价值,也不等于具有因果作用。
比率需要处理零分母、异常值和单位;滚动统计需要限定时间与可用范围。对于缺失比率,可以保留缺失和指示,而不是不加说明地赋为普通零。
多项式和交互项能让线性参数模型表达弯曲或联合效应,但维度会随原始特征数和阶数快速增长,需要考虑正则化、计算成本和泛化。
数据驱动的构造参数与后续选择仍应在训练边界内学习。构造前就使用测试集的分位数、目标或未来聚合,会使后续比较失去独立性。
数学表达
特征映射
模型实际学习转换后的特征。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1从任务机制提出候选特征。
- 2处理分母为零和单位。
- 3在训练/预测共享的函数中实现。
- 4将变换放入 Pipeline。
代码对应位置
示例 1显式保留未定义比率并检查展开结果:避免用分母钳制掩盖缺失语义。
二阶示例
交互项表达共同作用,平方项表达曲率。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1从任务机制提出候选特征。
- 2处理分母为零和单位。
- 3在训练/预测共享的函数中实现。
- 4将变换放入 Pipeline。
代码对应位置
示例 1显式保留未定义比率并检查展开结果:避免用分母钳制掩盖缺失语义。
计算与实现步骤
- 从任务机制提出候选特征。
- 处理分母为零和单位。
- 在训练/预测共享的函数中实现。
- 将变换放入 Pipeline。
- 比较基线与新增特征的交叉验证结果。
- 检查维度、稳定性和泄漏。
代码实现
示例 1
显式保留未定义比率并检查展开结果
example_01.py用途:避免用分母钳制掩盖缺失语义。
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
spending = np.array([100., 0., 90.])
orders = np.array([4., 0., 3.])
average = np.divide(spending, orders, out=np.full(3, np.nan), where=orders > 0)
poly = PolynomialFeatures(degree=2, include_bias=False)
print("average:", average.tolist())
print("poly:", poly.fit_transform([[2., 3.]]).tolist())代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
避免用分母钳制掩盖缺失语义。
Step 1 · 1–8 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
spending = np.array([100., 0., 90.])
orders = np.array([4., 0., 3.])
average = np.divide(spending, orders, out=np.full(3, np.nan), where=orders > 0)
poly = PolynomialFeatures(degree=2, include_bias=False)
print("average:", average.tolist())
print("poly:", poly.fit_transform([[2., 3.]]).tolist())预期输出或运行结果
average: [25.0, nan, 30.0] poly: [[2.0, 3.0, 4.0, 6.0, 9.0]]
常见错误 · 3 条
- 构造预测时不存在的特征
- 高阶展开导致维度爆炸
- 相关性被误当因果
实际应用
- 房价比率特征
- 用户行为强度
- 非线性回归
常见错误
- 构造预测时不存在的特征
- 高阶展开导致维度爆炸
- 相关性被误当因果
推荐学习资料
参考库不会生成虚假资源或无效外部链接。