QBUS6600 流失预测报告里的七个小改法
交叉验证按家庭分组切折
notebook 里的 StratifiedKFold 我会换成 StratifiedGroupKFold,组就是家庭:linked 会员取 PrimaryID,主会员取自己的 HashID。数据字典写明 linked 会员的 PrimaryID 指向替这名会员付钱的主会员,一家人共用一份会籍;guide 数过,多成员家庭几乎都是全家一起留或一起走。随机切折会把一家人分到训练折和验证折两边,验证分数跟着虚高。报告里写一句家庭结果有多一致、所以按家庭分组,marker 对着 rubric 的 「sound model selection process」,能看到分折方式是从数据推出来的。
模型比较表多加训练折 F1 和折间标准差
比较表只放 CV F1,看不出谁在过拟合。我会多加两列:训练折上的 F1,和 5 个验证折 F1 的标准差。训练折比验证折高出一大截,说明模型在记训练数据,guide 的比较里随机森林和 bagging 的这个差距就明显大于逻辑回归。前几名相差不到一个折间标准差时,报告里直接写它们打平,再选能解释的那个。这两列对应 rubric 的 「not misled by overfitting」,brief 也提到表现好的模型太复杂时可以考虑 「well-performing simpler models」。
F1 阈值在 OOF 预测上选好再锁定
正类只占 7.16%,加了类别权重以后分数整体被抬高,0.5 这条线对你的模型没有特别含义。我会把 5 折的 out-of-fold 预测拼起来扫一遍阈值,取 F1 达到峰值的那个阈值锁定,再用它出 Kaggle 预测,排行榜只交一次,当作独立检查。阈值和 F1 来自同一批 OOF 预测,报出来的数偏乐观,报告里写明这一点;时间够的话,每次用四折选阈值、在第五折上打分,轮完一圈得到一个更保守的 F1,写成对 Kaggle 排行榜分数的预期。
假设表加一列有没有被违反
Rubric 的原话是 「You note crucial assumptions and whether they are potentially violated」,后半句要的是一个判断。我的假设表写四列:假设、怎么检查、证据、结论和处理。比如观测相互独立:家庭结果高度一致,结论是违反,处理是按家庭分折;到访的几个时间窗口高度相关,处理是加正则化、按特征组看重要性。marker 能看出局限是分析里查出来的。
把主会员的会龄和到访接到全家身上
数据字典说 PrimaryInd 为 1 的是付钱的人,linked 会员挂在别人的会籍下。合约跟着付钱的人走,linked 会员常比主会员晚入会,本人的会龄说明不了合约走到了哪一步。我会用 PrimaryID 把主会员的会龄、近 90 天到访天数和距上次入会周年的天数接到每个家庭成员身上,再用同一套折重跑。F1 的变化落在折间波动以内也照写:加了什么、分数变了多少、解释变成什么样。rubric 写的 「trial and error (if necessary)」 对应的就是这样一轮有前后对比的记录。
T0 当天的记录排除,未来预约留下
数据字典把 T0 写成 「midnight of 2024-07-19」,到访和消费记录却排到了 7 月 19 日当天。我会取 T0 = 2024-07-19 00:00,条件写成严格小于,在 data processing 里用一句话交代这个假设和排除的行数。开始时间在 T0 之后的预约,到场结果在 T0 时还不知道,我会留空,不填 0;19 日当天开始的场次数据里带着到场结果,也一起清掉。这些场次在 T0 前已经约好,可以算成手上的未来预约数。消费时间看 , 是账期;年龄是 2026-08-04 提取时记的,我会先减掉约两年。






