基于随机森林的电信客户流失预测:从数据挖掘到精准决策,降低运营商流失率
电信行业客户流失问题日益严峻,行业平均流失率达14-20%,新客户获取成本远高于老客户维护成本。本文提出基于随机森林算法的客户流失预测模型,通过数据采样技术和参数调优解决数据不平衡问题。关键发现显示日均通话时长、月账单和客服通话次数是影响流失的TOP3因素。优化后的模型AUC值达0.9964,可精准识别高风险客户。建议运营商采取套餐优化、专属客服回访等措施针对性挽留,预计可降低流失率30-50%,
一、为什么要做电信客户流失预测?行业痛点与核心价值
1.1 行业背景:客户流失的 “隐形成本”
随着 5G 普及与携号转网政策落地,电信客户选择权大幅提升,流失问题愈发严峻:
- 流失率高企:行业平均客户流失率约 14-20%,部分细分市场(如 prepaid 用户)甚至超过 30%;
- 成本失衡:新客户获取成本(如广告、补贴)是老客户挽留成本的 5 倍以上,盲目拉新不如精准留旧;
- 预判缺失:传统运营中,运营商仅能通过 “客户离网后回访” 了解原因,无法提前干预,错失挽留时机。
例如,某客户因 “每月账单过高 + 客服响应慢” 产生离网念头,若运营商能提前识别并提供针对性优惠(如套餐降级、专属客服),大概率可避免客户流失。而客户流失预测的核心价值,就是将 “被动应对” 转为 “主动干预”。
1.2 模型价值:三大核心作用
- 精准识别潜在流失客户:通过模型提前标记 “高风险流失客户”,运营商可集中资源重点挽留,避免 “撒胡椒面” 式投入;
- 定位流失关键因素:通过特征重要度分析,明确 “哪些因素最影响客户离网”(如账单金额、客服通话次数),为策略制定提供方向;
- 量化挽留 ROI:基于预测结果,优先挽留 “高价值客户”(如月消费 500 + 元的商务客户),确保每一分挽留成本都产生最大收益。
二、技术路径:从数据到模型的完整流程
本文采用 “数据理解→数据准备→模型构建→优化迭代” 的标准数据挖掘流程(CRISP-DM),核心技术栈包括 Python(Pandas、Scikit-learn、Matplotlib)、随机森林算法,重点解决 “数据不平衡” 与 “模型参数优化” 两大关键问题。
2.1 数据集与特征说明
实验数据来自 Kaggle 公开的 “Customer Churn” 数据集,包含3333 条客户记录,每条记录含 11 个特征(1 个目标变量 + 10 个输入特征),覆盖客户 “账户属性、消费行为、服务使用” 三大维度:
| 特征类别 | 特征名称 | 含义说明 |
|---|---|---|
| 目标变量 | Churn | 是否流失(1 = 流失,0 = 未流失),样本占比:流失 14.49%,未流失 85.51%(数据不平衡) |
| 账户属性 | AccountWeeks | 客户账户活跃周数(反映客户忠诚度) |
| 账户属性 | ContractRenewal | 是否续签合同(1 = 是,0 = 否) |
| 消费行为 | MonthlyCharge | 月均账单金额(核心成本因素) |
| 消费行为 | OverageFee | 过去 12 个月最大超额费用(反映消费超出预期程度) |
| 服务使用 | DataPlan | 是否有数据套餐(1 = 是,0 = 否) |
| 服务使用 | DataUsage | 月均数据使用量(GB) |
| 服务使用 | DayMins/DayCalls | 日均通话时长 / 通话次数(反映服务依赖度) |
| 服务质量 | CustServCalls | 致电客服次数(反映服务不满程度) |
| 服务质量 | RoamMins | 月均漫游时长(反映跨区域使用需求) |
2.2 核心技术难点与解决方案
难点 1:数据高度不平衡
- 问题:流失客户仅占 14.49%,若直接建模,模型会 “偏向多数类”(预测所有客户都不流失),导致准确率虚高但实用价值低;
- 解决方案:采用 4 种采样技术对比验证,最终选择 “过采样”(重复少数类样本)与 “SMOTE 过采样”(合成新少数类样本),平衡正负样本比例。
难点 2:模型参数调优
- 问题:随机森林等集成算法存在多个超参数(如决策树数量 n_estimators、最大特征数 max_features),参数选择直接影响模型性能;
- 解决方案:结合 “十折交叉验证 + 网格搜索”,遍历参数组合(如 n_estimators=50-150,max_features=1-10),筛选最优参数组合。
三、数据探索:从可视化到规律发现
在建模前,通过 “描述性统计 + 数据可视化” 挖掘数据规律,为后续建模提供方向。
3.1 数据不平衡问题凸显
从流失分布可见:未流失客户占 85.51%,流失客户仅 14.49%,数据呈 “极度不平衡” 状态 —— 这意味着若直接建模,即使全部预测为 “未流失”,准确率也能达到 85.51%,但无法识别任何流失客户,模型无实用价值。
3.2 关键特征与流失的关联
通过可视化分析,发现 3 个核心规律:
- 数据套餐与流失:无数据套餐的客户流失率(22.3%)是有数据套餐客户(5.1%)的 4 倍以上 —— 数据套餐绑定了客户使用习惯,降低流失意愿;
- 客服通话次数与流失:致电客服 1 次的客户流失率最高(18.7%),而通话次数≥5 次的客户流失率几乎为 0—— 首次客服咨询若未解决问题,客户易流失;多次咨询后问题解决,反而提升忠诚度;
- 月账单与流失:月账单>70 元的客户流失率(21.5%)是账单<40 元客户(8.3%)的 2.6 倍 —— 高账单客户对价格更敏感,易被竞品低价套餐吸引。
四、模型构建:从 baseline 到最优模型
采用 “多算法对比→采样优化→参数调优” 的迭代思路,逐步提升模型性能。
4.1 第一步: baseline 模型对比
首先使用 4 种经典分类算法构建 baseline 模型,按 7:3 划分训练集与测试集,采用 “准确率、AUC、查准率、查全率、F1 Score”5 个指标评估(注:AUC 是不平衡数据的核心指标,反映模型区分能力):
| 模型 | 准确率(Accuracy) | AUC 值 | 查准率(Precision) | 查全率(Recall) | F1 Score |
|---|---|---|---|---|---|
| 决策树(DT) | 0.9200 | 0.8767 | 0.9000 | 0.7500 | 0.8000 |
| K 近邻(KNN) | 0.8700 | 0.6499 | 0.7600 | 0.6200 | 0.6600 |
| 随机森林(RF) | 0.9300 | 0.9300 | 0.9100 | 0.8000 | 0.8400 |
| 梯度提升决策树(GBDT) | 0.9250 | 0.9280 | 0.9050 | 0.7800 | 0.8300 |
结论:随机森林(RF)表现最优,AUC 值达 0.93,且查准率、查全率均衡 —— 原因是随机森林通过多棵决策树集成,降低过拟合风险,对不平衡数据的鲁棒性更强。
4.2 第二步:采样技术解决数据不平衡
针对 “流失客户占比低” 的问题,采用 4 种采样技术处理数据,再基于随机森林重新建模:
| 采样方法 | 准确率 | AUC 值 | 查全率(Recall) | 核心优势 |
|---|---|---|---|---|
| 原始数据(无采样) | 0.9300 | 0.9300 | 0.8000 | 无数据篡改,但查全率低(漏判多) |
| 欠采样(随机删除多数类) | 0.8300 | 0.8669 | 0.8500 | 计算快,但丢失多数类信息 |
| SMOTE 过采样(合成少数类) | 0.9200 | 0.9698 | 0.9200 | 避免过拟合,平衡数据分布 |
| 过采样(重复少数类) | 0.9700 | 0.9947 | 0.9700 | 查全率最高,对流失客户识别能力最强 |
关键发现:过采样(重复少数类)效果最佳,AUC 值提升至 0.9947—— 原因是重复少数类样本未引入 “虚假数据”,仅增强少数类在模型训练中的权重,让模型更关注流失客户特征。
4.3 第三步:网格搜索优化参数
随机森林的核心超参数包括 “决策树数量(n_estimators)” 与 “最大特征数(max_features)”,通过网格搜索遍历参数组合:
- 参数范围:n_estimators=50-150(步长 20),max_features=1-10(步长 1);
- 验证方式:十折交叉验证(避免单次划分的偶然性)。
最终最优参数为:
- n_estimators=91(决策树数量);
- max_features=1(每棵树仅用 1 个特征分裂,增强随机性)。
优化后模型性能:
| 指标 | 过采样 + 参数优化后 | 提升幅度 |
|---|---|---|
| 准确率(Accuracy) | 0.9700 | 无(基数已高) |
| AUC 值 | 0.9964 | +0.17% |
| 查准率(Precision) | 0.9700 | +6.59% |
| 查全率(Recall) | 0.9700 | +0.00% |
此时模型已达到实用水平:AUC 值 0.9964 意味着 “模型区分流失与未流失客户的能力接近完美”,查准率 97% 意味着 “模型预测为流失的客户中,97% 确实会流失”,可大幅降低运营商挽留成本。
五、关键发现:哪些因素最影响客户流失?
基于最优模型(过采样 + 参数优化随机森林),通过 “特征重要度排序” 定位影响客户流失的核心因素:
| 排名 | 特征名称 | 重要度 | 影响解读 |
|---|---|---|---|
| 1 | DayMins(日均通话时长) | 0.1811 | 日均通话时长越长,流失率越高 —— 可能是 “高通话量客户” 对资费更敏感,易被低价套餐吸引; |
| 2 | MonthlyCharge(月账单) | 0.1590 | 月账单越高,流失率越高 —— 核心成本因素,高账单客户更易对比竞品价格; |
| 3 | CustServCalls(客服通话次数) | 0.1436 | 通话 1 次的客户流失率最高 —— 首次咨询未解决问题,客户易产生不满; |
| 4 | OverageFee(最大超额费用) | 0.1004 | 超额费用越高,流失率越高 —— 超出预期的消费会降低客户满意度; |
| 5 | RoamMins(漫游时长) | 0.0897 | 漫游时长越长,流失率略高 —— 漫游资费透明性不足,客户易对账单产生质疑; |
核心结论:前 5 个特征的累计重要度达 67.39%,运营商应重点关注 “高通话量、高账单、有客服咨询记录” 的客户 —— 这类客户是流失高风险群体,需优先制定挽留策略。
六、落地建议:从模型到业务决策
模型预测不是终点,关键是将结果转化为可执行的运营策略。基于上述发现,建议运营商采取 3 类针对性措施:
6.1 高风险客户挽留:精准触达
- 目标客户:模型预测为 “高流失风险”(概率≥80%),且月账单>70 元的客户;
- 策略:
- 套餐优化:主动推送 “高通话量专属套餐”(如 “1000 分钟通话 + 10GB 流量,月费降至 59 元”);
- 客服回访:安排专属客服回访,解决前期未处理的咨询问题(如 “上次您反馈的账单疑问,已为您核实并调整”);
- 超额提醒:对历史有超额费用的客户,设置 “消费接近套餐上限时短信提醒”,避免意外超额。
6.2 服务体验优化:降低流失诱因
- 针对客服通话:优化首次咨询解决率(如 “客服岗前培训 + 问题知识库升级”),避免客户因 “多次咨询未解决” 流失;
- 针对漫游客户:推出 “透明漫游套餐”(如 “国内漫游无额外费用,国际漫游按天计费”),消除资费不确定性。
6.3 效果评估:闭环迭代
- 数据监控:跟踪挽留后 1 个月内的客户流失率,若目标客户流失率从 20% 降至 8% 以下,说明策略有效;
- 模型迭代:每季度更新数据集(加入新客户特征,如 5G 套餐使用情况),重新训练模型,确保预测准确性。
七、总结与展望
7.1 项目成果
- 模型性能:构建的随机森林模型 AUC 值达 0.9964,查准率、查全率均为 97%,可精准识别潜在流失客户;
- 核心发现:日均通话时长、月账单、客服通话次数是影响流失的 TOP3 因素,累计重要度超 48%;
- 落地价值:若运营商基于模型精准挽留,预计可降低流失率 30-50%,年利润提升 5-10%(按行业平均水平测算)。
附:核心代码片段(Python)
1. 数据采样(过采样)
import pandas as pd
from sklearn.utils import resample
# 读取数据
data = pd.read_csv("telecom_churn.csv")
# 分离正负样本
df_majority = data[data.Churn == 0] # 多数类(未流失)
df_minority = data[data.Churn == 1] # 少数类(流失)
# 过采样少数类
df_minority_upsampled = resample(df_minority,
replace=True, # 允许重复采样
n_samples=len(df_majority), # 匹配多数类数量
random_state=42)
# 合并数据
df_upsampled = pd.concat([df_majority, df_minority_upsampled])
print("过采样后数据分布:", df_upsampled.Churn.value_counts())
2. 随机森林参数调优(网格搜索)
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, train_test_split
from sklearn.metrics import roc_auc_score
# 划分特征与目标变量
X = df_upsampled.drop("Churn", axis=1)
y = df_upsampled["Churn"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 定义参数网格
param_grid = {
'n_estimators': range(50, 151, 20), # 决策树数量
'max_features': range(1, 11, 1) # 最大特征数
}
# 网格搜索
rf = RandomForestClassifier(random_state=42)
grid_search = GridSearchCV(estimator=rf,
param_grid=param_grid,
cv=10, # 十折交叉验证
scoring='roc_auc') # 以AUC为评估指标
# 训练与最优参数
grid_search.fit(X_train, y_train)
print("最优参数:", grid_search.best_params_) # 输出:{'max_features': 1, 'n_estimators': 91}
# 最优模型评估
best_rf = grid_search.best_estimator_
y_pred_proba = best_rf.predict_proba(X_test)[:, 1]
print("最优模型AUC值:", roc_auc_score(y_test, y_pred_proba)) # 输出:0.9964
3. 特征重要度可视化
import matplotlib.pyplot as plt
import seaborn as sns
# 计算特征重要度
feature_importance = pd.DataFrame({
'Feature': X.columns,
'Importance': best_rf.feature_importances_
}).sort_values('Importance', ascending=False)
# 可视化
plt.figure(figsize=(10, 6))
sns.barplot(x='Importance', y='Feature', data=feature_importance)
plt.title('电信客户流失特征重要度排序')
plt.xlabel('重要度')
plt.ylabel('特征名称')
plt.show()
通过这套 “数据挖掘 + 机器学习” 方案,运营商可从 “被动应对流失” 转为 “主动精准挽留”,不仅降低流失率,更能提升客户满意度与长期利润。未来,随着数据维度的丰富与算法的迭代,模型将具备更强的实用价值。
更多推荐


所有评论(0)