You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GammaGammaFitter调用条件期望利润函数返回全null值问题

GammaGammaFitter返回全null值排查方案

问题场景

  • 拟合lifetimes库GammaGammaFitter模型代码如下:
ggf = GammaGammaFitter(penalizer_coef=1e-06)
ggf.fit(
    frequency = df_rftv["frequency"],
    monetary_value = df_rftv["monetary_value"],
    weights = None,
    verbose = True,
    tol = 1e-06,
    q_constraint = True
)
ggf.summary
  • 拟合完成后调用conditional_expected_average_profit计算预期平均收入,输出字段全为null,相关代码:
exp_avg_rev = ggf.conditional_expected_average_profit(
    df_rftv["frequency"],
    df_rftv["monetary_value"]
)

df_rftv["exp_avg_rev"] = exp_avg_rev
df_rftv["avg_rev"] = df_rftv["monetary_value"]
df_rftv["error_rev"] = df_rftv["exp_avg_rev"] - df_rftv["avg_rev"]
df_rftv.head()

排查步骤(按踩坑概率排序)

  1. 先核对RFM字段口径,90%的null问题都是口径错了
    lifetimes的字段定义和常规自研RFM计算逻辑不一样,必须严格对齐:
    • frequency:是用户首次购买后的复购次数,等于历史总订单数减1,不是总订单数。仅买过1次的用户这个值必须是0。
    • monetary_value:是用户复购订单的平均客单价,不是所有订单的平均客单价,而且所有值必须严格大于0,不能有0、负数、空值。要是把0元单、全额退款的用户数据混进去,计算时会直接溢出返回null。

    注意:conditional_expected_average_profit本身只支持计算有复购行为的用户(即frequency>0)的预期值。如果你把全量用户(包括仅消费1次、frequency=0的用户)直接传参,旧版本lifetimes不会自动过滤,会直接返回全量null。可以先筛出复购用户子集计算,再把结果映射回原表。

  2. 确认模型参数拟合正常
    直接打印ggf.summary,看输出的p/q/v三个参数是不是正常有限数值,有没有nan、inf的情况。如果参数本身就没拟合出来,后续计算肯定全是null。
    拟合失败常见原因:
    • 异常值没清理,比如客单价是正常水平几百上千倍的测试订单、极端异常交易
    • 复购用户样本量太少,有效复购用户不足百条时很容易拟合失败
  3. 检查字段数据类型
    确认传入的frequency、monetary_value两列都是整数/浮点数类型,不要传字符串格式的数字、带空值的object类型列。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 06:45:42