某订阅产品希望在用户取消前 30 天识别高风险客户,并向他们发送挽留方案。数据包含用户基本属性、订阅时长、最近 30 天使用频率、客服联系次数和历史付费信息。
本项目不是单纯追求准确率,而是回答三个问题:
设每条样本的观察日为 。特征只能使用 当天或之前的信息;标签观察 之后 30 天:
如果把“取消后的退款状态”或“未来 30 天登录次数”放进特征,就把未来信息泄漏给模型。项目开始前必须写清楚预测时点、标签窗口和可用字段。
按时间划分,而不是随机划分:早期数据用于训练,中间时间用于验证,最新时间用于最终测试。这样才能模拟上线时“用过去预测未来”。同一用户若有多个观察日,还要防止相邻窗口让训练和测试高度重叠。
建议先建立可解释的基线特征:
tenure_days:订阅天数;sessions_7d、sessions_30d:近期使用频率;days_since_last_login:距最近登录的天数;support_tickets_30d:客服联系次数;payment_failures_90d:支付失败次数;usage_change:近 7 天使用量相对前 30 天均值的变化。长尾金额特征可使用 log1p;类别字段使用 one-hot;缺失值要区分“没有发生”和“未知”。例如客服工单为 0 表示没有联系,而年龄缺失表示未知,两者不能用同一种业务解释。
先用多数类基线回答“复杂模型是否真的有价值”,再比较逻辑回归、随机森林和 GBDT。所有预处理放进 Pipeline:
假设流失率只有 8%。一个永远预测“不流失”的模型 Accuracy 为 92%,但 Recall 为 0,无法挽留任何用户。应同时查看 ROC-AUC、PR-AUC、Recall、Precision、F1 和混淆矩阵;流失稀少时,PR-AUC 往往比 Accuracy 更有信息。
模型输出的是风险概率,不是最终行动。设给高风险用户发送优惠券的成本为 10 元,成功挽留一位用户的毛利为 80 元,则阈值应结合成本收益,而不是固定使用 0.5。
阈值必须在验证集上选择,最终测试集只使用一次。上线后还要监控概率校准:预测 0.8 的用户是否约有 80% 实际流失。
不要停留在总体指标。把错误样本分成四类:
对 False Negative 按套餐、地区、使用频率和客户价值分层,检查是否存在系统性漏检。逻辑回归可以查看标准化系数;树模型可以使用 permutation importance 或 SHAP,但解释是相关性证据,不是因果证明。
锁定特征、模型和阈值后,在最新测试集上只评估一次,报告:
| 维度 | 示例问题 |
|---|---|
| 区分能力 | ROC-AUC、PR-AUC 是否超过基线? |
| 行动名单 | Top 5% 风险用户覆盖多少真实流失? |
| 成本收益 | 优惠券成本与挽留收益是否为正? |
| 公平性 | 不同群体的 Recall、误报率是否差异过大? |
| 稳定性 | 不同时间窗口是否保持相似表现? |
模型只能找到“相关风险”,不能证明优惠券会导致留存。将高风险用户随机分为干预组和对照组,比较 30 天留存率和增量利润。若只给模型命中的用户优惠券,无法估计未命中人群的潜在收益,后续可学习 uplift modeling。
提交一个 Notebook 或报告,必须包含:数据字典、时间切分说明、特征工程、基线比较、模型指标、阈值收益表、错误样本分析、可解释性图表和最终业务建议。