2022年我在一家月活80万的社区产品做画像建设。预算有限,两个人干六周。最终落地6张表:用户基础表、行为宽表、偏好标签表、生命周期表、价值分层表、实验分桶表。每天凌晨1点跑批,单次跑批耗时从初版的47分钟压到13分钟。踩过的返工有两次,值得说。
第一次返工在行为宽表。初版把点击、收藏、评论、分享四个行为直接加权求和,权重拍脑袋定1.0、2.0、3.0、4.0。上线两周发现"分享"被刷,因为有运营活动鼓励分享,单个用户一天分享47次。修正步骤:(1)对每个行为做log1p平滑;(2)按行为做Z-score标准化;(3)给分享设单日上限10次,超出截断。修正后标签的区分度提升,高活用户识别准确率从71%到84%。
偏好标签表用了TF-IDF思路。具体做法:把用户近30天消费的内容按一级类目聚合,算出每个类目的占比,再除以全站该类目占比取对数。阈值定三个:占比大于15%记为主偏好,5%到15%记次要偏好,低于5%不记。常见错误是用绝对次数不用占比,导致重度用户全是主偏好。某数码社区就犯过这错,头部5%用户被打上11个主偏好,推荐多样性下降。
生命周期表分五段:新用户(注册0到7天)、成长期(8到30天)、成熟期(31到180天)、沉默预警(181到270天无活跃)、流失(271天以上)。分界点不是拍脑袋,是看留存曲线拐点。我们拉了2021年全年12.6万新用户,7日留存38%,30日留存19%,第31天到第60天留存斜率趋平。所以成长期切在30天。返工点是沉默预警原本设90天,后来改成180天,因为90天口径下误判率22%。
价值分层用了RFM的简化版,只留R和F。M用近90天消费额,但社区产品消费额稀疏,改用"互动频次×内容消费时长"合成一个分。分四层:高价值占4.2%,中价值占17.8%,低价值占51%,沉睡占27%。每层给不同的推荐策略:高价值推新品类做探索,低价值推热门做收敛。上线一个月,低价值层的次日留存从21%到24%。
实验分桶表容易被忽略。我们的错误是:画像标签每天更新,但实验分桶按注册ID哈希,两者不同步。结果一个用户周一在高价值层,周三掉到低价值层,实验组对照组污染率到9%。修正办法:(1)实验分桶在实验周期内冻结;(2)画像更新写入版本号;(3)分析时按首次曝光时的版本取标签。污染率降到1.3%。
给要动手的团队三句话。第一,先定口径再建表,口径文档写清楚时间窗口和截断规则,别写在代码注释里。第二,阈值用数据定,拉历史分布看拐点,别用整数拍脑袋。第三,每天跑一次标签覆盖率监控,低于80%的分桶要报警,覆盖率掉了通常是上游埋点改了。