towardsdatascience.com/causal-machine-learning-for-customer-retention-a-practical-guide-with-python-6bd959b25741?source=collection_archive---------1-----------------------#2024-08-30
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4444080567c58b7b2c0d88100cc89dd9.png
图片来源:Claudio Schwarz / Unsplash
一本通俗易懂的指南:如何用因果机器学习优化客户留存策略
作者:Arthur Cruiziat
发布平台:Towards Data Science
阅读时长:约20分钟
发布时间:2024年8月30日
本文为“建模与因果机器学习进阶”系列的第二篇,旨在从商业实践和技术实现两个维度深入剖析提升建模(uplift modeling)的应用。在继续阅读之前,建议先回顾本系列的第一篇文章,其中详细介绍了提升建模的基本概念及其对企业运营的价值。
相关文章链接:
https://towardsdatascience.com/?source=post_page---byline--6bd959b25741--------------------------------
https://medium.com/@arthur.cruiziat?source=post_page---byline--6bd959b25741--------------------------------
引言:从洞察到行动的跨越
设想这样一个场景:你作为某银行的老客户,最近因应用操作复杂而萌生退意。就在你准备更换服务提供商时,一位客服人员主动来电,耐心指导你使用关键功能,极大改善了你的体验。与此同时,你的女儿也正因高昂的交易费用考虑终止账户——但就在她即将注销前,系统自动向她推送了一张“一个月内免交易费”的优惠券。
这些看似巧合的背后,其实隐藏着一种强大的数据科学方法:提升建模。不同于传统模型仅预测客户流失概率,提升建模关注的是干预措施对个体行为的影响程度。换句话说,它能告诉我们:如果给某个客户发送邮件、提供折扣或致电沟通,他们留下来的可能性会增加多少?
通过这种因果推断能力,企业可以精准识别出那些“因干预而改变决策”的客户群体,避免资源浪费在本来就不会流失或无论如何都不会留下的用户身上。这不仅提升了营销效率,还显著增强了客户关系管理的个性化水平。
今天,我们将以客户留存为例,系统性地拆解提升建模的实施流程。从用例定义、数据准备、模型构建,到单一流程和多策略场景的实际应用,一步步带你掌握这项前沿技术的核心要点。
内容概览
- 明确业务用例:什么是客户流失?我们想留住谁?采取什么行动?
- 数据获取与处理:实施提升建模所需的关键数据类型及来源
- 模型原理详解:理解不同类型的提升模型工作机制
- 实战案例一:基于电子邮件活动的单一干预策略建模
- 实战案例二:多处理方式下的精细化个性化留存方案
第一步:清晰界定客户留存用例
要成功应用提升建模,首先必须对问题背景有清晰的认知。我们需要回答几个核心问题:
- 在当前业务模式下,“客户流失”具体指什么?
- 是否有特定的目标人群需要优先关注?依据是什么?
- 计划采用哪些干预手段来防止流失?
- 是否存在预算或资源限制?
只有明确了这些问题,才能确保后续建模工作具备实际意义和可执行性。
如何定义客户流失?
流失的定义高度依赖于企业的商业模式和行业特性,因此没有统一标准。以下是几种常见情形下的参考定义:
对于交易型公司,可以考虑以下指标:
- 交易频率下降
- 单次交易金额减少
- 距离上次交易的时间过长
- 账户活跃度持续降低
而对于订阅制企业,判断标准则更直接:
- 已取消订阅的用户
- 虽未取消但长期未使用产品的“沉默用户”
举例来说:
- 一家基于交易的科技公司可能将流失定义为“连续90天未发生任何交易”;
- 而一个移动应用平台则可能设定为“过去30天内未登录”即视为流失风险用户。
无论选择哪种定义,关键在于提前确定时间窗口和判定规则,以便准确标记训练数据中的“流失”状态。定义的复杂程度应根据公司实际需求平衡——既要足够精确,又要便于理解和执行。
设定流失预测的时间窗口
除了定义“何时算作流失”,还需要明确“我们希望提前多久进行预测”。这个时间段被称为流失预测窗口,它决定了模型输出结果的时间敏感性和实用性。
例如:
- 若预测未来7天内的流失,模型需高频更新,适合实时干预系统;
- 若预测未来30天或90天的流失,则更适合用于周期性营销活动规划。
合理设置预测窗口有助于匹配业务节奏,并为干预措施预留充足的操作时间。
明确了流失的定义之后,接下来我们需要确定希望防范的具体流失时间范围。也就是说,我们是要防止用户在接下来的15天内流失,还是30天内?这个选择将直接影响数据的组织方式以及留存策略的设计。建议在此处保持务实态度,原因有两点:
- 预测时间跨度越长,模型的稳定性与准确性越难维持。
- 采取干预措施后等待观察效果的时间越久,评估其真实影响的难度也越大。
因此,设定一个合理的预测窗口至关重要。如果我们把“流失”定义为未来30天内停止使用服务的用户行为,那么我们的预测目标也应设定为30天。这样既能给予我们足够的时间来实施干预策略,也能确保模型具备良好的预测能力。
关键在于,所选的时间框架必须兼顾两方面:一是为我们执行留存动作留出操作空间;二是保障模型在该时间段内的表现力和可靠性。
towardsdatascience.com/causal-machine-learning-for-customer-retention-a-practical-guide-with-python-6bd959b25741?source=collection_archive---------1-----------------------#2024-08-30
目标人群的选择(可选)
另一个需要考虑的问题是:是否要针对特定用户群体开展留存活动?这背后的动机可能多种多样:
- 某个细分市场的流失率近期明显上升。
- 希望优先保留高价值客户,以提升投资回报率。
- 聚焦新用户,增强初期活跃度并促进长期留存。
- 识别出极有可能短期内流失的用户进行重点干预。
根据实际业务场景的不同,你可能会选择只对部分用户采取行动。在本例中,我们将重点关注流失概率较高的用户群体,以便集中资源服务于最需要帮助的人群。
留存策略的制定
最后一步是明确我们将对用户实施哪些具体的留存措施。这项决策通常需要与业务团队紧密协作完成。在当前案例中,我们计划采用以下四种策略:
- 发送个性化邮件
- 通过应用内通知展示新功能或使用机会
- 由客服团队直接联系用户
- 提供专属优惠或折扣
其中,特别优惠的力度可以借助后续的提升模型进一步优化——例如判断何种折扣水平最能激发响应。而提升模型的核心作用正是帮助我们识别:对于不同用户而言,哪一种干预手段最有可能奏效。
至此,我们已经完成了关键准备工作:定义了流失标准、设定了预测周期,并规划了干预方案。现在,真正的挑战开始了——收集数据,并构建一个因果机器学习模型!
数据准备:构建提升模型的基础
要建立一个高效的提升模型,高质量的数据集不可或缺。理想情况下,该数据集应融合用户静态信息与实验性干预记录。
整合现有用户信息
首先,审视可用的用户数据。科技公司通常拥有丰富的用户行为和属性数据。在本案例中,我们需要获取以下层级的信息:
- 用户画像:年龄、地理位置、性别、获客渠道等
- 产品相关数据:注册或订阅日期、订阅等级等
- 交易历史:交易频率、平均订单金额、累计消费总额、购买的服务类型、距上次交易的时间等
- 参与度指标:登录频次、平台停留时长、功能使用情况统计等
虽然原始数据本身具有价值,但更关键的是分析这些变量随时间的变化趋势。这有助于发现潜在的行为模式,从而提升模型性能。实现这一点的方法包括:
- 对核心使用指标(如交易量)计算移动平均值(7天、30天等)
- 计算各项指标在一段时间内的相对变化率
- 在不同粒度(日、周等)上聚合数据
- 引入时间相关的季节性特征,如星期几、年度周数等
这些处理方式能够提取出“动态行为信号”,在预测用户响应倾向时极具价值。尽管具体特征工程细节超出本文讨论范围,但上述方法已被广泛验证为处理时间序列用户数据的最佳实践。
我们的最终目标是构建一个随时间演化的全面用户画像。这类动态数据将成为提升模型的重要基石,使我们不仅能预测谁会流失,更能精准判断哪些用户会对特定留存策略产生积极反应。
采集实验数据以支持因果推断
数据收集的第二阶段涉及与留存行动相关的干预数据。值得注意的是,提升建模并不强制要求随机实验数据。如果你已有历史干预记录——比如过去曾批量发送过促销邮件或发放优惠券——这些数据也可用于建模。然而,数据的新鲜程度和无偏性越强,结果越可靠。
非随机或观察性数据往往带有偏差,需通过额外技术(如倾向得分匹配)进行校正,这部分内容不在本文展开。
那么我们需要什么样的实验数据呢?本质上,我们要了解每项留存策略的实际影响。为此,应设计随机对照实验来测试这些干预措施的效果。关于如何正确设置此类实验,已有大量文献可供参考,此处不再赘述。仅强调一点:实验设计越严谨、样本量越大,训练出的模型效果通常越好。
实验结束后,我们会分析整体结果。虽然这些结果本身不直接用于构建模型,但它们提供了宝贵的基准信息,例如“平均处理效应”(ATE),即干预在整个群体中的平均影响。而在提升建模中,我们的真正目标是估计“条件平均处理效应”(CATE),也称“个体处理效应”(ITE)——也就是针对每个用户的个性化响应预测。
en.wikipedia.org/wiki/Uplift_modelling
使用合成数据进行演示
在本示例中,我们将利用 Uber 开发的 causalml Python 包生成合成数据集。Uber 在提升建模领域投入了大量研究,并开源了一个功能强大且文档齐全的工具包,极大简化了建模流程。
即使无法开展真实实验,提升建模依然可通过观察性数据提供有价值的洞察。只要数据足够丰富,包含用户特征、行为轨迹及干预反馈,结合适当的去偏技术,仍能有效估计个体层面的干预效果。
如果你对生成合成数据感兴趣,以下是我们实现这一过程的具体方法。
首先,我们通过 Python 的 pandas 库加载必要的数据处理工具,并从 causalml.dataset 模块中导入 make_uplift_classification 函数,用于构建具有因果推断特性的分类数据集。
towardsdatascience.com/causal-machine-learning-for-customer-retention-a-practical-guide-with-python-6bd959b25741?source=collection_archive---------1-----------------------#2024-08-30
接下来,我们定义多个字典来控制不同干预措施(treatment)对用户留存的影响。这些字典分别描述了每种干预方式下特征的数量和影响强度:
- n_uplift_increase_dict:指定每种干预手段中,能正向提升留存率的特征数量。例如,“email_campaign”对应2个正向特征,“voucher”则有4个。
- n_uplift_decrease_dict:表示会带来负面效果的特征数量。如“call_campaign”会导致2类用户群体的留存下降。
- delta_uplift_increase_dict:设定各项干预带来的正向提升幅度。比如优惠券(voucher)可使留存率提高10个百分点,而电话推广(call_campaign)提升8%。
- delta_uplift_decrease_dict:记录可能引起的负面效应程度。例如邮件营销可能导致部分用户流失,影响为2个百分点。
- n_uplift_increase_mix_informative_dict 和 n_uplift_decrease_mix_informative_dict:这两个字典用于配置同时具备信息性和因果效应的混合型特征数量,以增强数据的真实性和复杂性。
此外,我们设定了基础留存率为 0.7,即在无任何干预情况下,约有70%的用户会自然留存。该参数作为生成数据时的基准水平。
最终,基于上述配置,系统将调用 uplift 数据生成函数,构造出包含多种处理组、协变量及响应结果的结构化数据集,适用于后续的增量响应建模与个性化策略分析。
我们首先生成用于提升模型(uplift modeling)的数据集,使用如下参数配置:
df, feature_names = make_uplift_classification(
n_samples=20000, # 增加样本量以获得更稳健的结果
treatment_name=['email_campaign', 'in_app_notification', 'call_campaign', 'voucher'],
y_name='retention',
n_classification_features=20, # 提升特征数量
n_classification_informative=10,
n_uplift_increase_dict=n_uplift_increase_dict,
n_uplift_decrease_dict=n_uplift_decrease_dict,
delta_uplift_increase_dict=delta_uplift_increase_dict,
delta_uplift_decrease_dict=delta_uplift_decrease_dict,
n_uplift_increase_mix_informative_dict=n_uplift_increase_mix_informative_dict,
n_uplift_decrease_mix_informative_dict=n_uplift_decrease_mix_informative_dict,
positive_class_proportion=positive_class_proportion,
random_seed=42
)
接下来,对处理组(treatment groups)进行数值编码,以便后续建模使用。定义映射关系如下:
encoding_dict = {
'call_campaign': 3,
'email_campaign': 1,
'voucher': 4,
'in_app_notification': 2,
'control': 0
}
基于上述字典,创建一个新的数值型处理组列:
df['treatment_group_numeric'] = df['treatment_group_key'].map(encoding_dict)
towardsdatascience.com/causal-machine-learning-for-customer-retention-a-practical-guide-with-python-6bd959b25741?source=collection_archive---------1-----------------------#2024-08-30
数据结构说明
最终的数据组织形式应如上图所示。在实际应用场景中,这类数据通常会按时间维度进行聚合处理——例如,针对每位用户,在干预发生前汇总其过去每日或每周的行为与属性信息。
- X 到 X:表示个体层级的特征变量,即每个用户的可观测属性;
- T:表示所施加的处理变量,可以是二元值(如 1 表示处理,0 表示对照),也可以扩展为多类别(如不同类型的营销策略);
- Y:表示结果变量,本例中为用户是否留存(retention),是一个二分类结果(是/否)。
数据预处理流程
为了支持后续两种不同的分析场景,我们需要对原始数据做进一步的整理和划分。具体地,我们将构建两个独立的使用案例,并分别为每个案例准备训练集与测试集:
- 单一处理场景:仅关注一种干预手段的效果评估,即向客户发送电子邮件活动的影响;
- 多处理比较场景:对比多种干预方式(如短信通知、优惠券发放等)的有效性,并旨在为每位用户识别出最优的干预策略。
为此,我们定义一个通用的数据准备函数:
from sklearn.model_selection import train_test_split
def prepare_data(df, feature_names, y_name, test_size=0.3, random_state=42):
"""
准备用于 uplift 建模的数据,包括划分为训练集和测试集,
并生成单处理子集。
"""
# 构建二值化处理标识列
df['treatment_col'] = np.where(df['treatment_group_key'] == 'control', 0, 1)
# 将数据划分为训练集和测试集
df_train, df_test = train_test_split(df, test_size=test_size, random_state=random_state)
# 生成单一处理组的子集(用于 mono-treatment 分析)
# (此处省略具体实现细节,可根据需要补充)
return df_train, df_test, feature_names, y_name
该函数不仅完成了基础的数据分割任务,还引入了处理变量的二值编码逻辑,为后续 uplift 模型的训练打下基础。
首先,从训练集和测试集中筛选出单一处理组的数据,仅保留 'email_campaign' 与 'control' 两类:
df_train_mono = df_train[df_train['treatment_group_key'].isin(['email_campaign', 'control'])]
df_test_mono = df_test[df_test['treatment_group_key'].isin(['email_campaign', 'control'])]
接下来,针对完整数据集,提取特征变量、处理变量以及目标变量:
X_train = df_train[feature_names].values
X_test = df_test[feature_names].values
treatment_train = df_train['treatment_group_key'].values
treatment_test = df_test['treatment_group_key'].values
y_train = df_train[y_name].values
y_test = df_test[y_name].values
随后,对单一处理组的子集执行相同的操作,准备对应的模型输入数据:
X_train_mono = df_train_mono[feature_names].values
X_test_mono = df_test_mono[feature_names].values
treatment_train_mono = df_train_mono['treatment_group_key'].values
treatment_test_mono = df_test_mono['treatment_group_key'].values
y_train_mono = df_train_mono[y_name].values
y_test_mono = df_test_mono[y_name].values
将所有准备好的数据整合为字典形式返回,便于后续调用:
return {
'df_train': df_train, 'df_test': df_test,
'df_train_mono': df_train_mono, 'df_test_mono': df_test_mono,
'X_train': X_train, 'X_test': X_test,
'X_train_mono': X_train_mono, 'X_test_mono': X_test_mono,
'treatment_train': treatment_train, 'treatment_test': treatment_test,
'treatment_train_mono': treatment_train_mono, 'treatment_test_mono': treatment_test_mono,
'y_train': y_train, 'y_test': y_test,
'y_train_mono': y_train_mono, 'y_test_mono': y_test_mono
}
使用示例:调用数据预处理函数获取结果
data = prepare_data(df, feature_names, y_name)
输出测试集的维度信息以验证数据分割的正确性:
print(f"Full test set shape: {data['df_test'].shape}")
print(f"Mono-treatment test set shape: {data['df_test_mono'].shape}")
从返回的数据结构中提取所需变量,供模型训练或评估使用:
df_train, df_test = data['df_train'], data['df_test']
df_train_mono, df_test_mono = data['df_train_mono'], data['df_test_mono']
X_train, y_train = data['X_train'], data['y_train']
X_test, y_test = data['X_test'], data['y_test']
X_train_mono, y_train_mono = data['X_train_mono'], data['y_train_mono']
X_test_mono, y_test_mono = data['X_test_mono'], data['y_test_mono']treatment_train, treatment_test = data['treatment_train'], data['treatment_test']
treatment_train_mono, treatment_test_mono = data['treatment_train_mono'], data['treatment_test_mono']
数据已准备就绪,接下来我们简要回顾一些理论背景,并探讨几种可行的建模策略。
深入理解提升建模技术
我们已经了解到,提升建模是一种利用机器学习算法来识别干预措施在不同个体间产生差异性影响的方法,这种差异被称为异质性治疗效应。该方法的核心在于估计条件平均治疗效应(CATE),即在给定特征条件下,接受干预与未接受干预的客户在结果上的期望差异。
目前有多种模型可用于CATE的估计,主要包括以下几类:
直接提升建模方法
这是最直观的一种方式。通过采用专门设计的算法——例如经过损失函数优化的提升决策树——直接对提升效果进行建模。这类模型的目标是在一个统一框架内最大化处理组与对照组之间的结果差距。
在本例中,我们将使用提升随机森林分类器作为代表性的直接建模方法。
元学习者方法
元学习者借助现有的机器学习模型来间接估计CATE,通常通过组合多个基础模型或在其预测输出上构建第二层模型实现。尽管存在多种变体,本文将重点介绍两种经典形式:S-Learner 和 T-Learner。
1. S-Learner(单模型法)
towardsdatascience.com/causal-machine-learning-for-customer-retention-a-practical-guide-with-python-6bd959b25741?source=collection_archive---------1-----------------------#2024-08-30
来源:causalml 文档 — S-Learner 示意图
S-Learner 是所有元学习方法中最简洁的一种。它仅依赖一个标准机器学习模型,将是否接受处理作为一个输入特征纳入训练过程。虽然实现简便,但当处理变量对结果影响较弱时,该方法可能难以准确捕捉其效应。
2. T-Learner(双模型法)
“T-Learner 通过强制模型根据处理状态进行分组建模,从而避免忽略处理变量的问题。具体而言,我们会分别为每个处理组训练独立的预测模型。”
在二元处理场景下,只需要构建两个模型,因此得名“T-Learner”。
en.wikipedia.org/wiki/Uplift_modelling
来源[3]
这些方法各有特点,适用性取决于数据结构和业务目标。在本文中,我们将实际应用三种模型——提升随机森林分类器、S-Learner 和 T-Learner,并对比它们在提升用户留存率任务中的表现效果。
单一处理场景下的因果机器学习实现
模型训练流程
现在进入模型训练阶段。首先,我们从直接建模方法开始:训练一个提升随机森林分类器;随后,基于XGBoost回归器构建我们的元学习模型。需要注意两点:
- 所选的底层模型算法会显著影响最终的CATE估计质量,因此需谨慎选择。
- 尽管问题本质上是分类任务,但我们仍选用回归模型作为元学习器的基础,因为它能提供更细粒度的效果估计,增强预测灵活性。
整个训练与评估流程包含以下几个关键步骤:
- 初始化用于存储结果的数据框
- 在训练集上依次训练各个模型
- 在测试集上预测个体层面的处理效应,并保存结果
from causalml.inference.meta import BaseSRegressor, BaseTRegressor
from causalml.inference.tree import UpliftRandomForestClassifier
from xgboost import XGBRegressor
# 将结果保存到新的DataFrame中
df_results_mono = df_test_mono.copy()
# 初始化并训练提升随机森林分类器
rfc = UpliftRandomForestClassifier(control_name='control')
rfc.fit(X_train_mono, treatment_train_mono, y_train_mono)
# 初始化并训练S-Learner
learner_s = BaseSRegressor(
learner=XGBRegressor(
n_estimators=100,
max_depth=3,
learning_rate=0.1,
random_state=42
),
control_name='control'
)
# 初始化并训练 S-Learner
learner_s.fit(X_train_mono, treatment_train_mono, y_train_mono)
# 构建并拟合 T-Learner 模型
learner_t = BaseTRegressor(
learner=XGBRegressor(
n_estimators=100,
max_depth=3,
learning_rate=0.1,
random_state=42
),
control_name='control'
)
learner_t.fit(X_train_mono, treatment_train_mono, y_train_mono)
# 预测不同模型下的干预效果
df_results_mono[["mono_S_learner"]] = learner_s.predict(X=X_test_mono)
df_results_mono[["mono_T_learner"]] = learner_t.predict(X=X_test_mono)
df_results_mono["random_forest_learner"] = rfc.predict(X_test_mono)
# 展示各模型预测效果的均值
display(df_results_mono[["mono_S_learner", "mono_T_learner", "random_forest_learner"]].mean())
# 构造用于绘图和评估的数据副本
df_mono_results_plot = df_results_mono[[
"mono_S_learner", "mono_T_learner", "random_forest_learner", "retention", "treatment_col"
]].copy()
请注意,整个流程基于 causalml 库实现,其接口设计简洁直观,与 sklearn 的使用方式高度相似,便于快速上手和集成。
模型表现评估方法
由于我们所预测的是个体层面的因果效应(即某个处理对特定客户的影响),而现实中每个客户只能处于处理组或对照组之一,因此无法直接观测到真实的个体处理效应。这意味着传统的监督学习评估指标(如准确率、均方误差等)不再适用。 幸运的是,存在一些专为因果推断模型设计的评估手段:增益曲线(Gain Curve)
增益曲线是一种可视化工具,用于衡量模型在识别高响应个体方面的有效性。其核心步骤如下:- 利用模型估算每位客户的处理效应,并按估计值从高到低排序。
- 依次累加计算每一批次中处理组与对照组的平均结果差异(即平均处理效应)。
- 将该过程应用于模型排序和随机排序,生成两条对比曲线。
AAUC 得分(Area Above the Uplift Curve)
AAUC 是对增益曲线的量化总结,表示模型增益曲线相对于随机线之上的面积(经过归一化处理后)。该数值越大,说明模型区分响应能力强的个体的能力越强,且便于不同模型间的横向比较。towardsdatascience.com/causal-machine-learning-for-customer-retention-a-practical-guide-with-python-6bd959b25741?source=collection_archive---------1-----------------------#2024-08-30
# 导入因果评估相关函数
from causalml.metrics import plot_gain
from causalml.metrics import auuc_score
# 计算归一化的 AAUC 分数
aauc_normalized = auuc_score(
df_mono_results_plot,
outcome_col='retention',
treatment_col='treatment_col',
normalize=True,
tmle=False
)
print(f"AAUC Score Normalized: {aauc_normalized}")
# 绘制增益曲线
plot_gain(
df_mono_results_plot,
outcome_col='retention',
treatment_col='treatment_col'
)
plt.title('Gain Curve - T-Learner')
plt.show()
评估结果解读
以下是各模型在 AAUC 指标上的表现:- T-Learner: ~6.4(表现最优)
- S-Learner: ~6.3(紧随其后,表现优异)
- 随机森林: ~5.7(尚可,但弱于前两者)
- 随机策略: ~0.5(作为基线参考)
如何理解增益曲线图
- X 轴(人群比例): 表示按模型评分从高到低覆盖的目标用户比例,左侧为最可能受益的群体,右侧为最不可能响应的个体。
- Y 轴(累积增益): 反映随着目标人群扩大,所获得的累计效果提升,例如留存率的净增长。
en.wikipedia.org/wiki/Uplift_modelling增益曲线解析
增益曲线帮助我们理解通过使用提升模型或随机策略,能够在目标群体中实现多少“留存用户”的收益。这里的单位是实际的留存人数。
假设我们对所有用户发送电子邮件,预计可以额外保留约100名用户——这就是我们的基准情况。值得注意的是,无论采用哪种策略,当覆盖全部人群时,最终结果都会趋近于这一数值,这与增益的定义一致,属于正常现象。
那么该如何解读这条曲线呢?从图中可以看出,借助我们的模型:
仅触达50%的用户,就能多保留600名用户!
这相当于全面推送效果的六倍。其背后的机制在于:我们精准定位那些最有可能因接触而留下的用户,同时避开那些可能因收到邮件反而选择流失的个体。
towardsdatascience.com/causal-machine-learning-for-customer-retention-a-practical-guide-with-python-6bd959b25741?source=collection_archive---------1-----------------------#2024-08-30
这里需要做一个简要说明:本例使用的是合成数据,现实场景中几乎不可能达到如此理想的效果,但该示例有助于清晰地展示核心概念。
由此可见,模型让我们实现了资源更少、成效更高的运营目标。这正是提升建模的价值所在——通过聚焦小范围高潜力人群,显著降低执行成本,同时获取可观的留存成果。某种程度上,这也体现了帕累托原则的优势。
接下来,进入更具吸引力的部分:如何为每位客户实现个性化干预。
多重处理模型:迈向个性化决策
现在我们将重新开展分析,纳入前述四种用户留存策略:
- 电话营销活动
- 电子邮件推广
- 应用内通知
- 优惠券发放
为了支持这种多策略评估,我们需要进行多重处理实验(multi-treatment experiment),或者整合多个独立实验的数据。数据质量越高,模型预测的准确性就越强。然而,设计并实施这类实验往往耗时且需投入较多资源。
在本次演示中,我们将沿用之前生成的数据集。但必须强调:获取高质量的多重处理实验数据,通常是整个方法中最关键也是最难的环节。
模型训练流程
我们继续使用与先前相同的模型架构:随机森林、S-Learner 和 T-Learner。不同的是,当前这些模型的目标是识别并区分四种处理方式各自带来的提升效应。
# 将测试结果保存至DataFrame
df_results_multi = df_test.copy()
# 定义可选操作类型
actions = ['call_campaign', 'email_campaign', 'in_app_notification', 'voucher']
# 初始化并训练Uplift随机森林分类器
rfc = UpliftRandomForestClassifier(
n_estimators=100,
max_depth=5,
min_samples_leaf=50,
min_samples_treatment=10,
n_reg=10,
control_name='control',
random_state=42
)
rfc.fit(X_train, treatment_train, y_train)
# 初始化并训练S-Learner
learner_s = BaseSRegressor(
learner=XGBRegressor(
n_estimators=100,
max_depth=3,
learning_rate=0.1,
random_state=42
),
control_name='control'
)
learner_s.fit(X_train, treatment_train, y_train)
# 初始化并训练T-Learner
learner_t = BaseTRegressor(
learner=XGBRegressor(
n_estimators=100,
max_depth=3,
learning_rate=0.1,
random_state=42
),
control_name='control'
)
learner_t.fit(X_train, treatment_train, y_train)
生成预测结果
完成模型训练后,下一步是对每种处理方式进行效果预测。针对每一位用户,模型将输出四种干预手段各自的提升值。基于这些信息,我们可以挑选出最具正向提升作用的策略;若所有处理均无显著正向效果,则决定不进行任何联系。
def predict_multi(df, learner, learner_name, X_test):
"""
预测多种处理下的提升效果,并确定最优干预方式。
"""
# 预测各处理的提升效应
cols = [f'{learner_name}_learner_{action}' for action in actions]
df[cols] = learner.predict(X=X_test)
# 确定最优的处理效应
df[f'{learner_name}_learner_effect'] = df[cols].max(axis=1)
# 确定最优处理方案
df[f"{learner_name}_best_treatment"] = df[cols].idxmax(axis=1)
df.loc[df[f'{learner_name}_learner_effect'] < 0, f"{learner_name}_best_treatment"] = "control"
return df
# 对每个模型应用预测
df_results_multi = predict_multi(df_results_multi, rfc, 'rf', X_test)
df_results_multi = predict_multi(df_results_multi, learner_s, 's', X_test)
df_results_multi = predict_multi(df_results_multi, learner_t, 't', X_test)
towardsdatascience.com/causal-machine-learning-for-customer-retention-a-practical-guide-with-python-6bd959b25741?source=collection_archive---------1-----------------------#2024-08-30
我们通过上述流程可以从每一个模型中获取对应的预测结果。对于每一位用户,系统将能够基于模型输出挑选出最合适的干预策略。
模型性能评估
在多处理场景下,我们的评估方式需要进行相应调整。具体步骤如下:
- 针对每位用户,识别出能带来最大正向影响的处理方式;
- 根据该最佳处理所对应的效果值对所有用户进行排序;
- 回顾真实结果:观察这些用户最终是留存还是流失。
遵循这一逻辑,我们可以清晰地看到,相比于随机分配策略,精准定向一小部分人群即可显著提升整体效果。基于此思路,我们绘制增益曲线并计算标准化与非标准化的AAUC(Area Above the Uplift Curve)指标。整个过程借助 causalML 工具库高效完成。
代码实现如下:
# 计算AAUC得分
aauc_normalized = auuc_score(df_t_learner_plot_multi, outcome_col='retention', treatment_col='treatment_col', normalize=True, tmle=False)
aauc_non_normalize = auuc_score(df_t_learner_plot_multi, outcome_col='retention', treatment_col='treatment_col', normalize=False, tmle=False)
print(f"AAUC Score Normalized: {aauc_normalized}")
print(f"AAUC Score: {aauc_non_normalize}")
# 绘制增益曲线
plot_gain(df_t_learner_plot_multi, outcome_col='retention', treatment_col='treatment_col')
plt.title('Gain Curve - T-Learner')
plt.show()
结果分析
各模型表现如下:
- T-Learner:约 1.45(表现最优)
- S-Learner:约 1.42(紧随其后)
- 随机森林:约 1.20(尚可,但逊色于前两者)
- 随机策略:约 0.52(作为基准)
由此可见:
所有模型均优于随机分配方案,其中T-Learner再次取得最佳成绩。然而,相较于首次实验,各模型之间的差距有所缩小。这种变化可能源于多个因素,例如当前实验覆盖了更广泛的用户群体,而这一点在初始实验中并未体现。此外,这也可能表明现有模型在应对多种处理方式时的能力受限,提示我们需要持续优化建模策略以提升多处理情境下的表现。
为进一步理解模型行为,我们查看增益曲线的表现情况。
en.wikipedia.org/wiki/Uplift_modelling
多重处理增益曲线解读
增益曲线直观展示了不同比例目标人群中实施最优干预后的累积效果提升。曲线越陡峭、越高,说明模型在早期就能准确识别出高响应用户,从而实现更高的资源利用效率。
我们观察到,当对全部目标人群——即30,000名用户——进行覆盖时,预计可额外保留约850名用户。然而,借助我们构建的模型,仅需触达总体用户中的33%,便能成功保留1,600名用户,效果显著提升。
值得注意的是,当触达比例超过目标人群的40%后,所有增长曲线均开始呈现下降趋势,这表明继续联系后续客户所带来的价值极为有限,甚至可能为负。
en.wikipedia.org/wiki/Uplift_modelling
我们的目标已经达成:成功开发出一个能够有效支持个性化留存策略的模型,极大提升了投资回报率(ROI)。基于该模型带来的显著成效,公司决定将其部署至生产环境。此举不仅避免了向全体用户盲目推送所造成的资源浪费,还实现了精准施策,将运营资源集中于最具潜力的客户群体,累计节省成本达数百万元。
causalml.readthedocs.io/en/latest/index.html
当然,将此类模型投入实际应用并非一蹴而就。关键在于确保其在长期运行中的稳定性,并尽可能定期进行再训练以维持性能。为此,推荐采用如下框架:
- 使用模型在80%的目标人群中生成预测结果;
- 保留10%的目标人群作为对照组,不施加任何干预;
- 另保留10%的目标人群用于持续实验,并基于下一周期(如月度、季度或年度)的数据重新训练模型。
这部分内容我们未来有机会可以进一步探讨。
matheusfacure.github.io/python-causality-handbook/landing-page.html
结论
感谢你阅读至此!希望本文让你对增益模型(uplift modeling)的构建方法及其评估方式有了更清晰的认识。如果我的阐述足够清晰,你现在应当理解:增益模型是一种强大的因果推断工具,能够带来显著、直接且可量化的业务影响。它使我们有能力为正确的客户匹配最合适的干预手段。但同时也要注意,这类模型高度依赖高质量的实验数据进行训练,而保持数据的新鲜度与可用性往往是项目推进中的主要挑战之一。虽然也可以应用于历史或观测性数据,但必须引入专门的数据清洗和预处理步骤,以消除潜在偏差。
接下来呢?在深入探索因果机器学习的过程中,我希望听到你的声音。如果你有特别感兴趣的主题,认为可以在你所在企业中落地应用,并希望我做更深入的解析,请随时告诉我,我会尽力满足。让我们一起持续学习、共同进步!下次再见,祝你建模顺利!
来源
除非另有说明,所有图片均由作者提供
[1]
[2]
[3]


雷达卡


京公网安备 11010802022788号







