You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

跨120个Meta Ads账户的时间序列广告数据异常检测方案咨询

针对广告时间序列性能数据的异常检测方案

一、统计类方法(快速落地首选)

这类方法无需复杂模型,适配你现有技术栈,可快速实现:

  • 固定阈值法:在你当前3天CPA涨幅30%的基础上扩展:
    • 给不同账户/广告组设置个性化阈值(大账户与小账户的正常波动幅度差异显著)
    • 结合历史均值判断:比如CPA超过过去7天均值的2倍,或ROAS低于过去14天均值的50%
  • 移动窗口统计法:用滑动窗口计算均值/标准差,偏离窗口统计值的点标记为异常:
    • 例如用7天滑动窗口,当当日CPA > 窗口均值 + 2*窗口标准差时标记异常,可避免单天偶然数据干扰
  • 环比/同比分析法
    • 环比:和前1天/前3天均值对比,比如CPA环比涨幅超30%
    • 同比:和上周同一天数值对比(广告数据普遍存在周度周期,比如周末CPA偏高),避免周期波动导致误判

二、Python库实现(基于pandas扩展)

用你熟悉的pandas结合轻量库,无需复杂机器学习:

  • pandas原生实现滑动窗口检测
    # 假设df是按account_id、date排序的性能数据DataFrame
    df['7d_avg_cpa'] = df.groupby('account_id')['cpa'].transform(lambda x: x.rolling(7).mean())
    df['7d_std_cpa'] = df.groupby('account_id')['cpa'].transform(lambda x: x.rolling(7).std())
    # 标记异常:超出均值+2倍标准差范围
    df['is_anomaly'] = df['cpa'] > (df['7d_avg_cpa'] + 2 * df['7d_std_cpa'])
    
  • statsmodels做趋势突变与残差检测
    from statsmodels.tsa.arima.model import ARIMA
    
    def detect_anomaly_by_arima(series):
        # 用ARIMA拟合时间序列,通过残差判断异常
        model = ARIMA(series, order=(1,1,1))
        res = model.fit()
        residuals = res.resid
        threshold = residuals.std() * 3
        return abs(residuals) > threshold
    
    # 按账户分组应用检测逻辑
    df['arima_anomaly'] = df.groupby('account_id')['cpa'].transform(detect_anomaly_by_arima)
    
  • PyOD无监督异常检测
    from pyod.models.iforest import IForest
    
    def detect_anomaly_iforest(group):
        # 构造多特征:当前值、过去3天均值、环比涨幅
        features = pd.DataFrame({
            'cpa': group['cpa'],
            '3d_avg': group['cpa'].rolling(3).mean().shift(1),
            'day_over_day': group['cpa'].pct_change(1)
        }).dropna()
        if len(features) < 10:
            return [False]*len(group)  # 数据量不足时跳过
        clf = IForest(contamination=0.05)  # 假设异常率为5%
        preds = clf.fit_predict(features)
        # 补全前面缺失的行标记
        return [False]*(len(group)-len(preds)) + list(preds.astype(bool))
    
    df['iforest_anomaly'] = df.groupby('account_id', group_keys=False).apply(detect_anomaly_iforest).explode()
    

三、SQL实现(数据库层初步检测)

基于基础聚合+窗口函数,直接在数据库完成初步异常过滤:

  • 3天环比涨幅异常检测:
    SELECT 
        account_id,
        date,
        cpa,
        AVG(cpa) OVER (PARTITION BY account_id ORDER BY date ROWS BETWEEN 3 PRECEDING AND 1 PRECEDING) AS prev_3d_avg_cpa,
        -- 计算环比涨幅百分比
        CASE 
            WHEN prev_3d_avg_cpa = 0 THEN NULL
            ELSE (cpa - prev_3d_avg_cpa) / prev_3d_avg_cpa * 100
        END AS cpa_3d_growth_pct,
        -- 标记涨幅超30%的异常
        CASE 
            WHEN (cpa - prev_3d_avg_cpa) / prev_3d_avg_cpa * 100 > 30 THEN 1
            ELSE 0
        END AS is_anomaly
    FROM ad_performance_data
    ORDER BY account_id, date;
    
  • 7天滑动窗口均值+标准差检测:
    WITH window_stats AS (
        SELECT 
            account_id,
            date,
            cpa,
            AVG(cpa) OVER (PARTITION BY account_id ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS 7d_avg_cpa,
            STDDEV(cpa) OVER (PARTITION BY account_id ORDER BY date ROWS BETWEEN 6 PRECEDING AND CURRENT ROW) AS 7d_std_cpa
        FROM ad_performance_data
    )
    SELECT 
        *,
        CASE 
            WHEN cpa > 7d_avg_cpa + 2 * 7d_std_cpa THEN 1
            ELSE 0
        END AS is_anomaly
    FROM window_stats
    ORDER BY account_id, date;
    

四、实战优化建议

  • 分层检测:先在SQL层做固定阈值/环比的初步过滤(快速筛选明显异常),再用Python做复杂模型检测,减少Python处理的数据量
  • 账户个性化:绝对不要用全局阈值,所有统计量必须按账户分组计算,不同账户的基准差异极大
  • 周期修正:广告数据存在周/日周期,优先用同比(和上周同一天对比)替代环比,避免周期波动误判
  • 异常验证:检测出的异常不要直接告警,结合曝光量、点击量等指标交叉验证,比如CPA上涨但曝光量暴跌,可能是流量池变化而非真的低效

内容的提问来源于stack exchange,提问作者Vikram

火山引擎 最新活动