← Back to Blog

Case Study - Predicting Repeat Buyers with Online Learning

Oct 24, 2017 · WeifanD

1. Problem Definition (问题定义)

在零售与电商行业,**客户留存(Customer Retention)**是衡量业务健康度的核心指标之一。对于商家而言,提前识别潜在的“回头客”不仅是提升销量的手段,更是优化资源配置的战略头等大事。

1.1 商业痛点

各大商家为了吸引顾客的二次购买,通常会投入巨额预算实施各种营销策略,如新品促销、定向优惠券、会员折扣等。然而,传统的“广撒网”式营销往往效率低下:

  • 资源浪费:向本来就会复购的忠诚用户发放优惠券,造成了不必要的利润损失(Incrementality 为负)。
  • 转化率低:向毫无兴趣的潜在客户推送信息,不仅转化率极低,还可能引起用户反感,导致流失。

理论上,越了解客户的历史偏好与行为模式,越能实现精准推销,从而最大化优惠券的核销率(Redemption Rate)和投资回报率(ROI)。但在实际业务中,尤其是在用户生命周期的初期阶段,预测一个客户的忠诚度极具挑战性。这通常被称为**“冷启动”后的早期行为预测**问题。

1.2 任务目标

本案例的核心任务是:基于给定的客户历史交易记录、商店互动历史以及优惠券信息,构建一个机器学习模型,预测该客户在收到优惠券后是否会再次光顾并完成核销

在机器学习领域,这是一个典型的二分类问题(Binary Classification)

  • $Y = 1$:客户会复购/核销优惠券。
  • $Y = 0$:客户不会复购/核销优惠券。

2. Data Overview (数据概览)

本项目面临的首要挑战是数据规模(Volume)。原始数据集总量高达 500GB,包含上百万条细粒度的客户行为记录。直接在全量数据上进行迭代实验成本过高,因此我们采取了“分层抽样 + 特征聚合”的策略,在保留数据分布特征的前提下缩减研究样本,以便快速验证模型假设。

数据主要由以下三个核心部分组成:

2.1 Transaction (交易流水表)

这是最基础的事实表,记录了每一笔发生的交易。

  • 粒度:用户 - 日期 - 商店 - 交易次。
  • 关键字段User_ID, Date, Company_ID, Store_ID, Quantity (购买量), Amount (购买金额)。
  • 特点:数据量最大,反映了用户最真实的消费能力与频率。

Transaction Data Structure

2.2 Offer (优惠券信息表)

描述了营销活动的具体属性,是模型中的干预变量。

  • 关键字段Merchant_ID (商家), Condition (使用门槛,如满多少可用), Discount_Value (折扣力度), Valid_Period (有效期)。
  • 作用:用于量化营销刺激的强度。

2.3 History (用户历史行为表)

这是一张经过初步聚合的宽表,包含了用户在特定商圈或商店的宏观行为统计。

  • 关键字段Visit_Count (访问次数), Is_Repeat (是否曾为回头客), Offer_Receive_Time (收券时间), Last_Purchase_Date
  • 作用:提供了用户粘性的直接证据。

3. Feature Engineering (特征工程)

特征工程是本项目成功的关键。鉴于原始数据过于稀疏且维度极高,我们基于业务理解,构建了多个人工衍生变量(Derived Features)。核心思想是捕捉用户行为的时间衰减效应——即近期的行为比远期的行为更能预测未来。

我们提取了以下几大类特征,涵盖了公司(Company)、品类(Category)、品牌(Brand)以及组合维度,并分别统计了不同时间窗口(30/60/90/180天)内的累计值。

3.1 多维度的时间窗口特征

为了捕捉用户兴趣的动态变化,我们针对每个维度计算了以下指标:

  • 历史券使用量 (has_bought_..._count):过去 N 天内使用该商家/品牌优惠券的次数。
  • 历史券使用额 (has_bought_..._value):过去 N 天内通过优惠券产生的交易金额。
  • 时间衰减窗口:分别计算前 30天、60天、90天、180天 的累积值。
    • 逻辑:如果用户在最近 30 天频繁购买某品牌,其复购概率远高于仅在 180 天前购买过的用户。

3.2 特征体系详解

特征类别描述示例变量业务含义
Company针对特定商场/公司的行为has_bought_company_a_30, has_bought_company_q_180用户对特定零售渠道的忠诚度与活跃度。
Category针对商品大类的行为never_bought_category用户是否从未涉足该品类(冷启动标志)。
Brand针对具体品牌的行为has_bought_brand_a_60, has_bought_brand_q_30品牌偏好度,通常比公司维度更细粒度。
Combination交叉特征has_bought_brand_company用户在该商场购买该品牌的特定习惯。
Offer优惠券属性offer_quantity, offer_value营销力度的量化(面额、数量)。
Shopper用户全局画像total_spend用户的整体消费能力(高净值 vs 价格敏感)。

3.3 最终特征选取示例

经过筛选与标准化,最终输入模型的部分关键特征如下所示。可以看出,特征名称清晰地表达了“行为_维度_时间窗口”的逻辑:

offer_quantity: 1 
has_bought_company_a: 243.63      # 该公司历史总消费额
has_bought_brand_180: 7.0         # 该品牌近180天消费频次
has_bought_brand_a_180: 23.13     # 品牌A近180天消费额
has_bought_brand_q_180: 7.0       # 品牌Q近180天消费额
offer_value: 2                    # 优惠券面额
has_bought_brand_a_60: 14.95      # 品牌A近60天消费额 (近期权重高)
has_bought_company_q: 37.0        # 公司Q历史总频次
has_bought_brand_q_30: 1.0        # 品牌Q近30天消费额 (极近期)
has_bought_brand: 8.0             # 所有品牌历史总频次
has_bought_company_q_30: 6.0      # 公司Q近30天频次
has_bought_brand_30: 1.0          # 所有品牌近30天频次
has_bought_company_q_60: 16.0     # 公司Q近60天频次
has_bought_brand_company: 1       # 品牌与公司交叉特征
has_bought_brand_90: 6.0          # 所有品牌近90天频次
has_bought_company_q_180: 19.0    # 公司Q近180天频次
has_bought_company_30: 6.0        # 所有公司近30天频次
has_bought_brand_a: 28.71         # 品牌A历史总消费额
has_bought_company_a_90: 106.13   # 公司A近90天消费额
has_bought_brand_q_90: 6.0        # 品牌Q近90天频次
never_bought_category: 1          # 从未购买该品类 (二元特征)
has_bought_company_180: 19.0      # 所有公司近180天频次
has_bought_brand_q: 9.0           # 品牌Q历史总频次
has_bought_company_a_30: 46.74    # 公司A近30天消费额
has_bought_company_q_90: 17.0     # 公司Q近90天频次
has_bought_brand_a_30: 4.59       # 品牌A近30天消费额
total_spend: 4140.41              # 用户历史总消费金额
has_bought_company_a_60: 100.44   # 公司A近60天消费额
has_bought_brand_q_60: 5.0        # 品牌Q近60天频次
has_bought_company_a_180: 113.21  # 公司A近180天消费额
has_bought_company_60: 16.0       # 所有公司近60天频次
has_bought_brand_60: 5.0          # 所有品牌近60天频次
has_bought_company_90: 17.0       # 所有公司近90天频次
has_bought_brand_a_90: 20.64      # 品牌A近90天消费额
has_bought_company: 36.0          # 所有公司历史总频次

4. Modeling Strategy (建模策略)

面对海量数据(即使抽样后依然庞大)和高维稀疏特征,传统的批量学习算法(如 Scikit-Learn 中的 Random Forest 或 SVM)在内存消耗和训练速度上面临巨大瓶颈。因此,我们选择了 Vowpal Wabbit (VW) 作为核心建模工具。

4.1 为什么选择 Vowpal Wabbit?

Vowpal Wabbit 是一个由 Microsoft Research 开发的高性能开源机器学习系统,其核心优势在于:

  1. 在线学习 (Online Learning)
    • VW 采用随机梯度下降 (Stochastic Gradient Descent, SGD) 的变体进行优化。
    • 机制:它不需要一次性将所有数据加载到内存中,而是逐条(或迷你批次)读取数据,实时更新模型权重。
    • 优势:这使得它能够在一台普通单机上处理 TB 级别的数据流,极大地降低了硬件门槛。
  2. 速度与效率
    • 相比 Batch Gradient Descent(需要遍历全量数据才更新一次权重),Online Learning 的收敛速度在大数据场景下极快。
    • 虽然理论收敛精度可能略低于精心调优的批量算法,但在工业界的大数据场景中,其“速度 - 精度”权衡(Trade-off)表现极佳。

4.2 潜在挑战与应对

在线学习并非完美,其主要缺点包括:

  • 收敛稳定性:在小数据集上,SGD 的震荡可能导致效果不如批量算法稳定。
  • 样本顺序敏感性:VW 对数据输入的順序敏感。例如,如果训练数据中前 50% 全是正样本(点击),后 50% 全是负样本(未点击),模型可能会发生“灾难性遗忘”,只记住后期的模式。
    • 解决方案:在输入 VW 之前,必须对数据进行充分洗牌 (Shuffling),确保样本分布的随机性。

4.3 模型参数配置

在本项目中,我们使用了 Python 封装的 Vowpal Wabbit 接口,关键参数调优如下:

# 核心命令解析
-c                  # 启用缓存 (Cache),避免重复解析特征,加速后续 passes
-k                  # 杀死之前的缓存文件,强制重新生成
--passes 40         # 遍历数据集 40 次。在线学习中,多次遍历有助于模型在稀疏数据上更好地收敛
-l 0.85             # 设置学习率 (Learning Rate) 为 0.85。较高的初始学习率有助于快速跳出局部最优
--loss_function quantile  # 使用分位数回归损失函数。相比默认的平方损失,它对异常值更鲁棒,适合长尾分布的交易金额预测
--quantile_tau 0.6  # 分位数参数。设置为 0.6 意味着模型倾向于预测分布中 60% 分位点的值,这在商业上是一种保守偏乐观的策略,旨在覆盖更多潜在的复购人群

5. Evaluation & Results (评估与结果)

5.1 评估指标

由于这是一个二分类问题,且正负样本可能存在不平衡,我们主要关注 AUC (Area Under the Curve) 指标。AUC 能够衡量模型将正样本排在负样本前面的概率,不受分类阈值的影响,是评估排序能力的黄金标准。

5.2 实验结果

  • 总体表现:模型在测试集上的 AUC 约为 0.69
    • 解读:在如此稀疏且充满噪声的用户行为数据中,0.69 的 AUC 表明模型具有显著的预测能力,明显优于随机猜测(0.5)。这意味着我们可以利用该模型筛选出顶部 20%-30% 的高概率用户进行精准营销,从而大幅提升 ROI。
  • 特殊情况分析
    • 数据集中约有 200 个客户 没有任何使用优惠券的产品交易信息(即特征向量中相关历史字段全为 0 或缺失)。
    • 对于这部分“冷启动”极端的用户,模型预测结果为 0(即判定为不会复购)。
    • 业务启示:这符合逻辑,因为缺乏历史交互信号时,模型无法建立信任关联。对于这类用户,不应直接放弃,而应采取“探索性策略”(如发送无门槛小额券)来激活数据,而非依赖此预测模型。

6. Conclusion (结论)

本案例展示了如何利用 Vowpal Wabbit 的在线学习能力,高效处理大规模零售交易数据,构建回头客预测模型。

  1. 特征是关键:通过构建细粒度的时间窗口特征(30/60/90/180天),我们成功捕捉了用户兴趣的时效性,显著提升了模型区分度。
  2. 技术选型匹配场景:在 500GB 级别的数据背景下,VW 的在线学习机制在保证可接受精度(AUC 0.69)的同时,实现了单机可运行的工程可行性,解决了传统算法内存溢出的难题。
  3. 业务价值:该模型能够帮助商家从“广撒网”转向“精准滴灌”,将有限的营销预算集中在高复购概率的用户身上,同时识别出需要特殊激活策略的冷启动用户。

未来的优化方向包括引入更多的上下文特征(如季节、节假日、地理位置距离),以及尝试 VW 的上下文波段(Contextual Bandits)功能,实现实时的动态营销策略优化。

#Case Study #Machine Learning #Customer Retention #Vowpal Wabbit #Big Data