paper2skills Playbook

LTV预测 - 零膨胀对数正态模型 (ZILN)

Skill-LTV-Prediction-ZILN · 06-增长模型

experimentforecastingoptimization广告与投放客服与VOC推荐与搜索WF-B 广告优化WF-C 客服分诊WF-H 复购增长
年化 ROI100-200 万
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐☆☆
业务视角
适用角色CEO / 增长负责人 · CMO · 财务负责人
适用平台Amazon · TikTok Shop · DTC 独立站 · 多市场
什么情况下用公司增长放缓,不知道是市场饱和还是产品问题还是获客太贵;老板要 12 个月 GMV 预测,只能靠感觉
成功是什么样的建立增长拆解模型找到瓶颈,预测未来 6-12 个月营收区间,支撑融资/战略会议
业务痛点
增长放缓不知道问题在哪CAC 越来越高已经高于 LTV新市场要不要进没有数据支撑

1. 解决的问题

我们通过 Facebook/TikTok 广告获取了大量北美新客,但并非所有新客都有长期价值

2. 核心算法逻辑

LTV (Customer Lifetime Value, 客户生命周期价值) 预测是增长模型的核心能力。传统回归方法难以处理 LTV 分布的两个典型特征:零膨胀(大量用户只购买一次)和长尾分布(少数高价值用户贡献大部分收入)。

3. 业务应用场景

业务问题: 我们通过 Facebook/TikTok 广告获取了大量北美新客,但并非所有新客都有长期价值。部分用户只购买一次基础款吸奶器就流失了,而另一部分会复购配件、升级高端款,LTV 可达初购金额的 3-5 倍。我们需要在首次购买时就预测用户的 LTV,以决策是否值得继续投放广告维护关系。

数据要求: - 用户画像:年龄、是否新手妈妈、收入水平、地域 - 首购行为:购买产品 SKU、客单价、是否使用优惠券 - 行为特征:注册到首购间隔、浏览页面数、加购次数 - 渠道特征:获客渠道、广告素材、落地页类型 - 标签:历史 LTV(6 个月/12 个月)、是否复购 - 数据量:建议至少 5,000+ 有完整 LTV 历史的用户

预期产出: - LTV 点估计:每个新客的预测生命周期价值 - 流失概率:该用户成为"一次性购买者"的概率 - 价值分层: - 高 LTV 潜力(Top 20%):重点运营,推送会员计划 - 中 LTV 潜力(中间 50%):标准运营,定期触达 - 低 LTV 潜力(Bottom 30%):降低维护成本

4. 输入数据要求

请查看原始代码模板获取输入规格。

5. 输出结果

请查看原始代码模板获取输出规格。

6. 业务价值 / ROI

  • 数据要求:需要 6-12 个月的用户行为数据
  • 技术门槛:中等,需理解概率分布和神经网络
  • 工程复杂度:中,PyTorch 实现直观
  • 维护成本:中,需定期重新训练模型
  • 业务价值极高:LTV 是增长模型的核心指标
  • 方法成熟:Google Research 开源,业界广泛验证

7. 代码模板

代码块数量:2 · 路径:未检测到

"""
LTV预测 - 零膨胀对数正态模型 (ZILN)
用于母婴出海电商新客价值预测和会员等级划分
基于 Google Research 的 ZILN 实现
"""

import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import torch.optim as optim
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import warnings
warnings.filterwarnings('ignore')


class ZILNModel(nn.Module):
    """
    Zero-Inflated Lognormal 神经网络模型
    """

    def __init__(self, input_dim, hidden_dims=[128, 64, 32], dropout_rate=0.2):
        """
        初始化 ZILN 模型

        Args:
            input_dim: 输入特征维度
            hidden_dims: 隐藏层维度列表
            dropout_rate: Dropout 率
        """
        super(ZILNModel, self).__init__()

        # 构建共享网络层
        layers = []
        prev_dim = input_dim
        for hidden_dim in hidden_dims:
            layers.extend([
                nn.Linear(prev_dim, hidden_dim),
                nn.ReLU(),
                nn.Dropout(dropout_rate)
            ])
            prev_dim = hidden_dim

        self.shared_layers = nn.Sequential(*layers)

        # 三个输出头
        # 1. 流失概率 (churn probability)
        self.churn_head = nn.Linear(prev_dim, 1)

        # 2. 对数均值 (mu)
        self.mu_head = nn.Linear(prev_dim, 1)

        # 3. 对数标准差 (sigma) - 使用 softplus 保证正值
        self.sigma_head = nn.Linear(prev_dim, 1)

    def forward(self, x):
        """
        前向传播

8. 论文来源

  • 1912.07753
  • 2411.15944
  • 2601.13013