4. 多变量交叉衍生:笛卡尔积组合、条件组合、聚合统计衍生
单变量衍生只能捕捉单个特征的分布形态,而真实业务场景中的非线性交互、条件依赖和群体统计特征,必须通过多变量交叉衍生来提取。本章聚焦三种核心交叉策略:笛卡尔积组合(特征间全排列)、条件组合(基于业务规则的定向交互)、聚合统计衍生(分组后的均值、方差、极值等统计量)。
核心原则:多变量衍生不是简单堆砌特征,而是用业务逻辑驱动组合方式。笛卡尔积适合探索未知交互,条件组合适合已知规则,聚合统计适合层级结构数据。
4.1 笛卡尔积组合:特征间的全排列交互
笛卡尔积组合将两个或多个离散特征的取值进行全排列,生成新的交叉特征。适用于类别型特征之间的交互,例如“城市 × 用户等级”产生“北京_高等级”、“上海_中等级”等新类别。
| 组合方式 | 输入特征 | 输出特征示例 | 适用场景 |
|---|---|---|---|
| 二元笛卡尔积 | 城市、用户等级 | 北京_高等级、上海_中等级 | 用户分层 × 地域 |
| 三元笛卡尔积 | 城市、等级、设备类型 | 北京_高等级_iOS | 精细化运营分群 |
| 数值×类别拼接 | 年龄分箱、收入分箱 | 20-30岁_高收入 | 人群画像交叉 |
# Python 示例:笛卡尔积组合
import pandas as pd
df = pd.DataFrame({
'city': ['北京', '上海', '广州'],
'level': ['高', '中', '低']
})
# 笛卡尔积组合
df['city_level'] = df['city'] + '_' + df['level']
print(df['city_level'].tolist())
# 输出:['北京_高', '北京_中', '北京_低', '上海_高', ...]
注意稀疏性:笛卡尔积组合会指数级增加特征维度。若两个特征分别有 50 和 20 个取值,组合后产生 1000 个新类别,可能导致严重稀疏。建议先对高频取值做合并,或使用 embedding 降维。
4.2 条件组合:基于业务规则的定向交互
条件组合不是全排列,而是根据业务规则或统计显著性,只在满足特定条件时进行特征交叉。例如“只有高活跃用户才考虑其消费金额与优惠券使用率的交互”,避免无效组合。
- 阈值条件:当特征 A > 阈值时,组合 A × B;否则保留原始特征。
- 逻辑条件:当特征 C 属于集合 S 且特征 D 不为空时,组合 C × D。
- 时间窗口条件:仅在最近 N 天内发生过某事件时,组合事件类型 × 金额分箱。
# 条件组合示例:仅对高活跃用户做交叉
df['is_high_active'] = df['active_days'] > 15
# 条件交叉:高活跃 × 消费等级
df['high_active_consume'] = None
mask = df['is_high_active']
df.loc[mask, 'high_active_consume'] = (
df.loc[mask, 'active_days'].astype(str) + '_' +
df.loc[mask, 'consume_level']
)
优势:条件组合比笛卡尔积减少 60%-80% 的无效特征,同时保留业务可解释性。常用于风控规则引擎和营销响应模型。
4.3 聚合统计衍生:均值、方差、最大值、最小值
聚合统计衍生是最常用的数值型交叉方法,通过分组计算统计量,将群体信息压缩到个体样本上。典型场景:按用户 ID 分组,计算其历史订单金额的均值、方差、最大值、最小值,作为当前样本的新特征。
| 聚合函数 | 含义 | 业务示例 | 对模型的影响 |
|---|---|---|---|
| mean | 分组均值 | 用户历史平均消费 | 反映中心趋势 |
| std / var | 标准差 / 方差 | 用户消费波动性 | 反映稳定性 |
| max | 分组最大值 | 用户单笔最高消费 | 捕捉峰值行为 |
| min | 分组最小值 | 用户单笔最低消费 | 捕捉底线行为 |
| count | 分组计数 | 用户历史交易次数 | 反映活跃度 |
# 聚合统计衍生示例
import pandas as pd
# 原始数据:用户交易记录
trans = pd.DataFrame({
'user_id': [1, 1, 1, 2, 2],
'amount': [100, 200, 150, 300, 50],
'timestamp': ['2024-01-01', '2024-01-05', '2024-01-10',
'2024-01-02', '2024-01-08']
})
# 按 user_id 分组聚合
agg_features = trans.groupby('user_id')['amount'].agg([
('amount_mean', 'mean'),
('amount_std', 'std'),
('amount_max', 'max'),
('amount_min', 'min'),
('amount_count', 'count')
]).reset_index()
print(agg_features)
# user_id amount_mean amount_std amount_max amount_min amount_count
# 0 1 150.0 50.000000 200 100 3
# 1 2 175.0 176.776695 300 50 2
进阶技巧:聚合统计可以叠加时间窗口,例如“近 7 天均值”、“近 30 天最大值”,形成时序聚合特征。同时,聚合的粒度也可以多层:用户级、设备级、店铺级等。
4.4 三种策略的对比与选择
| 维度 | 笛卡尔积组合 | 条件组合 | 聚合统计衍生 |
|---|---|---|---|
| 输入特征类型 | 类别型为主 | 类别型 + 数值型 | 数值型为主 |
| 输出特征类型 | 新类别特征 | 新类别或数值特征 | 数值统计特征 |
| 维度爆炸风险 | 高 | 中 | 低 |
| 业务可解释性 | 中 | 高 | 高 |
| 计算复杂度 | 低 | 中 | 中 |
| 典型应用 | 推荐系统特征交叉 | 风控规则、营销分群 | 用户画像、时序建模 |
4.5 实战案例:用户交易特征衍生
以电商交易数据为例,综合运用三种策略构建特征工程流水线:
- 笛卡尔积:用户等级 × 商品类目 → 新类别特征“高等级_电子产品”
- 条件组合:仅对“近30天有交易”的用户,组合其“平均客单价 × 购买频次”
- 聚合统计:按用户ID分组,计算交易金额的均值、方差、最大值、最小值、交易次数
# 综合特征衍生流水线
def multi_variable_derivation(df):
# 1. 笛卡尔积组合
df['level_category'] = df['user_level'] + '_' + df['category']
# 2. 条件组合:仅对活跃用户
df['active_avg_price'] = None
mask = df['is_active']
df.loc[mask, 'active_avg_price'] = (
df.loc[mask, 'avg_price'] * df.loc[mask, 'frequency']
)
# 3. 聚合统计(需先按用户分组)
agg_dict = {
'amount': ['mean', 'std', 'max', 'min', 'count']
}
user_stats = df.groupby('user_id').agg(agg_dict)
user_stats.columns = ['_'.join(col) for col in user_stats.columns]
user_stats = user_stats.reset_index()
# 合并回原数据
df = df.merge(user_stats, on='user_id', how='left')
return df