对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
相关产品推荐
相关产品推荐

