什么是特征交叉(特征组合)?有什么作用?
简化版
特征交叉(Feature Crossing / 组合) 是把两个或多个特征组合成新特征,用来表达单个特征无法体现的交互关系。典型作用是给加法模型加入条件依赖,例如「城市×时段」。常见形式包括类别笛卡尔组合、数值乘积/比值/多项式,以及“类别指示变量×数值”形成分组斜率;分组历史统计是相关但还涉及聚合窗口的派生特征。代价是组合爆炸、稀疏和过拟合。树、FM/DCN/DeepFM 等能以不同归纳偏置学习交互,但不是无需验证的“自动发现全部高阶关系”。
详细版
常见交叉形式:
| 形式 | 例子 | 作用 |
|---|---|---|
| 类别 × 类别 | 城市_北京 & 时段_晚高峰 | 表达组合条件下的模式 |
| 数值 × 数值 | 身高/体重(BMI)、面积=长×宽 | 构造有业务含义的比值/乘积 |
| 数值 × 类别 | 收入 × 城市指示变量 | 让不同类别拥有不同数值斜率 |
| 多项式 | x₁², x₁x₂ | 线性模型拟合非线性 |
为什么有用: 很多目标依赖特征的组合而非单个特征。线性模型 w₁x₁ + w₂x₂ 无法表达「只有 x₁ 和 x₂ 同时满足时才怎样」这种交互,显式交叉把交互变成一个新特征,模型就能学它的权重。
代价: 组合数量呈乘积增长,高基数类别交叉后维度爆炸、极稀疏、易过拟合,需要特征选择或自动化方法控制。
完整版教学
一、为什么需要特征交叉——线性模型的「加法」表达不了「交互」
线性模型的预测是各特征的加权求和:
y = w₁·x₁ + w₂·x₂ + b
这意味着每个特征独立地、可加地影响结果——x₁ 的贡献和 x₂ 是多少无关。但现实里大量关系是交互(interaction)的:某个特征的效果取决于另一个特征的取值。
举例(打车需求预测):
- 单看「城市 = 北京」:需求中等。
- 单看「时段 = 晚高峰」:需求中等。
- 但「北京 且 晚高峰」:需求爆表。
这种「1+1 远大于 2」的效应,纯加法模型 w_城市 + w_时段 表达不了——它只会把两个中等相加得到「中等偏上」,抓不到爆发。把「城市×时段」显式组合成一个新特征,模型就能给「北京_晚高峰」这个组合单独学一个大权重,从而捕捉交互。这就是特征交叉的根本价值:把特征间的交互,变成模型能直接学习的显式特征。
二、类别 × 类别:笛卡尔组合
最常见的交叉,把两个类别特征的取值两两组合成新类别:
性别 ∈ {男, 女}
品类 ∈ {美妆, 数码, 母婴}
交叉后 → {男_美妆, 男_数码, 男_母婴, 女_美妆, 女_数码, 女_母婴}
在 CTR / 推荐里极其常用(如「用户性别 × 商品品类」「用户ID × 广告ID」)。它让模型能学到「特定人群对特定品类」的精细偏好,而不只是「男性整体」「美妆整体」。代价:组合数 = 两特征基数之积,高基数一交叉就维度爆炸、极其稀疏。
三、数值 × 数值:乘积、比值、多项式
- 有业务含义的组合最有价值:
BMI = 体重 / 身高²、面积 = 长 × 宽、客单价 = 金额 / 件数、点击率 = 点击 / 曝光。这些比原始特征更贴近目标。 - 多项式特征:自动生成
x₁²、x₂²、x₁x₂等,让线性模型能拟合二次曲面/交互项。sklearn 的PolynomialFeatures一键生成,但阶数一高维度就暴涨。
四、数值 × 类别,以及分组统计的边界
最直接的数值×类别交叉是把数值与类别的 One-Hot 指示变量相乘,使模型能为不同类别学习不同斜率。例如加入 收入×城市_北京 后,北京和其他城市不必共享同一个收入系数。
工程中也常按类别对历史数值做分组聚合,构造关联的派生特征:
- 「每个城市的平均消费」「每个品类的历史转化率」「每个用户过去 7 天的下单次数」。
- 本质是「类别 → 该类别下某数值的统计量(均值/计数/方差/最值)」,信息量大,是特征工程涨点利器。
- 注意防泄露:若聚合的是标签或预测时点之后的数据,必须 OOF/时间截断;若聚合的是预测时已知的普通协变量,当前样本参与是否不当取决于上线计算定义,不能一律等同于目标编码泄露。
五、工业界的自动化演进——从手工到神经网络
人工交叉靠经验、覆盖不全、还组合爆炸,于是有了自动学习交叉的一整条演进线(CTR 领域的经典脉络):
- 人工交叉 + LR:早期靠专家手工设计交叉特征喂逻辑回归,费人力、难穷尽。
- GBDT 自动交叉:树的一条「根到叶」路径本身就是多个特征的组合(
城市=北京 且 时段=晚高峰 且 ...),GBDT 能自动发现有用的高阶交叉。经典方案 GBDT + LR(Facebook)用 GBDT 叶子编号当交叉特征喂 LR。 - FM(因子分解机):给每个特征学一个隐向量,用隐向量内积表达任意两特征的二阶交叉,解决了高维稀疏下交叉特征学不动的问题(没共现过的组合也能靠隐向量泛化)。FFM 再引入 field 概念更精细。
- Wide & Deep / DeepFM / DCN:用不同网络结构表达隐式或显式交叉。Wide 侧记忆显式组合,Deep 侧学习非线性表示,DCN 显式构造交叉层;能否学到稳定高阶关系仍由数据、结构和正则决定。
理解这条线,就理解了「特征交叉」从手工特征工程一路走向模型自动化的历史。
六、代价与常见坑
- 组合爆炸 + 稀疏:类别交叉维度 = 基数之积,高基数交叉后维度巨大、样本在每个组合上极稀疏,很多组合只有个位数样本,学出来的权重不可信。
- 过拟合:稀疏的高阶交叉极易过拟合,需要正则化、特征选择、只保留高频组合、或用 FM/embedding 泛化。
- 数据泄露:分组统计、Target 类交叉必须防用到未来/自身信息。
- 树模型要不要手工交叉? 树路径能表达交互,因此显式交叉常不如在线性模型中必要;但受深度、样本和约束限制,有业务含义的比值或聚合仍可能有增益,应通过消融判断。
七、用数字和工程流程校验理解
线性模型 w1×城市 + w2×设备 只能叠加两个主效应;加入 城市=上海 × 设备=iOS 交叉项后,才可单独学习该组合。若城市 100 类、设备 20 类,完整笛卡尔交叉最多产生 2000 个类别,稀疏与过拟合风险随之上升。
| 对象/方案 | 核心机制 | 选择或风险 |
|---|---|---|
| 类别×类别 | 笛卡尔组合/哈希 | 捕捉特定组合效应 |
| 数值×数值 | 乘积、比值、多项式 | 表达非线性与相互作用 |
| 数值×类别 | 指示变量乘数值,形成分组斜率 | 高基数组合仍会稀疏 |
把面试题落到可执行流程:
domain hypothesis
-> construct candidate crosses
-> fit in train folds only
-> validate gain, stability and serving cost
交叉项不是越多越好;没有业务或验证依据的全组合会造成维度爆炸,并把偶然共现当规律。
八、常见误区与追问
- 误区:树模型完全不需要考虑特征交互。 树能自动形成部分交互,但深度、样本量和模型约束决定能否稳定学到。
- 误区:分组均值特征只要来自训练集就不会泄露。 训练样本本身标签若参与自己的分组统计仍会泄露,应采用 OOF 计算。
- 追问:为什么线性模型需要显式交叉? 原始线性项只能表达加法关系,乘积或组合项扩展了特征空间。
- 追问:哈希交叉有什么好处? 固定维度并支持未知组合,代价是哈希冲突和解释性下降。
- 追问:如何筛选交叉项? 从业务假设出发,用正则化、消融实验和跨时间验证确认增益。
九、加强记忆
记忆时抓住这条主线:交叉项表达“一个特征的作用取决于另一个特征”。加法线性模型需显式加入类别×类别、数值乘积/比值,或类别指示×数值等项;高基数全组合会稀疏并过拟合。树路径、FM 的隐向量内积、DCN 的交叉层和深度网络各以不同方式表达交互,但都受容量与数据限制。分组历史统计还必须单独审查时间窗口、当前样本是否参与及标签泄漏。最终只保留跨折/跨时间稳定且服务成本可接受的交叉。