1. 项目概述
电信行业用户流失预测是一个经典的机器学习应用场景。通过分析用户行为数据,我们可以建立预测模型,提前识别可能流失的高风险用户,从而采取针对性的挽留措施。这个案例展示了如何使用逻辑回归算法构建一个完整的用户流失预测模型。
在实际业务中,用户流失率每降低5%,企业利润就可能提升25%-85%。因此,准确预测用户流失对电信运营商至关重要。本项目将带你从数据预处理、可视化分析到模型训练和评估,完整实现一个可落地的预测系统。
2. 数据准备与预处理
2.1 数据加载与初步探索
我们使用的数据集包含电信用户的多个特征,包括合同类型、互联网服务、支付方式等。首先需要加载数据并进行初步探索:
python复制import pandas as pd
# 加载数据集
churn_df = pd.read_csv('E:/python-work/机器学习/逻辑回归/churn.csv')
# 查看数据前5行
print(churn_df.head(5))
# 查看数据基本信息
churn_df.info()
这一步帮助我们了解数据的基本结构,包括特征数量、类型以及是否存在缺失值。电信数据通常包含数值型和类别型特征,需要分别处理。
2.2 类别型特征编码
逻辑回归算法要求输入数据都是数值型,因此需要对类别型特征进行编码处理:
python复制# 对Churn和gender列进行one-hot编码
churn_df = pd.get_dummies(churn_df, columns=['Churn', 'gender'])
# 删除冗余列(避免多重共线性)
churn_df.drop(['Churn_No', 'gender_Male'], axis=1, inplace=True)
# 重命名标签列
churn_df.rename(columns={'Churn_Yes':'flag'}, inplace=True)
注意:在one-hot编码后,我们需要删除一个冗余列以避免"虚拟变量陷阱"。例如,性别列经过编码后会产生gender_Male和gender_Female两列,保留一列就足以表示完整信息。
2.3 数据分布检查
了解目标变量的分布情况对建模至关重要:
python复制print(churn_df.flag.value_counts())
电信用户流失数据通常是不平衡的(流失用户占少数)。如果严重不平衡(如流失用户<10%),需要考虑采用过采样、欠采样或调整类别权重等方法。
3. 数据可视化分析
3.1 合同类型与流失关系
可视化可以帮助我们直观理解特征与流失率的关系:
python复制import seaborn as sns
import matplotlib.pyplot as plt
# 绘制合同类型与流失关系
sns.countplot(data=churn_df, x='Contract_Month', hue='flag')
plt.show()
从图中可以看出,按月签约的用户流失率明显高于按年签约的用户。这符合业务常识:长期合约用户通常更稳定。
3.2 其他特征分析
类似的,我们可以分析其他特征与流失的关系:
python复制# 分析支付方式与流失关系
sns.countplot(data=churn_df, x='PaymentElectronic', hue='flag')
plt.show()
# 分析互联网服务与流失关系
sns.boxplot(data=churn_df, x='flag', y='MonthlyCharges')
plt.show()
这些可视化分析不仅帮助我们理解数据,也为后续特征选择提供依据。
4. 模型构建与训练
4.1 特征选择与数据集划分
基于前面的分析,我们选择最具预测力的特征:
python复制# 选择特征列
x = churn_df[['Contract_Month','internet_other','PaymentElectronic']]
y = churn_df['flag']
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(
x, y, test_size=0.2, random_state=23)
提示:random_state参数确保每次运行都能得到相同的划分结果,这对结果复现很重要。
4.2 逻辑回归模型训练
python复制from sklearn.linear_model import LogisticRegression
# 创建并训练模型
estimator = LogisticRegression()
estimator.fit(x_train, y_train)
逻辑回归是线性分类器,适合作为基线模型。它的优势是训练速度快、可解释性强,可以输出每个特征的系数,反映其对预测结果的影响程度。
4.3 模型预测
python复制# 在测试集上进行预测
y_pred = estimator.predict(x_test)
5. 模型评估与优化
5.1 基础评估指标
python复制from sklearn.metrics import (accuracy_score, precision_score,
recall_score, f1_score,
classification_report)
print(f'准确率:{accuracy_score(y_test, y_pred)}')
print(f'精确率:{precision_score(y_test, y_pred)}')
print(f'召回率:{recall_score(y_test, y_pred)}')
print(f'F1值:{f1_score(y_test, y_pred)}')
print(f'分类评估报告:\n{classification_report(y_test, y_pred)}')
对于不平衡数据集,准确率(Accuracy)可能不是最佳指标,应该更关注精确率(Precision)和召回率(Recall)的平衡。
5.2 ROC曲线与AUC值
python复制from sklearn.metrics import roc_curve, roc_auc_score
import matplotlib.pyplot as plt
# 计算预测概率
y_pred_prob = estimator.predict_proba(x_test)[:, 1]
# 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)
# 绘制ROC曲线
plt.plot(fpr, tpr)
plt.plot([0, 1], [0, 1], 'k--')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
# 计算AUC值
print(f'AUC值:{roc_auc_score(y_test, y_pred_prob)}')
AUC值越接近1,模型区分能力越强。电信行业通常要求AUC>0.7才有实用价值。
5.3 模型优化方向
-
特征工程:
- 尝试更多特征组合
- 创建新特征(如使用时长/消费比)
- 对数值特征进行标准化/归一化
-
处理类别不平衡:
python复制# 使用类别权重 estimator = LogisticRegression(class_weight='balanced') -
尝试其他算法:
- 随机森林
- 梯度提升树(GBDT)
- 神经网络
6. 模型部署与应用
6.1 模型保存与加载
python复制import joblib
# 保存模型
joblib.dump(estimator, 'churn_model.pkl')
# 加载模型
loaded_model = joblib.load('churn_model.pkl')
6.2 业务应用场景
- 高风险用户识别:定期运行模型,识别高风险用户
- 定向营销:对高风险用户提供优惠或增值服务
- 产品改进:分析高流失率用户特征,优化产品设计
6.3 模型监控与更新
建立模型性能监控机制,定期评估模型效果。当业务环境或用户行为发生变化时,需要重新训练模型。
7. 常见问题与解决方案
7.1 数据质量问题
问题:数据中存在缺失值或异常值
解决方案:
python复制# 处理缺失值
churn_df.fillna(churn_df.mean(), inplace=True)
# 处理异常值
from scipy import stats
churn_df = churn_df[(np.abs(stats.zscore(churn_df.select_dtypes(include=[np.number]))) < 3).all(axis=1)]
7.2 模型过拟合
问题:训练集表现很好但测试集表现差
解决方案:
python复制# 增加正则化
estimator = LogisticRegression(penalty='l2', C=0.1)
7.3 特征重要性分析
理解哪些特征对预测影响最大:
python复制# 获取特征系数
coefficients = pd.DataFrame({
'Feature': x.columns,
'Coefficient': estimator.coef_[0]
}).sort_values('Coefficient', ascending=False)
7.4 模型解释性
逻辑回归的优势在于可解释性。我们可以计算每个特征的odds ratio:
python复制import numpy as np
# 计算odds ratio
odds_ratios = pd.DataFrame({
'Feature': x.columns,
'Odds Ratio': np.exp(estimator.coef_[0])
}).sort_values('Odds Ratio', ascending=False)
8. 项目扩展与进阶
8.1 集成学习方法
尝试更强大的集成模型:
python复制from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100)
rf.fit(x_train, y_train)
8.2 自动化机器学习
使用AutoML工具简化流程:
python复制from tpot import TPOTClassifier
tpot = TPOTClassifier(generations=5, population_size=20)
tpot.fit(x_train, y_train)
8.3 实时预测系统
将模型部署为API服务:
python复制from flask import Flask, request, jsonify
import joblib
app = Flask(__name__)
model = joblib.load('churn_model.pkl')
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json()
prediction = model.predict([data['features']])
return jsonify({'prediction': int(prediction[0])})
if __name__ == '__main__':
app.run()
在实际项目中,我发现在特征工程阶段花费的时间往往比模型训练更多。电信数据通常包含大量用户行为特征,如何从中筛选出最具预测力的特征组合是关键。另外,模型上线后需要建立完善的监控机制,定期评估模型性能,因为用户行为模式会随时间变化。