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

对RFM指标做Log转换处理分布偏度时出现OverflowError如何解决?

报错原因
  • 代码仅对monetary列做了加极小值的偏移处理,未对recency、frequency列做相同处理。如果这两列存在取值为0的记录,np.log(0)会生成负无穷值(-inf)
  • sns.distplot绘制分布时需要对输入数值做类型转换,遇到无穷值就会触发该溢出错误
解决方案

首先给所有需要做对数变换的RFM列统一加极小值偏移,避免出现log(0)的情况;也可以额外增加异常值过滤逻辑,确保绘图数据合法。
修正后的可运行代码如下:

import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

# 统一设置偏移极小值
offset = 1e-10
# 给所有RFM列增加偏移,避免log计算出现无穷值
rfm_log['recency'] = rfm_log['recency'] + offset
rfm_log['frequency'] = rfm_log['frequency'] + offset
rfm_log['monetary'] = rfm_log['monetary'] + offset

# 对数变换
recency_log = np.log(rfm_log['recency'])
frequency_log = np.log(rfm_log['frequency'])
monetary_log = np.log(rfm_log['monetary'])

# 可选:过滤无穷值、缺失值,避免极端异常值影响绘图
recency_log = recency_log.replace([np.inf, -np.inf], np.nan).dropna()
frequency_log = frequency_log.replace([np.inf, -np.inf], np.nan).dropna()
monetary_log = monetary_log.replace([np.inf, -np.inf], np.nan).dropna()

# 绘制RFM分布
plt.figure(figsize=(16,14))

plt.subplot(3, 1, 1)
sns.distplot(recency_log)

plt.subplot(3, 1, 2)
sns.distplot(frequency_log)

plt.subplot(3, 1, 3)
sns.distplot(monetary_log)

plt.show()

如果业务场景中recency、frequency的取值不应该为0,可以先排查原始RFM计算逻辑是否存在错误,也可以选择直接过滤掉取值为0的异常记录,无需做偏移处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 03:27:05