14.1 实战 1:客户流失预测(分类任务 + 业务落地)
Scikit-learn客户流失预测实战教程:分类任务与业务落地指南
本教程是Scikit-learn实战系列的第一章,详细讲解如何使用Scikit-learn和相关工具进行客户流失预测分类任务,涵盖从业务需求分析到模型落地的全流程,适合新手学习并应用到电信或电商领域提升客户留存率。
实战 1:客户流失预测(分类任务 + 业务落地)
引言
欢迎来到Scikit-learn高级实战教程的第一章!在这一章中,我们将聚焦于一个常见的业务问题:客户流失预测。无论你是在电信、电商还是其他行业,客户流失都是影响业务增长的关键因素。通过机器学习模型预测哪些客户可能流失,并采取措施提升留存率,可以显著降低成本并增加收益。本教程将带你一步步实现一个完整的分类任务,从数据准备到模型落地。我们将使用Scikit-learn作为核心框架,结合XGBoost和LightGBM等流行库,确保内容简单易懂,适合初学者上手。
1. 业务需求分析
客户流失指的是客户停止使用服务或购买产品的行为。在电信或电商领域,高流失率会导致收入下降和客户获取成本增加。业务目标是预测哪些客户可能流失,以便通过个性化营销、优惠策略或改善服务来提升留存率。作为机器学习工程师,我们的任务是构建一个分类模型,输入客户特征(如使用历史、账户信息等),输出流失概率。
2. 数据探索与预处理
在开始建模前,我们需要了解数据和清理它。假设我们有一个数据集,包含客户ID、通话时长、月费、投诉次数等特征。
数据加载
使用Pandas库加载数据:
import pandas as pd
# 加载数据
data = pd.read_csv('customer_churn.csv')
print(data.head())
print(data.info())
缺失值处理
缺失值是常见问题,可以删除或填充。例如,用中位数或众数填充数值和类别特征。
# 检查缺失值
print(data.isnull().sum())
# 填充缺失值:用中位数填充数值列,众数填充类别列
data['age'].fillna(data['age'].median(), inplace=True)
data['gender'].fillna(data['gender'].mode()[0], inplace=True)
异常值检测
异常值可能影响模型性能,可以使用IQR方法或可视化检测。
import numpy as np
# 使用IQR检测异常值
Q1 = data['monthly_charges'].quantile(0.25)
Q3 = data['monthly_charges'].quantile(0.75)
IQR = Q3 - Q1
outliers = (data['monthly_charges'] < Q1 - 1.5 * IQR) | (data['monthly_charges'] > Q3 + 1.5 * IQR)
print(f'异常值数量: {outliers.sum()}')
# 可以选择删除或处理异常值
data_cleaned = data[~outliers]
类别特征编码
机器学习模型需要数值输入,所以类别特征如'gender'或'contract_type'需要编码。常用方法是独热编码(One-Hot Encoding)或标签编码(Label Encoding)。
from sklearn.preprocessing import OneHotEncoder, LabelEncoder
# 例如,使用独热编码处理'gender'特征
encoder = OneHotEncoder(sparse=False)
gender_encoded = encoder.fit_transform(data[['gender']])
data_encoded = pd.concat([data.drop('gender', axis=1), pd.DataFrame(gender_encoded, columns=encoder.get_feature_names_out())], axis=1)
3. 特征工程
好的特征是模型成功的关键。特征工程包括选择相关特征、创建新特征和评估重要性。
特征选择
使用相关系数或基于树的方法(如随机森林特征重要性)选择特征。
from sklearn.ensemble import RandomForestClassifier
import matplotlib.pyplot as plt
# 假设target是'churn'列
X = data_encoded.drop('churn', axis=1)
y = data_encoded['churn']
# 计算特征重要性
model = RandomForestClassifier(random_state=42)
model.fit(X, y)
importance = model.feature_importances_
feature_names = X.columns
# 可视化特征重要性
plt.figure(figsize=(10,6))
plt.barh(feature_names, importance)
plt.xlabel('Importance')
plt.title('Feature Importance')
plt.show()
创建交叉特征
交叉特征是指组合多个特征生成新特征,例如创建'平均通话时长'乘以'月费'。
# 例如,创建新特征'total_usage_value'
data_encoded['total_usage_value'] = data_encoded['avg_call_duration'] * data_encoded['monthly_charges']
4. 模型训练与融合
我们将使用强力的梯度提升树模型XGBoost和LightGBM,并通过投票法融合它们。
模型训练
首先,分割数据为训练集和测试集。
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=42)
然后,训练XGBoost和LightGBM模型。
import xgboost as xgb
import lightgbm as lgb
# XGBoost
xgb_model = xgb.XGBClassifier(random_state=42)
xgb_model.fit(X_train, y_train)
# LightGBM
lgb_model = lgb.LGBMClassifier(random_state=42)
lgb_model.fit(X_train, y_train)
模型融合(投票法)
投票法结合多个模型,以提高预测稳定性。
from sklearn.ensemble import VotingClassifier
# 创建投票分类器
voting_model = VotingClassifier(estimators=[('xgb', xgb_model), ('lgb', lgb_model)], voting='soft') # 软投票基于概率
voting_model.fit(X_train, y_train)
5. 模型评估与调优
评估模型性能并使用调优方法提升。
评估指标
分类任务常用AUC和精确率-召回率曲线。
from sklearn.metrics import roc_auc_score, precision_recall_curve
# 预测测试集
y_pred_proba = voting_model.predict_proba(X_test)[:, 1]
# 计算AUC
auc = roc_auc_score(y_test, y_pred_proba)
print(f'AUC: {auc}')
# 精确率-召回率曲线
precision, recall, thresholds = precision_recall_curve(y_test, y_pred_proba)
调优(贝叶斯优化)
贝叶斯优化可以高效调超参数。使用Optuna库。
import optuna
# 定义目标函数
def objective(trial):
param = {
'n_estimators': trial.suggest_int('n_estimators', 100, 500),
'learning_rate': trial.suggest_float('learning_rate', 0.01, 0.3),
'max_depth': trial.suggest_int('max_depth', 3, 10)
}
model = xgb.XGBClassifier(**param, random_state=42)
model.fit(X_train, y_train)
score = roc_auc_score(y_test, model.predict_proba(X_test)[:, 1])
return score
# 运行优化
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=50)
print('Best parameters:', study.best_params)
6. 模型落地
将模型应用到实际业务中,预测流失概率并进行客户分层。
流失概率预测
使用训练好的模型对新数据预测流失概率。
# 假设有新的客户数据new_data
new_data = pd.read_csv('new_customers.csv')
# 预处理new_data与训练数据相同
# ...(省略预处理步骤)
# 预测流失概率
churn_probabilities = voting_model.predict_proba(new_data)[:, 1]
客户分层
基于流失概率将客户分层,例如高风险(概率 > 0.8)、中风险(0.5-0.8)、低风险(< 0.5)。
# 定义分层
new_data['churn_risk'] = pd.cut(churn_probabilities, bins=[0, 0.5, 0.8, 1], labels=['低风险', '中风险', '高风险'])
print(new_data[['customer_id', 'churn_risk']].head())
总结
在本章中,我们完成了一个完整的客户流失预测项目。从业务分析到模型落地,我们使用了Scikit-learn和其他工具处理数据、构建和优化模型。关键点是:数据预处理确保质量,特征工程提升模型表现,模型融合增强稳定性,调优方法如贝叶斯优化提高精度,最后将模型应用到实际中帮助业务决策。希望这个实战案例能帮助你快速上手Scikit-learn,并在实际业务中应用机器学习。
下一步建议:尝试使用不同数据集或模型,探索更多特征工程技巧,或学习如何部署模型为API服务。在后续章节中,我们将深入其他分类和回归任务。