将偏态分布转换为高斯分布

数据挖掘 高斯 分配
2021-10-14 17:37:32

我有一个如下所示的倾斜分布:

偏态分布的图片

如何将其转换为高斯分布?这些值代表等级,因此只要值的顺序保持不变,修改这些值就不会导致信息丢失。我这样做是为了试验不同的分布是否会改变我的 ML 模型的行为。

我正在使用 Python/NumPy/Pandas/scikit-learn。

编辑:我应该澄清我有很多功能,我希望自动转换所有功能分布。通过大量实验,我能够为单个功能找到合理的转换,但它并不能推广到其他功能:

normalize(np.log(0.30 + original)).

** 这里是图片i.stack.imgur.com/uzorK.jpg,但我没有足够的代表发布超过 2 张图片 **

normalize(np.log(0.17 + another_feature_distribution)).

在此处输入图像描述

在此图像中,紫色条表示另一个特征的原始分布,绿色条表示转换后的分布。无论我如何调整常数,我都不会让左侧极端的高绿色条消失。此外,我没有时间为每个功能手动查找公式。不确定这些是否足够钟形?

3个回答

您可以借助 numpy 日志功能对数据进行日志转换,如下所示:

log_data = np.log(data)

这会将数据转换为正态分布。此外,您还可以尝试 Box-Cox 变换,它计算数据的最佳幂变换以减少偏斜,尽管在大多数情况下可以使用的更简单的方法是应用自然对数。有关 Box-Cox 变换的更多详细信息,请参见此处此处

对于当代观众,scikit-learn 的更新现在包含PowerTransformation在 API 中,提供了一种将这些转换包含在工作流中的简洁方式。请参阅预处理转换器

如果您将约翰逊分布拟合到数据中,则优化的 a 和 b 系数会将数据转换为正态分布。请参阅scipy.stats.johnsonsuscipy.stats.johnsonsb