paper2skills Playbook

块缺失数据补全 - 整段流量数据丢失时的恢复

Skill-BlockEcho-Missing-Data · 14-用户分析

causalexperimentforecastingoptimizationrecommendation广告与投放推荐与搜索WF-B 广告优化
实现难度⭐⭐⭐☆☆
业务优先级⭐⭐⭐⭐⭐
业务视角
适用角色运营负责人 / 用户增长负责人 · CMO · 产品经理
适用平台Amazon 买家分层 · DTC 站 LTV 预测 · Klaviyo/Brevo 邮件分群
什么情况下用有大量老客户,但不知道谁是高价值客户、谁快要流失;新客获取成本越来越高,老客复购却上不去
成功是什么样的用户按 RFM/LTV 分层精准触达,高价值用户留存率提升,老客贡献收入占比从 30% 提升到 50%
业务痛点
老客复购率上不去不知道哪些用户要流失了所有用户用同一套活动买过一次就不见了

1. 解决的问题

块缺失(Block-wise Missing)的独特挑战:当一整段时间(如连续3天)或一个完整维度(如某渠道所有数据)缺失时,传统插值方法(线性插值、KNN、MICE)依赖"相邻元素"做预测,在块缺失场景下这些邻居全部不存在,方法直接失效。

2. 核心算法逻辑

块缺失(Blockwise Missing)的独特挑战:当一整段时间(如连续3天)或一个完整维度(如某渠道所有数据)缺失时,传统插值方法(线性插值、KNN、MICE)依赖"相邻元素"做预测,在块缺失场景下这些邻居全部不存在,方法直接失效。

3. 业务应用场景

业务问题:TikTok Pixel 追踪代码因版本更新故障,导致连续3天的广告点击/转化数据完全丢失(块缺失)。数据维度:`(日期×广告素材×受众包)` 的转化率矩阵,30天中有3天(第10-12天)整块缺失。

运营团队面临困境: - 无法评估那3天的广告效果,素材打分异常 - 缺失数据导致 ROAS 计算偏低,影响下月预算审批 - 桑基图中"TikTok 广告"整个时间段断裂,渠道归因失真

传统方法的失败:线性插值需要知道第10-12天的某些相邻值,但整块为空;均值填充忽略了大促期间的流量峰值特征;MICE 依赖变量间相关性但整块缺失无局部参照。

4. 输入数据要求

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

5. 输出结果

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

6. 业务价值 / ROI

未自动抽取;请查看原始 Skill 卡片。

7. 代码模板

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

"""
BlockEcho: 块缺失数据补全 - GAN + Matrix Factorization 联合框架
论文: IJCAI 2024 - BlockEcho: Retaining Long-Range Dependencies for Imputing Block-Wise Missing Data
arXiv: 2402.18800
应用: 母婴出海广告数据整段丢失恢复(TikTok Pixel 故障 / Facebook 账户暂停等场景)

依赖: torch>=1.8, numpy, pandas, sklearn
"""

import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
from typing import Tuple, Optional, Dict, List
from sklearn.metrics import mean_squared_error
import warnings
warnings.filterwarnings("ignore")


# ─────────────────────────────────────────────────────────────
# 1. 矩阵补全层(MCL):低秩乘积 + 非线性变换
# ─────────────────────────────────────────────────────────────

class MatrixCompletionLayer(nn.Module):
    """
    MCL: U @ V_T + FCN 非线性变换
    保留低秩约束(矩阵乘积),同时引入非线性(FCN)
    """
    def __init__(self, n_rows: int, n_cols: int, rank: int):
        super().__init__()
        self.V = nn.Parameter(torch.randn(n_cols, rank) * 0.1)  # 列嵌入矩阵
        self.fc_nonlinear = nn.Sequential(
            nn.Linear(n_cols, n_cols * 2),
            nn.ReLU(),
            nn.Linear(n_cols * 2, n_cols),
        )

    def forward(self, U: torch.Tensor) -> torch.Tensor:
        """
        Args:
            U: (batch, rank) 行嵌入矩阵(由生成器输出)
        Returns:
            X_hat: (batch, n_cols) 补全后的矩阵行
        """
        X_linear = U @ self.V.T           # (batch, n_cols) 低秩乘积
        X_hat = self.fc_nonlinear(X_linear)  # 非线性变换
        return X_hat


# ─────────────────────────────────────────────────────────────
# 2. 生成器 G:输入缺失矩阵 → 输出行嵌入 U
# ─────────────────────────────────────────────────────────────

class Generator(nn.Module):
    """
    生成器:(X̃, M, Z) → U(行嵌入矩阵)
    X̃: 零填充矩阵(缺失位置填0)
    M: 观测掩码(1=已知, 0=缺失)
    Z: 噪声向量
    """

8. 论文来源

  • 2402.18800