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

lifetimes库BetaGeoFitter模型拟合遇ConvergenceError求助

BetaGeoFitter模型拟合收敛错误排查与解决

问题背景

我尝试用lifetimes库的BetaGeoFitter模型拟合交易数据,代码如下:

df = summary_data_from_transaction_data(df,"COMPANY_ID","INVOICE_DATE","TOTAL_PRICE",include_first_transaction=True, observation_period_end= today_date, freq= "W")

bgf = BetaGeoFitter(penalizer_coef=0.0)
bgf.fit(df['frequency'], df['recency'], df['T'])

运行后出现收敛错误,末尾报错信息如下:

C:\ProgramData\Miniconda3\lib\site-packages\autograd\tracer.py:48: RuntimeWarning: invalid value encountered in multiply
  return f_raw(*args, **kwargs)
C:\ProgramData\Miniconda3\lib\site-packages\autograd\tracer.py:48: RuntimeWarning: invalid value encountered in subtract
  return f_raw(*args, **kwargs)
C:\ProgramData\Miniconda3\lib\site-packages\autograd\numpy\numpy_vjps.py:78: RuntimeWarning: invalid value encountered in double_scalars
  defvjp(anp.log,    lambda ans, x : lambda g: g / x)
---------------------------------------------------------------------------
ConvergenceError                          Traceback (most recent call last)
Cell In [19], line 2
      1 bgf = BetaGeoFitter(penalizer_coef=0.0)
----> 2 bgf.fit(df['frequency'], df['recency'], df['T'])
      3 print(bgf)

File C:\ProgramData\Miniconda3\lib\site-packages\lifetimes\fitters\beta_geo_fitter.py:137, in BetaGeoFitter.fit(self, frequency, recency, T, weights, initial_params, verbose, tol, index, **kwargs)
    134 scaled_recency = recency * self._scale
    135 scaled_T = T * self._scale
--> 137 log_params_, self._negative_log_likelihood_, self._hessian_ = self._fit(
    138     (frequency, scaled_recency, scaled_T, weights, self.penalizer_coef),
    139     initial_params,
    140     4,
    141     verbose,
    142     tol,
    143     **kwargs
    144 )
    146 self.params_ = pd.Series(np.exp(log_params_), index=["r", "alpha", "a", "b"])
    147 self.params_["alpha"] /= self._scale

File C:\ProgramData\Miniconda3\lib\site-packages\lifetimes\fitters\__init__.py:115, in BaseFitter._fit(self, minimizing_function_args, initial_params, params_size, disp, tol, bounds, **kwargs)
    113     return output.x, output.fun, hessian_
    114 print(output)
--> 115 raise ConvergenceError(
    116     dedent(
    117         """
    118     The model did not converge. Try adding a larger penalizer to see if that helps convergence.
    119     """
    120     )
    121 )

ConvergenceError: 
The model did not converge. Try adding a larger penalizer to see if that helps convergence.

调大penalizer_coef后仍出现相同错误,需解决该问题。

错误原因分析

  • 收敛错误本质是模型在最大化似然函数时,无法找到稳定的参数解,常见触发因素包括数据异常、参数初始化不合理、模型假设不匹配。
  • 前置的RuntimeWarning(乘法、减法、对数运算出现无效值)说明数据中存在异常值,导致计算过程中出现NaN/Inf,直接干扰了优化器的迭代过程。

解决步骤

1. 检查预处理后的数据质量

BetaGeoFitter对输入的frequency、recency、T有严格逻辑要求:

  • frequency:客户在观测期内的重复购买次数(注意:summary_data_from_transaction_data默认frequency为总交易数-1,若设置include_first_transaction=True可能导致逻辑冲突,需核对字段定义)
  • recency:最后一次交易与首次交易的时间间隔(单位需与freq参数匹配,此处为周)
  • T:首次交易到观测期结束的时间间隔(单位同freq)

执行以下代码排查异常:

# 查看核心字段统计信息
print(df[['frequency', 'recency', 'T']].describe())

# 检查逻辑异常值
print("frequency负数数量:", len(df[df['frequency'] < 0]))
print("recency大于T的数量:", len(df[df['recency'] > df['T']]))
print("T小于等于0的数量:", len(df[df['T'] <= 0]))

注意:recency必须≤T(最后一次交易不能晚于观测期结束),T必须>0(客户要有有效观测周期)。

2. 清理异常数据

  • 直接删除T<=0的客户:这类客户没有有效观测周期,模型无法拟合。
  • 删除或修正recency > T的数据:属于时间逻辑错误,需确认是数据录入问题还是预处理代码错误。
  • 对于frequency=0的客户(仅首次交易),模型本身支持,但如果这类数据占比过高(如超过70%),可能导致收敛困难,可考虑单独分析或过滤。

3. 调整模型参数与优化选项

  • 逐步增加惩罚项系数:从0.01开始尝试(如0.01、0.1、1.0),惩罚项可约束参数避免极端值:
    bgf = BetaGeoFitter(penalizer_coef=0.1)
    bgf.fit(df['frequency'], df['recency'], df['T'])
    
  • 手动设置初始参数:基于行业经验或类似数据集的参数,给优化器提供合理起点,避免陷入局部最优:
    bgf = BetaGeoFitter(penalizer_coef=0.1)
    # 对应r, alpha, a, b的对数初始值,可根据业务调整
    initial_params = np.log([1, 10, 1, 1])
    bgf.fit(df['frequency'], df['recency'], df['T'], initial_params=initial_params)
    
  • 降低收敛容差:调大tol参数(默认1e-8),降低优化器的收敛要求:
    bgf.fit(df['frequency'], df['recency'], df['T'], tol=1e-6)
    

4. 验证模型假设适配性

BetaGeoFitter基于以下核心假设:

  • 客户分为活跃和流失两类
  • 活跃客户的购买行为服从泊松分布
  • 客户的流失时间服从Beta分布
    若你的数据不符合这些假设(如购买有明显周期性、客户流失机制与模型假设不符),模型可能无法收敛,此时需考虑更换模型(如Gamma-Gamma模型、BG/NBD的变体)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:45:37