【附Python源码】基于逻辑回归的电信客户流失预警模型实战
在电信行业,客户流失率是影响企业盈利能力的关键指标之一。获取新客户的成本通常是维护老客户的五倍以上,因此建立有效的客户流失预警机制具有重要的商业价值。
本文将介绍如何使用逻辑回归算法构建一个客户流失预测模型,并分享完整的实现过程。
一、问题背景与业务价值
电信市场竞争激烈,客户可以相对容易地切换运营商。根据行业统计,电信行业的平均客户流失率在20%-30%之间。如果能够提前识别出有流失风险的客户,企业就可以采取针对性的挽留措施,如提供优惠套餐、改善服务质量等。
客户流失预测本质上是一个二分类问题:根据客户的历史行为数据,预测其在未来一段时间内是否会流失。这类问题的常用解法包括逻辑回归、随机森林、XGBoost等。⚠️本项目选择逻辑回归作为基础练习。
二、数据集介绍
本项目使用 Telco Customer Churn 数据集,包含 7,043 位客户的信息,共 21 个字段。
数据集地址:www.kaggle.com/datasets/bl…
这些字段可以分为四类:
客户基本信息:性别、是否为老年公民、是否有伴侣、是否有家属
服务使用情况:在网时长、电话服务、互联网服务类型、在线安全、在线备份、设备保护、技术支持、流媒体电视、流媒体电影等增值服务
合同与账单信息:合同类型(月付/年付/两年付)、是否使用无纸化账单、支付方式、月费、总费用
目标变量:客户是否流失(Yes/No)
数据集中的流失率约为 26.5%,属于类别不平衡场景,在建模时需要特别处理。
三、数据预处理的关键细节
在实际项目中,数据预处理往往占据 70% 以上的工作量。本项目的预处理流程包括以下几个环节:
3.1 列名清洗
原始 CSV 文件的列名包含前后空格,直接使用会导致 KeyError。通过 df.columns.str.strip() 可以快速清理:
df = pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv')
df.columns = df.columns.str.strip() # 去除列名前后空格
这个细节在实际业务数据中很常见,尤其是从数据库导出的文件。
3.2 缺失值处理
总费用(TotalCharges)列的数据类型为字符串,且包含空值。需要先转换为数值类型,再删除无法转换的记录:
df_processed['总费用'] = pd.to_numeric(df_processed['总费用'], errors='coerce')
df_processed = df_processed.dropna()
处理后剩余 7,032 条记录,缺失率低于 0.2%,对整体分析影响有限。
3.3 特征编码
对于分类变量,采用 One-Hot 编码处理。原始数据中有 15 个分类字段,编码后生成 30 个特征。目标变量客户流失通过字典映射转换为 0/1:
df_processed['客户流失'] = df_processed['客户流失'].map({'Yes': 1, 'No': 0})
四、模型构建与训练
4.1 数据划分
采用 8:2 的比例划分训练集和测试集,并使用 stratify 参数确保训练集和测试集中的流失率一致:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
4.2 特征标准化
逻辑回归对特征的尺度敏感,因此需要对数值特征进行标准化:
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
4.3 类别不平衡处理
由于流失客户仅占 26.5%,属于类别不平衡场景。在逻辑回归中设置 class_weight='balanced',让模型自动调整类别权重:
model = LogisticRegression(
max_iter=1000,
random_state=42,
class_weight='balanced' # 自动调整类别权重
)
五、模型评估与结果分析
5.1 评估指标
在客户流失预测场景中 ,召回率(Recall) 通常比准确率更重要——漏掉一个即将流失的客户比误判一个稳定客户为流失客户的代价更高。以下是模型在测试集上的表现:
| 指标 | 数值 |
|---|---|
| 准确率 | 72.64% |
| 精确率 | 49.09% |
| 召回率 | 79.68% |
| F1 分数 | 60.75% |
| AUC-ROC | 83.50% |
召回率达到 79.68% ,意味着模型能够识别出近八成的潜在流失客户,这对于业务场景是可接受的。AUC-ROC 为 83.50%,表明模型具有良好的区分能力。
5.2 混淆矩阵解读
[[724 309]
[ 76 298]]
- 真负例(TN):724 人,正确预测为未流失
- 假正例(FP):309 人,误判为流失
- 假负例(FN):76 人,漏掉的流失客户
- 真正例(TP):298 人,正确预测的流失客户
5.3 特征重要性分析
通过逻辑回归的系数绝对值可以判断特征重要性。排名靠前的特征包括:
- 合同类型(月付 vs 长期合同)
- 在网时长
- 互联网服务类型
- 支付方式
- 月费金额
这些发现与业务直觉一致:月付客户、新用户、光纤用户、使用电子支票支付的客户流失风险相对较高。
六、风险等级划分与业务应用
基于模型预测的流失概率,可以将客户划分为三个风险等级:
| 风险等级 | 流失概率 | 业务策略 |
|---|---|---|
| 高风险 | ≥ 70% | 立即触发挽留流程,客户经理一对一跟进 |
| 中风险 | 40% - 70% | 纳入重点观察名单,定期推送优惠活动 |
| 低风险 | < 40% | 维持常规服务,关注满意度变化 |
这种分级机制可以帮助企业合理分配资源,将精力集中在高风险客户群体上。
七、改进方向
当前模型作为 baseline 已经能够满足基本需求,但仍有优化空间:
- 特征工程:可以尝试构造交叉特征,如月费与在网时长的比值、增值服务开通数量等
- 模型融合:尝试随机森林、XGBoost 等算法,与逻辑回归进行模型融合
- 阈值调优:根据业务成本调整分类阈值,优化精确率与召回率的平衡
- 时间序列分析:引入客户行为的时间序列特征,捕捉流失前的行为模式变化
客户流失预测是数据科学在电信行业的典型应用场景。通过逻辑回归模型,我们不仅能够获得较好的预测性能,还能从模型系数中解读出影响流失的关键因素,为业务决策提供依据。在实际落地时,模型预测结果需要与业务系统打通,形成从预警到行动的闭环,才能真正发挥价值。
⚠️ 完整代码和数据集已开源,欢迎交流讨论。