这可能是一个模糊的问题,但我想知道 Scikit-Learn 的分位数转换是如何实现的?
我想知道如何将倾斜的数据集转换为这样的正态分布?
通常 scikit-learn 会提供指向 wiki 的链接,但不会提供这种转换。
有人可以指出我正确的方向吗?
谢谢
这可能是一个模糊的问题,但我想知道 Scikit-Learn 的分位数转换是如何实现的?
我想知道如何将倾斜的数据集转换为这样的正态分布?
通常 scikit-learn 会提供指向 wiki 的链接,但不会提供这种转换。
有人可以指出我正确的方向吗?
谢谢
是的,它似乎在几个不同的地方被描述,没有任何论文的链接。
类文档将算法总结如下:
转换独立地应用于每个特征。特征的累积密度函数用于投影原始值。低于或高于拟合范围的新/未见数据的特征值将映射到输出分布的边界。请注意,此变换是非线性的。它可能会扭曲以相同尺度测量的变量之间的线性相关性,但会使以不同尺度测量的变量更直接地具有可比性。
用户指南添加了一些新信息:
但是,通过执行等级转换,它可以平滑不寻常的分布,并且比缩放方法受异常值的影响更小。但是,它确实会扭曲要素内部和要素之间的相关性和距离。
具体来说,对于 Normal 转换:
因此,输入的中位数变为输出的均值,以 0 为中心。正常输出被裁剪,以便输入的最小值和最大值(分别对应于 1e-7 和 1 - 1e-7 分位数)在以下情况下不会变为无限大转变。
此估算器的GitHub 拉取请求引用了一个较旧的估算器,表明它最初将被命名为“排名缩放器”。
从更广泛的角度来看,本文很好地总结了可以实现这种“逆正态变换 (INT)”的各种方式:
INT 是转换连续变量的样本分布以使其看起来更正态分布的方法。有几种类型的 INT。我们所做的第一个区别是基于等级的 INT 和不基于等级的 INT。非基于秩的 INT 需要为观察到的数据假设一个特定的累积分布函数 (CDF),估计该分布的参数,将观察到的分数转换为来自 CDF 的估计分位数,然后使用反函数将这些分位数转换为标准正态偏差正常(或概率函数)。这种非基于秩的 INT 通常被称为 copulas (Basrak et al. 2004; Li et al. 2006),不会进一步考虑。然而值得注意的是,基于秩的 INT 可以表示为 copula 方法的特殊情况,其中使用经验 CDF 而不是将 CDF 限制为某些分布族。也就是说,每个时刻实际上都是从数据中估计出来的,而分位数变成了等级的简单函数。
基于等级的 INT 涉及将变量转换为等级的初步步骤,并且可以进一步细分为两类:涉及随机元素的类别和具有确定性的类别。我们知道只有一个 INT 涉及随机元素,这种方法被称为使用“随机正态偏差”(Conover 1980)。对这种方法的一个威慑是,每个调查员将相同的方法应用于相同的数据集会得到稍微不同的答案,这可能会让一些人不满意。这种方法的理论优势是避免了 P 值分布的粒度,这是一个经常困扰许多非参数测试的问题。然而,这些 INT 的随机性似乎让研究人员望而却步,而且它们很少(如果有的话)被使用。
确定性基于秩的 INT 可以分为使用预期正态分数的 INT(Fisher 和 Yates 1938)与使用样本分位数(或分数秩)的反向变换来近似预期正态分数的 INT。使用数值积分,Harter (1961) 提供了最完整的预期正态分数表。涉及分数等级的反向转换以接近 Fisher 和 Yates 的预期正态分数的 INT (Maritz 1982) 似乎是基因研究中最常用的,并将成为关注的主要焦点。在反向变换秩中,需要一个小数偏移以避免将最小和最大观测值分别转换为负无穷大和正无穷大。
查看QuantileTransformer
代码,它看起来就像列表中的最后一项:一个基于确定性排名的 INT,它计算修改后的排名变量。
但是,这是一个相对简单的实现:
numpy.percentile
numpy.interp
scipy.stats.norm.ppf
注意处理四肢的界限。
表示为一个非常简化的映射,即忽略插值和边界逻辑,它只是,其中和表示经验和标准正态分布的 CDF , 分别。
如果 a 是第 q 个分位数,则 q 在 [0, 1] 中。那么映射后a对应的值为norm.ppf(q)。ppf 是 cdf 的倒数。