一、概述
在推荐系统中,特征工程是连接原始数据与模型效果的关键桥梁。PAI-Rec(阿里云推荐开发平台)提供了一套完整的特征配置体系,开发者只需通过界面配置或 JSON 声明,即可自动生成 MaxCompute 和 Flink 的 SQL 代码,产出覆盖用户侧和物品侧的多种特征。
PAI-Rec 的特征配置体系可分为两大层次:
- 离线特征生产:通过"推荐方案定制"中的特征配置,自动衍生统计特征、实时特征、序列特征等,写入特征表供模型训练和在线服务使用。
- 在线特征变换(FG):Feature Generator 是一套保证离线/在线特征一致性的特征变换框架,通过 17 种内置算子完成从原始输入到模型输入的转换。
下面分别详细介绍。
二、数据表配置——特征的基础
在配置特征之前,需要先完成三张基础表的配置:
2.1 行为日志表
行为日志表是统计特征和实时特征的核心数据源,需要配置:
| 配置项 | 说明 | 示例 |
| 行为事件 | 行为类型字段 | event |
| 行为事件枚举值 | 行为类型取值 | 曝光(expr)、点击(click)、点赞(praise) |
| 行为时间戳 | 日志时间,精确到秒 | timestamp |
| 行为场景 | 日志发生的场景 | 首页、搜索页、详情页 |
| 行为的值 | 行为深度(如成交价格、观看时长) | price |
此外,行为表中还可以配置用户侧字段(用户ID、类别特征、数值特征、Tag特征、KV特征等)和物品侧字段(物品ID、类别特征等)。
2.2 用户表
用户表配置用户的基础画像,支持以下字段类型:
- 类别特征:如性别、年龄段、城市
- 数值特征:如作品数、积分
- Tag 特征:多值类别字段(如兴趣爱好),用分隔符分割
- KV 特征:带权重的多值类目特征
- Embedding 特征:用户侧 embedding 向量
- IP 字段:下游自动解析为省份、城市等信息
2.3 物品表
物品表配置物品的基础属性,支持与用户表类似的字段类型:类别特征、数值特征、Tag特征、Text特征、KV特征、Embedding特征等。
重要提示:字段类型的选择直接影响下游特征的衍生方式。例如 Tag 特征会触发分词统计,KV 特征会分别统计 key 和 value。
三、统计特征配置
统计特征是推荐系统中最核心的特征类别,PAI-Rec 支持自动衍生多种统计特征。
3.1 常用周期与行为类型
首先需要配置两个基本维度:
- 统计周期:如短期(3天)、中期(7天)、长期(30天),不宜过多。
- 重点关注行为:如曝光(expr)、点击(click)、点赞(praise),一般不超过5个,且需要按行为发生先后排序(影响转化率特征的生成)。
3.2 基础衍生特征
PAI-Rec 根据上游表配置自动衍生基础属性特征,还支持手动添加:
| 衍生类型 | 适用范围 | 说明 |
| IP 衍生 | 用户侧 | 解析 IP 为省份、城市、国家 |
| 距今时间测算 | 用户/物品侧 | 根据注册时间计算距今天数 |
| 已有特征分段加工 | 数值字段 | 按分割点离散化为类目特征 |
| 特征组合 | 用户/物品侧 | 多个类目字段的笛卡尔积组合 |
| 当日时段加工 | 行为表 | 衍生行为发生在当天第几个小时 |
| 工作日时段加工 | 行为表 | 衍生行为发生在每周第几天 |
3.3 行为偏好统计(核心统计特征)
PAI-Rec 以用户 ID 和物品 ID 为聚合主键,自动衍生 6 大类统计特征:
① 行为统计计数
统计用户在各周期内各行为的发生次数。
示例:统计用户在 3/7/15 天内的 expr、click、praise 次数 → 产出 3×3=9 个特征
② 转化率统计
统计行为之间的转化率。
示例:click/expr(点击率)、praise/click(转化率)→ 产出 周期数 × 公式数 个特征
③ Top 偏好属性类特征的行为计数
统计用户在各类目/Tag 维度下,各行为的发生次数,生成 KV 特征。
示例:用户在"12点"的点击发生27次 → 特征值 "12:27.0,8:26.0,1:1.0"
产出 = 周期数 × 行为数 × 属性特征数
④ Top 偏好属性类特征的行为占比
统计用户在各类目/Tag 维度下的行为比率(如各类目的 CTR)。
示例:用户在"类目12"的点击率 0.27 → 特征值 "12:0.27,8:0.26"
产出 = 周期数 × 转化率公式数 × 属性特征数
⑤ 偏好数值类特征
统计用户在各行为下,对数值属性的总和/最大值/最小值/均值。
产出 = 周期数 × 行为数 × 数值特征数
⑥ Top 类目与数值组合特征
统计用户在各类目维度下,对某数值属性的偏好统计。
产出 = 周期数 × 行为数 × 组合特征的类目特征数
3.4 聚合特征
聚合特征支持用户侧和物品侧,以类目字段作为聚合条件,可配置多组。统计类型与行为偏好统计一致。
示例:统计在不同性别下"点击、点赞、曝光"的总次数。以"口红"为例,可以发现女性点击明显更多。
四、实时特征配置
实时特征的统计逻辑与离线统计特征类似,但有两个关键差异:
- 统计周期单位是秒(而非天),适用于实时流计算(Flink SQL)。
- 防穿越时间:目标行为最近 N 秒内的行为不进入统计,用于弥补行为日志从客户端到消息中间件再到在线存储的时间差。
实时特征支持以下 4 种统计类型:
| 统计类型 | 说明 |
| 行为统计计数 | 实时窗口内的行为发生次数 |
| 转化率统计 | 实时窗口内的行为转化率 |
| Top 偏好属性类特征的行为计数 | 实时窗口内按类目维度统计行为次数(KV 特征) |
| Top 偏好属性类特征的行为占比 | 实时窗口内按类目维度统计行为比率(KV 特征) |
以用户 ID 和物品 ID 为主键均可创建实时特征。
五、序列特征配置
序列特征仅发生在用户侧,用于捕捉用户的行为序列信息,是 DIN/DIEN 等序列模型的关键输入。
5.1 核心配置项
| 配置项 | 说明 |
| 行为周期 | 统计最近多少天内的行为(多组序列取最大周期) |
| 统计行为 | 要纳入序列的行为类型 |
| 场景 | 只统计该场景下的行为(可不选) |
| 去重 ID | 按该子特征去重,保留最后一次行为 |
| 子特征 | 序列中的属性(通常是物品侧的类目、多值类目、数值特征) |
| 阶段数量 | 序列最大保留的长度 |
| 防穿越时间 | 最近 N 秒的行为不算入序列 |
| 序列特征分隔符 | 序列之间的分隔符 |
| 子特征分隔符 | 一个序列内子特征之间的分隔符 |
5.2 设计思路
PAI-Rec 的序列特征初始阶段使用离线数据模拟实时序列,可以加速上线。其中模拟事件通常是曝光事件,防穿越时间用于避免因日志回流延迟导致的数据穿越。
六、Feature Generator(FG)特征变换算子
FG(Feature Generator)是 PAI-Rec 中保证离线/在线特征一致性的核心模块。它将原始输入通过一系列算子变换为模型所需的特征格式,所有算子构成一个有向无环图(DAG),按拓扑顺序并行执行。
6.1 FG 配置总览
FG 通过 JSON 配置文件声明,核心结构如下:
json
{ "features": [ /* 特征算子列表 */ ], "reserves": ["request_id", "user_id", "is_click"], "input_alias": { "alias_field": "real_field" } }
- features:定义特征变换算子
- reserves:透传字段,原样输出不做变换
- input_alias:输入字段别名映射
6.2 输入域
每个特征算子通过 expression 字段声明数据来源,支持 4 种输入域:
| 输入域 | 说明 | 示例 |
user: |
用户侧特征 | user:gender |
item: |
物品侧特征 | item:category |
context: |
上下文特征 | context:time |
feature: |
另一个算子的输出 | feature:norm_title |
其中 feature: 域用于构建算子间的依赖关系,形成 DAG。
6.3 17 种内置特征算子详解
① id_feature —— 离散特征
将离散值转为模型可用的 ID 特征,支持单值和多值。
json
{ "feature_type": "id_feature", "feature_name": "item_category", "expression": "item:category", "need_prefix": true, "hash_bucket_size": 10000 }
关键参数:need_prefix(是否拼接特征名前缀)、weighted(是否为 key:value 带权重格式)、value_dimension(多值截断维度)。支持分箱操作。
② raw_feature —— 连续值特征
直接引用数值型原始字段,支持归一化。
json
{ "feature_type": "raw_feature", "feature_name": "item_price", "expression": "item:price", "normalizer": "method=log10" }
支持 4 种 Normalizer:
- minmax:x = (x - min) / (max - min)
- zscore:x = (x - mean) / std
- log10:x = log10(x)
- expression:自定义表达式,如 expr=sign(x)
③ expr_feature —— 表达式特征
对多个字段进行数学表达式计算,支持广播机制和向量运算。
json
{ "feature_type": "expr_feature", "feature_name": "ctr_sigmoid", "expression": "sigmoid(pv/(1+click))", "variables": ["item:pv", "item:click"] }
内置丰富函数库:
- 数学函数:sin, cos, log10, sigmoid, sqrt, abs, round 等
- 地理函数:sphere_dist, haversine(GPS 距离计算)
- 向量函数:dot, euclid_dist, l2_norm, reduce_sum, reduce_mean 等
- 支持临时变量和逗号表达式
④ combo_feature —— 组合特征
多个字段的笛卡尔积交叉,常用于 user-item 交叉特征。
json
{ "feature_type": "combo_feature", "expression": ["user:age_class", "item:category"], "hash_bucket_size": 200 }
⑤ lookup_feature —— 查找特征
从 KV 结构中匹配目标值,常用于偏好统计特征的在线查询。
json
{ "feature_type": "lookup_feature", "feature_name": "usr_cate_clk_1d", "map": "user:usr_cate_clk_cnt_1d", "key": "item:category", "normalizer": "method=log10", "combiner": "max" }
典型场景:用户在各类目下的点击次数(KV 特征),在线推理时通过当前 item 的类目去查找用户对该类目的偏好值。
⑥ overlap_feature —— 重叠/匹配特征
计算两个字段之间的重叠/匹配关系,常用于搜索场景的 query-title 匹配。
json
{ "feature_type": "overlap_feature", "method": "query_common_ratio", "query": "user:query_terms", "title": "item:title_terms", "default_value": "0" }
支持的匹配方法:
- is_contain:是否包含
- query_common_ratio:query 端的匹配比率
- title_common_ratio:title 端的匹配比率
- proximity_min_cover:最小覆盖距离
⑦ text_normalizer —— 文本归一化
对文本字段进行预处理(如大小写转换、空格处理等)。
json
{ "feature_type": "text_normalizer", "feature_name": "norm_title", "expression": "item:title", "max_length": 512 }
⑧ tokenize_feature —— 分词特征
对文本进行分词,输出词 ID 序列。
json
{ "feature_type": "tokenize_feature", "feature_name": "title_terms", "expression": "feature:norm_title", "vocab_file": "tokenizer.json", "output_type": "word_id", "output_delim": "," }
⑨ sequence_feature —— 序列特征
在 FG 层定义序列特征的变换逻辑。
json
{ "sequence_name": "click_seq", "sequence_length": 50, "sequence_delim": ";", "sequence_pk": "user:click_item", "features": [ { "feature_name": "click_cate_seq", "feature_type": "id_feature", "expression": "user:click_cate_seq", "hash_bucket_size": 10000 } ] }
⑩ 其他算子
| 算子 | 用途 |
geohash_feature |
经纬度转 GeoHash 编码 |
binary_feature |
二值特征(0/1) |
match_feature |
从 KV 对中匹配特征 |
pretrained_feature |
预训练模型生成的 embedding 特征 |
6.4 特征分箱(离散化)
FG 支持 6 种分箱方式,适用于 id_feature 和 raw_feature:
| 分箱方式 | 说明 |
hash_bucket_size |
对特征值 hash 取模 |
vocab_list |
按词汇表映射为索引 |
vocab_dict |
按字典映射(支持多对一) |
vocab_file |
从外部文件加载词汇表 |
boundaries |
按分箱边界离散化 |
num_buckets |
直接使用特征值作为桶号 |
七、特征配置全景图
下面用一张图总结 PAI-Rec 的特征体系:
八、最佳实践建议
- 控制特征数量:统计周期建议 3 个以内(短/中/长),行为类型 5 个以内,避免特征爆炸。
- 行为顺序很重要:行为枚举值需按发生先后排序(曝光→点击→转化),否则影响转化率特征的正确生成。
- 合理设置防穿越时间:序列特征和实时特征都需要设置防穿越时间,避免训练时数据穿越。
- 善用 lookup_feature:离线产出的 KV 偏好统计特征,在线通过 lookup_feature 按 item 属性查找,是连接离线统计与在线推理的桥梁。
- FG 保证一致性:所有需要同时在离线和在线执行的特征变换,都应通过 FG 算子定义,避免离线/在线不一致。
- 利用 DAG 依赖:通过 feature: 输入域串联多个算子(如 text_normalizer → tokenize_feature → overlap_feature),构建复杂的特征处理流水线。
以上就是 PAI-Rec 特征配置体系的全面介绍。通过数据表配置 → 统计/实时/序列特征自动衍生 → FG 算子在线变换这一完整链路,开发者可以高效地构建推荐系统所需的特征工程,大幅降低特征开发和维护成本。