使用 PyCaret 预测客户流失
最后更新于
这对你有帮助吗?
最后更新于
这对你有帮助吗?
客户留存是订阅制商业模式公司最重要的关键绩效指标 (KPI) 之一。竞争非常激烈,尤其是在 SaaS 市场,客户可以自由选择众多提供商。一次糟糕的体验可能就会导致客户转投竞争对手,从而造成客户流失。
客户流失是指在特定时间范围内停止使用你公司产品或服务的客户百分比。计算流失率的一种方法是将给定时间间隔内失去的客户数量除以期初的活跃客户数量。例如,如果你上个月有 1000 个客户,流失了 50 个,那么你的月流失率为 5%。
预测客户流失是一个具有挑战性但极其重要的业务问题,尤其是在客户获取成本 (CAC) 较高的行业,如科技、电信、金融等。能够在客户流失的高风险期尚有时间采取措施时预测到这一点,对于公司而言意味着巨大的额外潜在收入来源。
客户流失预测模型的主要目标是通过主动与流失风险最高的客户互动来留住他们。例如:提供礼品券或任何促销价格,并锁定他们一年或两年,以延长他们对公司的生命周期价值。
这里有两个主要的概念需要理解
我们希望客户流失预测模型能够提前预测流失(例如提前一个月、三个月甚至六个月——这取决于具体用例)。这意味着你必须对截止日期极其小心,即不应使用截止日期之后的任何信息作为机器学习模型的特征,否则会导致数据泄露。截止日期之前的时期称为 事件期。
通常对于客户流失预测,你需要花一些功夫来创建 目标列,因为它通常不是你想要的格式。例如,你想预测客户是否会在下个季度流失,因此你会遍历截止到事件日期的所有活跃客户,并检查他们在下个季度是否离开了公司(1 表示是,0 表示否)。在这种情况下,这个季度称为 绩效窗口期。
现在你已经理解了数据的来源以及如何创建流失目标(这是问题中最具挑战性的部分之一),让我们讨论一下这个机器学习模型将如何在业务中使用。请从左到右阅读下面的图表
使用客户流失历史数据(事件期用于 X 特征,绩效窗口期用于目标变量)训练模型。
每个月将活跃客户群输入到 机器学习预测模型 中,以返回每个客户的流失概率(在商业术语中,这有时称为流失评分)。
该列表将按概率值(或他们所说的评分)从高到低排序,客户留存团队将开始与客户互动,以阻止流失,通常通过提供某种促销或礼品卡来锁定他们再留几年。
流失概率非常低的客户(或者说模型预测不会流失的客户)是满意的客户。无需对他们采取任何行动。
请注意 TotalCharges 的类型是 object 而不是 float64。经过调查,我发现这一列中存在一些空白字符,这导致 Python 强制将数据类型设为 object 。为了解决这个问题,我们需要在更改数据类型之前去除空白字符。
直观来看,合同类型、客户在网时长 (tenure) 和资费计划是预测客户流失或留存非常重要的信息。让我们探讨一下它们之间的关系
请注意,大部分流失都出现在“按月”合同中。这当然很合理。此外,我可以看到随着在网时长的增加,总费用也随之增加,在网时长长但费用低的客户流失可能性要小于在网时长长且费用高的客户。
缺失值
请注意,由于我们将空白值替换为了 np.nan,TotalCharges 列现在有 11 行缺失值。没问题——我会交给 PyCaret 自动进行填充。
无论何时你在 PyCaret 中初始化 setup 函数,它都会分析数据集并推断所有输入特征的数据类型。在这种情况下,你可以看到除了 tenure MonthlyCharges 和 TotalCharges 之外,其他所有特征都是类别型的,这是正确的,你现在可以按 Enter 继续。如果数据类型推断不正确(有时可能会发生),你可以使用 numeric_feature 和 categorical_feature 参数来覆盖数据类型。
此外,请注意我在 setup 函数中传递了 ignore_features = ['customerID'] 参数,这样在训练模型时就不会考虑它。这样做的好处是 PyCaret 不会从数据集中删除该列,它只是在后台忽略它用于模型训练。因此,当你在最后生成预测结果时,无需担心自己重新将 ID 合并回去。
数据准备完成后,让我们使用 compare_models 功能开始训练过程。此函数会训练模型库中所有可用的算法,并使用交叉验证评估多个性能指标。
基于 AUC 的最佳模型是 Gradient Boosting Classifier。使用 10 折交叉验证得到的 AUC 是 0.8472。
你可以使用 PyCaret 的 tune_model 函数来自动调整模型的超参数。
请注意,AUC 从 0.8472 略微增加到了 0.8478 。
这个混淆矩阵是针对测试集的,测试集包含我们数据的 30%(2,113 行)。我们有 309 个 真阳性 (15%)——这些是我们能够延长生命周期价值的客户。如果我们没有预测到,就没有干预的机会。
我们还有 138 个 (7%) 假阳性,这些客户会让我们赔钱,因为给他们的促销活动只会是额外的成本。
1,388 个 (66%) 是真阴性(好客户),278 个 (13%) 是 假阴性(这是一个错失的机会)。
到目前为止,我们训练了多个模型,选择 AUC 最高的最佳模型,然后对最佳模型进行超参数调优,以在 AUC 方面进一步提升性能。然而,最高的 AUC 不一定能转化为对业务最好的模型。
在流失模型中,真阳性 的回报与 假阳性 的成本通常大不相同。我们使用以下假设
向所有被识别为流失的客户(真阳性 + 假阳性)提供价值 1,000 美元的代金券;
如果我们能够阻止流失,我们将获得 5,000 美元的客户生命周期价值。
使用这些假设和上面的混淆矩阵,我们可以计算出该模型的美元影响
这是一个不错的模型,但问题在于它不是一个业务智能的模型。相比于没有模型,它做得已经很好了,但我们如何训练和选择一个能最大化业务价值的模型呢?为了实现这一点,我们必须使用业务指标,而不是任何常规指标(如 AUC 或准确率)来训练、选择和优化模型。
多亏了 PyCaret,使用 add_metric 函数可以非常轻松地实现这一点。
现在让我们运行 compare_models 并看看神奇之处。
请注意,这次添加了一个新的 Profit 列,令人惊讶的是,在 AUC 方面表现相当糟糕的 Naive Bayes 模型在利润方面却是最佳模型。让我们看看原因
客户总数仍然相同(测试集中的 2,113 个客户),变化的是模型现在在假阳性和假阴性上的错误方式。让我们用美元价值来衡量它,使用相同的假设(如上所述)
***砰! *我们刚刚通过一个 AUC 比最佳模型低 2% 的模型,将利润提高了约 400,000 美元。这是怎么发生的?嗯,首先,AUC 或任何其他开箱即用的分类指标(准确率、召回率、精确率、F1 分数、Kappa 等)都不是业务智能指标,因此它没有考虑风险和回报的权衡。添加自定义指标并将其用于模型选择或优化是一个很棒的主意,也是正确的做法。
使用这个轻量级的 Python 工作流自动化库,你可以实现无限可能。如果你觉得这很有用,请不要忘记在我们的 GitHub 仓库上给我们一个 ⭐️。
在本节中,我将演示机器学习模型训练与选择、超参数调优、结果分析和解释的完整端到端工作流。我还将讨论你可以优化的指标,以及为什么像 AUC、准确率、召回率这样的传统指标可能不适合客户流失模型。我将使用—— 一个开源、低代码的机器学习库来执行这个实验。本教程假设你对 PyCaret 有基本的了解。
是一个开源、低代码的机器学习库和端到端模型管理工具,内置于 Python 中,用于自动化机器学习工作流。PyCaret 以其易用性、简洁性以及快速高效地构建和部署端到端机器学习流水线的能力而闻名。要了解更多关于 PyCaret 的信息,请查阅其.
在本教程中,我将使用一个来自 Kaggle 的数据集。该数据集已经包含了我们可以直接使用的目标列。你可以直接从这个链接中读取该数据集。(特别感谢 srees1988)
在 PyCaret 的所有模块中都一样,setup 是在 PyCaret 中执行任何机器学习实验的第一个也是唯一一个强制性步骤。此函数负责处理训练模型之前所需的所有数据准备工作。除了执行一些基本的默认处理任务外,PyCaret 还提供广泛的预处理功能。要了解 PyCaret 中的所有预处理功能,你可以查阅这个.
我希望你能体会到 PyCaret 的简洁和易用性。仅用几行代码,我们就能够训练多个模型并选择对业务重要的那个。我是一名定期博主,主要撰写关于 PyCaret 及其在实际应用中的案例。如果你想收到自动通知,可以关注我的, ,和.
要了解更多关于 PyCaret 的信息,请关注我们的和.
加入我们的 Slack 频道。邀请链接.