使用 PyCaret 预测客户流失
使用 PyCaret 正确地预测客户流失
一步一步指南,教你如何使用 PyCaret 正确地预测客户流失,从而优化业务目标并提高投资回报率
介绍
对于以订阅模式为基础的公司来说,客户保留率是主要的关键绩效指标之一。在 SaaS 市场,竞争尤为激烈,客户可以自由选择众多供应商。一次不好的体验可能导致客户转向竞争对手,从而导致客户流失。
什么是客户流失?
客户流失是指在一定时间内停止使用公司产品或服务的客户所占的百分比。计算流失率的一种方法是将在给定时间间隔内失去的客户数量除以期初活跃客户的数量。例如,如果你有1000个客户,上个月失去了50个客户,那么你的月度流失率为5%。
预测客户流失是一个具有挑战性但极其重要的业务问题,特别是在客户获取成本(CAC)高的行业,如技术、电信、金融等。能够预测某个特定客户流失的风险,并在还有时间采取措施的情况下,为公司带来巨大的额外潜在收入。
客户流失机器学习模型在实践中如何使用?
客户流失预测模型的主要目标是通过与高风险流失客户积极互动来保留客户。例如:提供礼品券或任何促销定价,并将他们锁定一年或两年以延长他们对公司的生命周期价值。
这里有两个要理解的概念:
- 我们希望客户流失预测模型能够提前预测流失(比如提前一个月、三个月甚至六个月——这完全取决于使用情况)。这意味着你必须非常小心截止日期,即在机器学习模型中不应使用截止日期之后的任何信息作为特征,否则会造成信息泄漏。截止日期之前的时期被称为事件。
- 通常情况下,对于客户流失预测,你需要做一些工作来创建一个_目标列_,它通常不以你想要的形式提供。例如,你想预测客户是否会在下一个季度流失,因此你将遍历截止日期之后的所有活跃客户,并检查他们是否在下一个季度离开了公司(是为1,否为0)。在这种情况下,这个季度被称为性能窗口。
客户流失模型工作流程
现在你了解了数据的来源和如何创建流失目标(这是问题中最具挑战性的部分之一),让我们讨论一下这个机器学习模型在业务中的使用方式。从左到右阅读下面的图表:
- 在客户流失历史数据上训练模型(事件期间的X特征和目标变量的性能窗口)。
- 每个月将活跃客户基数传递给机器学习预测模型,以返回每个客户流失的概率(在业务术语中,有时称为流失分数)。
- 列表将按照概率值(或分数)从高到低排序,客户保留团队将开始与客户互动,以阻止流失,通常是通过提供某种促销或礼品卡来锁定更多年份。
- 预测模型对于流失概率非常低(或者基本上模型预测没有流失)的客户来说,他们是满意的客户。对他们不采取任何行动。
让我们从实际示例开始
在本节中,我将演示完整的机器学习模型训练和选择、超参数调整、分析和结果解释的端到端工作流程。我还将讨论可以优化的指标以及为什么传统指标如AUC、准确率、召回率可能不适用于客户流失模型。我将使用 PyCaret —— 一个开源的、低代码的机器学习库来执行这个实验。本教程假设你具备基本的 PyCaret 知识。
PyCaret
PyCaret 是一个开源的、低代码的机器学习库和用 于自动化机器学习工作流的端到端模型管理工具,使用 Python 构建。PyCaret 以其易用性、简洁性和快速高效地构建和部署端到端机器学习流程的能力而闻名。要了解更多关于 PyCaret 的信息,请访问他们的 GitHub。
安装 PyCaret
# 安装 pycaret
pip install pycaret
👉 数据集
在本教程中,我使用了一个来自 Kaggle 的 电信客户流失 数据集。数据集已经包含了我们可以直接使用的目标列。你可以从这个 GitHub 链接直接读取这个数据集。(感谢 srees1988)
# 导入库
import pandas as pd
import numpy as np
# 读取 csv 数据
data = pd.read_csv('[https://raw.githubusercontent.com/srees1988/predict-churn-py/main/customer_churn_data.csv'](https://raw.githubusercontent.com/srees1988/predict-churn-py/main/customer_churn_data.csv'))
👉 探索性数据分析
# 检查数据类型
data.dtypes
注意,TotalCharges 的数据类型是对象类型而不是 float64。经过调查,我发现该列中有一些空格,导致 Python 将数据类型强制为对象。为了解决这个问题,我们需要在更改数据类型之前去除空格。
# 用 np.nan 替换空格
data['TotalCharges'] = data['TotalCharges'].replace(' ', np.nan)
# 转换为 float64
data['TotalCharges'] = data['TotalCharges'].astype('float64')
直观地说,合同类型、续约时长(客户停留时间)和定价计划在客户流失或保留方面非常重要。让我们探索一下它们之间的关系:
注意,大多数流失发生在“月付”合同中。这是合理的。此外,我还可以看到随着续约时长和总费用的增加,具有高续约时长和低费用的客户的可能性较低,而具有高续约时长和高费用的客户的可能性较高。
缺失值
# 检查缺失值
data.isnull().sum()
注意,由于我们用 np.nan 替换了空值,现在 TotalCharges 列中有 11 行缺失值。没问题 — 我将让 PyCaret 自动填充它。
👉 数据准备
在 PyCaret 的所有模块中,setup 是在进行任何机器学习实验之前的第一个且唯一必需的步骤。这个函数负责在训练模型之前进行所有的数据准备工作。除了执行一些基本的默认处理任务外,PyCaret 还提供了各种预处理功能。要了解有关 PyCaret 中所有预处理功能的更多信息,可以查看这个 链接。
# 初始化 setup
from pycaret.classification import *
s = setup(data, target = 'Churn', ignore_features = ['customerID'])
每当你在 PyCaret 中初始化 setup 函数时,它会对数据集进行分析,并推断出所有输入特征的数据类型。在这种情况下,你可以看到除了 tenure、MonthlyCharges 和 TotalCharges 之外,其他所有特征都是分类的,这是正确的,你现在可以按回车键继续。如果数据类型没有被正确推断(有时会发生),你可以使用 numeric_feature 和 categorical_feature 来覆盖数据类型。
此外,注意我在 setup 函数中传递了 ignore_features = ['customerID'],这样在训练模型时它就不会被考虑。这样做的好处是 PyCaret 不会从数据集中删除该列,它只会在模型训练时在后台忽略它。因此,在生成最终的预测时,你不需要担心自己手动连接 ID。