📰 来源:Towards Data Science | 📅 翻译日期:2026年6月18日
🔗 原文:查看原文
🤖 翻译:DeepSeek AI · 仅供参考
当一个流失模型说“这个客户离开的概率是0.4”,而你的代码执行predict(X) >= 0.5时,你刚刚做了一个定价决策:你判定,向一个本会留下的客户发送留存优惠的成本,恰好等于失去一个本会离开的客户的成本。而在IBM Telco数据集(可以说是Kaggle和GitHub上被循环利用最多的流失数据集)上,这个决策的偏差高达13倍。
我收集了36个公开可用的IBM Telco流失分析(包括Kaggle笔记本、GitHub仓库、博客文章、同行评审论文),其报告模式令人震惊:大约九成报告了分类准确率或F1分数,仅超过七分之一报告了利润曲线,而没有一个使用生存分析来计算生命周期价值。
结果是,同一个数据集被反复建模数百次,每个默认阈值模型都在“亏钱”:在标准的20%测试集划分下,每个客户可避免的损失约为$86;若扩展到具有相同流失特征的10万用户规模,则代表860万美元的可收回成本。IBM Telco的流失率(26.5%年化)异常高,一个健康的B2C SaaS业务年流失率为5–8%,每客户损失会下降约3–4倍。因此,在任何成本敏感的场景下,不变的并非具体金额,而是不对称性——错过一个流失客户的成本,是过度挽留一个忠诚客户的13倍。
Image by author.
本文依次阐述三件事:第一,IBM Telco文献报告了什么、遗漏了什么;第二,如何利用公开的2026年B2C SaaS基准和Kaplan-Meier生存分析来计算误分类的美元成本,无需主观估算CAC;第三,为什么当模型在SMOTE平衡数据上训练时,教科书上的贝叶斯最优阈值公式会被暴力搜索击败,以及如何应对。
本文中的所有数字均可通过文末链接的脚本复现。
1. 36篇文章的缺口
IBM Telco客户流失数据集很小(7,032行清洗后的数据)、整洁、有标签,并且近十年来一直是Kaggle上经典的入门级流失数据集。
为了了解公共语料库实际测量的内容,我索引了来自Kaggle、GitHub和主要数据科学博客的36篇分析,对每篇在十个报告维度上评分,从F1分数到基于CAC和LTV的利润曲线。
得到的模式如图2所示。
Image by author.
三个值得注意的发现:
- 饱和:F1、准确率、AUC、混淆矩阵截图以及SMOTE与无SMOTE的比较出现在80–90%的语料中,使用Optuna或网格搜索进行超参数调优几乎是普遍现象。
- 罕见:利润曲线(误分类的总美元成本作为决策阈值的函数)出现在不到15%的回顾分析中;即使出现,FN/FP成本数字通常从教科书示例中选取,而未锚定真实的CAC或LTV。
- 缺失:我索引的36篇分析中,没有一篇通过生存分析基于服务时长计算客户生命周期价值;大多数要么完全跳过LTV,要么使用稳态Skok公式
LTV = ARPU / monthly_churn_rate,该公式假设客户群体同质——对于合同类型、支付方式和服务时长都显著影响留存的数据集而言,这是一个很强的假设。
跳过生存分析很重要,因为阈值决策是LTV的函数:如果你将LTV误判了2倍,那么你也会将错过流失客户的成本误判2倍,而成本最优阈值也会随之改变。
接下来的两部分构建缺失的板块,然后将其重新嵌入阈值问题。
2. 每次错误的成本(以美元计)
每次预测的美元成本由三个数字决定:ARPU、毛利率和CAC;其中两个直接从数据集得出,一个来自公开的2026年行业基准。
import pandas as pd
df = pd.read_csv("telco.csv")
df["TotalCharges"] = pd.to_numeric(df["TotalCharges"], errors="coerce")
df = df.dropna().reset_index(drop=True)
arpu = df["MonthlyCharges"].mean() # $64.80
mean_tenure = df["tenure"].mean() # 32.42 months
churn_rate = (df["Churn"] == "Yes").mean() # 26.58 %
realised_ltv_churned = df.loc[df["Churn"] == "Yes",
"TotalCharges"].mean() # $1,531.80ARPU和服务时长是数据集固有的:平均月费为$64.80,平均观察服务时长为32.4个月,流失客户的实际LTV为$1,531.80(仅是已离开客户的平均总费用)。因此,在ARPU固定的情况下,三种常见的LTV框架给出了截然不同的上限:
ARPU × mean_tenure得到$2,099.9- 使用Skok公式
ARPU / churn_rate得到$243.8 - 流失客户的实际LTV
$1,531.8
这三种都不是正确答案,而第一种明显错误。ARPU × mean_tenure 是大多数教程采用的框架,但它从根本上就是错误的。ARPU并非客户属性,而是与驱动流失的每个特征——合同类型、支付方式、产品组合、家庭结构——共同作用的结果。收入随客户离开而流失,因此ARPU和服务时长不是独立量,教科书上的分解 LTV ≈ E[ARPU] × E[lifetime] 仅在 Cov(ARPU, lifetime) = 0 时成立。在任何值得建模的流失数据集中,该协方差不为零——如果为零,模型就没有什么可预测的了——一个月费$80、服务时长8个月的客户并非“高收入客户”;他们的$80和8个月是对同一潜在风险特征的两个读数。
再加上ARPU在单个客户生命周期内会变化——促销入门群体前三个月月费$30,之后$80;长期忠诚客户享受$50的祖父费率,而新客户为同一产品支付$90——将一个分布的平均乘以另一个分布的平均描述的是一个在数据中不存在的客户。
Skok公式至少使用了稳态流失率,但它假设该速率是常数,忽略了生存曲线的实际形状。
关键洞察:在流失建模中,成本不对称是比任何单一阈值都更重要的参数。如果你不衡量误分类的实际美元成本,模型优化就变成了空中楼阁。
参考资料
- IBM Telco Customer Churn Dataset: Kaggle
- Kaplan-Meier survival analysis implementation: scikit-survival
评论已关闭