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()
排查步骤(按踩坑概率排序)
- 先核对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。可以先筛出复购用户子集计算,再把结果映射回原表。 - 确认模型参数拟合正常
直接打印ggf.summary,看输出的p/q/v三个参数是不是正常有限数值,有没有nan、inf的情况。如果参数本身就没拟合出来,后续计算肯定全是null。
拟合失败常见原因:- 异常值没清理,比如客单价是正常水平几百上千倍的测试订单、极端异常交易
- 复购用户样本量太少,有效复购用户不足百条时很容易拟合失败
- 检查字段数据类型
确认传入的frequency、monetary_value两列都是整数/浮点数类型,不要传字符串格式的数字、带空值的object类型列。
内容的提问来源于stack exchange,提问作者Sarang
相关产品推荐
相关产品推荐

