如何对含正负值的数据集数值变量做正态化处理以适配回归模型?
原报错
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
相关产品推荐
相关产品推荐

