Scikit-learn 中文教程

第二部分:Scikit-learn 核心基础
第 3 章 Scikit-learn 核心设计与 API 体系
第 4 章 数据集模块与数据划分
第三部分:数据预处理与特征工程
第 5 章 数据预处理核心模块(sklearn.preprocessing)
第 6 章 特征工程:提取、选择与构建
第四部分:模型评估与验证
第 7 章 模型评估指标(按任务类型划分)
第 8 章 模型验证与超参数调优
第五部分:Scikit-learn 核心算法模块
第 9 章 有监督学习:分类算法
第 10 章 有监督学习:回归算法
第 11 章 无监督学习:聚类与密度算法
第 12 章 半监督学习与其他常用算法
第八部分:性能优化与问题解决
第 18 章 Scikit-learn 性能优化
第 19 章 Scikit-learn 常见问题与解决方案

14.1 实战 1:客户流失预测(分类任务 + 业务落地)

Scikit-learn客户流失预测实战教程:分类任务与业务落地指南

Scikit-learn 中文教程

本教程是Scikit-learn实战系列的第一章,详细讲解如何使用Scikit-learn和相关工具进行客户流失预测分类任务,涵盖从业务需求分析到模型落地的全流程,适合新手学习并应用到电信或电商领域提升客户留存率。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

实战 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服务。在后续章节中,我们将深入其他分类和回归任务。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包