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 实战案例:用户交易特征衍生

以电商交易数据为例,综合运用三种策略构建特征工程流水线:

  1. 笛卡尔积:用户等级 × 商品类目 → 新类别特征“高等级_电子产品”
  2. 条件组合:仅对“近30天有交易”的用户,组合其“平均客单价 × 购买频次”
  3. 聚合统计:按用户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