如何提取用户行为序列的TF-IDF特征?
解读
面试官问“如何提取用户行为序列的TF-IDF特征”,并不是想听一句“把行为当词、把用户当文档、直接调TfidfVectorizer”就结束。他真正想看的是:
- 你是否理解国内主流埋点格式(如阿里SPM、字节事件模型、腾讯MMP)带来的序列噪声;
- 能否把“行为”抽象成可解释、可落地、可上线的“词”,并解决数据倾斜、稀疏、时效性三大痛点;
- 是否知道TF-IDF只是信号放大器,后续必须配合业务规则或模型才能产生运营价值。
一句话:他要的是“从日志→特征→业务”的完整闭环,而不是教科书代码。
知识点
- 行为粒度选择
- 国内日志常含“页面-展位-元素”三级,需按运营目标合并或截断;例如拉新场景只保留“曝光→点击→注册”三级事件,减少噪音。
- 时间窗口切片
- 采用滑动窗口+会话切分双保险:先以30 min无操作切会话,再在会话内做7天滑动窗口,兼顾短期兴趣与长期偏好。
- 行为序列清洗
- 去重:同一用户同一事件在5秒内重复触发,只保留首次;
- 归一:把“click_iphone14_red_128g”映射到“click_sku_iphone14”,降低词表爆炸;
- 过滤:剔除pv<10的长尾事件,减少稀疏行。
- 构造“词”的三种运营级方案
a. 原始事件ID:简单,但词表大;
b. 事件+属性拼接:如“search_手机_品牌_苹果”,信息丰富,可解释性强;
c. 事件+上下文:如“cart_iphone14_after_view”,引入行为转移信号,适合召回模型。 - TF-IDF二次加权
- 在标准TF-IDF后再乘业务权重:下单=5、加购=3、点击=1,让高价值行为获得更高分;
- 对新用户冷启动,把IDF替换为平滑先验,防止全零向量。
- 实时特征工程
- 用Flink CEP在线拼接行为串,落Kafka,再通过Redis String存“用户→行为TF-IDF稀疏向量”,供推荐/营销系统毫秒级调用。
- 效果验证
- 离线:看AUC提升与TopK召回率;
- 在线:做人群包AB实验,重点监控7日留存差值与人均GMV差值,确保特征带来可核算的增量收益。
答案
第一步:明确业务目标
假设目标是提升老客复购率,则只取近30天“浏览-加购-下单-评价”四类事件,其余全部丢弃,减少噪声。
第二步:会话切分+滑动窗口
用30 min无操作切会话,得到每个用户的会话列表;在每个会话里,用7天滑动窗口生成行为子序列,保证短期兴趣与长期偏好兼顾。
第三步:生成“词”
采用“事件+主属性”拼接,例如:
- 原始日志:event=“sku_view”, properties={“sku_id”:“10024”,“brand”:“Apple”}
- 生成词:view_sku_apple
把词表控制在50万以内,并剔除pv<10的长尾词,防止稀疏。
第四步:计算TF-IDF
- 文档:一个用户在一个时间窗口内的行为序列;
- 词:上述生成的事件属性词;
- 频率:词在该用户窗口内出现次数;
- 逆文档频率:用平滑IDF log((N+1)/(df+1))+1,防止新词df=0;
- 最终向量用L2归一化,方便下游模型。
第五步:业务加权
对“order”类事件乘5,“cart”乘3,“view”乘1,再与TF-IDF得分相乘,得到加权TF-IDF,确保高转化行为信号更强。
第六步:上线与监控
- 离线:Spark批处理每日更新,落Hive表;
- 实时:Flink解析埋点,拼接行为串,调用Redis TF-IDF服务,<50 ms返回向量;
- 监控:每日看向量覆盖率(>98%)、平均稀疏度(<5%非零元素),以及复购AB实验的7日留存差值≥+1.2%,确保特征真正带来可核算的GMV增量。
拓展思考
-
TF-IDF不是终点
在国内大厂实际生产中,TF-IDF往往只作为基础信号,后续会再接入Word2Vec/Transformer学习行为Embedding,形成双塔召回的文本塔;此时TF-IDF向量可充当冷启动兜底,防止新用户无Embedding可用。 -
多目标冲突处理
同一行为序列既要服务复购模型,又要服务流失预警,需维护多版本TF-IDF词表:复购表强调“order”权重,流失表强调“last_login_gap”类事件,通过特征仓库做版本隔离,避免互相干扰。 -
合规与隐私
国内《个人信息保护法》要求可解释性,TF-IDF特征必须能反向映射到原始事件,因此需保留词表字典与脱敏映射关系,在数据出境评估时提供特征血缘报告,确保审计可追溯。