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

如何对含正负值的数据集数值变量做正态化处理以适配回归模型?

原报错RuntimeWarning: divide by zero encountered in log翻译为:运行时警告:在对数计算中遇到除零错误

Yeo-Johnson变换支持负值输入,但触发该警告的核心原因是输入列存在零值或绝对值极小的近零值,导致变换的对数计算环节分母为零。以下是可直接落地的解决方案:

预校验处理

  • 遍历所有36个变量列,统计每列零值、绝对值小于1e-8的近零值占比
  • 零值占比<5%的列,直接剔除对应零值样本,或用该列非零区间的1%分位数填充零值
  • 零值占比≥5%的列,先做全局偏移:给列内所有值加上abs(列最小值) + 1e-6,确保所有取值严格大于0

变换调用优化

如果使用scikit-learn的PowerTransformer实现Yeo-Johnson变换,可参考如下代码规避报错:

import numpy as np
from sklearn.preprocessing import PowerTransformer

# 输入为你的特征矩阵,shape为(样本数, 36)
raw_features = your_input_data
# 替换无穷值、近零值避免计算异常
processed_features = np.nan_to_num(raw_features, neginf=-1e6, posinf=1e6)
processed_features[np.abs(processed_features) < 1e-8] = 1e-8
# 初始化变换器
pt = PowerTransformer(method="yeo-johnson", standardize=True)
# 得到正态化后的特征
normalized_features = pt.fit_transform(processed_features)

差异化变换适配

由于36个变量分布差异较大,不建议统一套用同一种变换,可按变量特征选择适配方案:

  • 偏度<2的轻度偏态变量:直接使用QuantileTransformer,指定output_distribution="normal",适配性更强,不会触发对数计算报错
  • 偏度≥2的重尾偏态变量:先做log1p偏移变换(需先将值偏移到全正区间),再做Yeo-Johnson校正
  • 取值类别数<10的离散整数变量:无需强行正态化,直接做分箱或独热编码,更适配回归模型的特征要求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:06:01