连续变量转换是数据预处理和特征工程中的关键步骤,常用于解决偏态分布、异方差性、非线性关系等问题,以满足统计模型(如线性回归、方差分析等)对数据的假设(如正态性、方差齐性)或提升机器学习模型的性能。下面详细介绍三种常见方法:
1. 基于经验累积分布函数的方法 (ECDF-based Transformation)
-
核心思想: 利用数据自身的经验累积分布函数将原始数据映射到一个目标分布(通常是标准正态分布或均匀分布)。
-
步骤:
-
计算ECDF: 对于样本数据
X = {x1, x2, ..., xn},其经验累积分布函数定义为:
ECDF(x) = (number of xi ≤ x) / n
它表示小于等于x的观测值在总样本中所占的比例(在 0 到 1 之间)。 -
映射到均匀分布: 将每个原始数据点
xi代入其自身的 ECDF 函数,得到pi = ECDF(xi)。根据概率积分变换,如果X的累积分布函数是F(x),则F(X)服从 [0, 1] 上的均匀分布。因此,pi可以被看作是来自均匀分布 U[0,1] 的一个近似值。 -
映射到目标分布(通常是正态): 将均匀分布的值
pi通过目标分布的分位点函数(Quantile Function / Percent Point Function / PPF)进行逆变换。- 最常见的目标:标准正态分布 (N(0,1)):
zi = Φ^{-1}(pi)
其中Φ^{-1}是标准正态分布的分位点函数(例如 Python 中的scipy.stats.norm.ppf或 R 中的qnorm)。 - 其他目标: 理论上可以映射到任何分布的分位数函数。
- 最常见的目标:标准正态分布 (N(0,1)):
-
-
结果: 转换后的数据
Z = {z1, z2, ..., zn}近似服从标准正态分布N(0,1)。 -
优点:
- 非参数: 不需要对原始数据的分布做任何参数假设,适用于各种形状的分布。
- 严格单调: 保持原始数据的顺序关系不变。
- 处理任意分布: 理论上可以将任何连续分布转换为任何其他连续分布(通过两次 ECDF/PPF 映射)。
-
缺点:
- 依赖样本: ECDF 完全基于样本数据计算,对样本量敏感。小样本时可能无法准确反映总体分布或产生不稳定的转换结果。
- 对异常值敏感: 最小值和最大值会映射到
-∞和+∞(对于正态目标),极端异常值会对转换后数据的尺度产生很大影响。 - 训练/测试集处理: 在建模时,必须使用训练集计算 ECDF。然后用训练集的 ECDF 去转换测试集数据。不能直接在测试集上独立计算 ECDF。
- 解释性差: 转换后的值失去了原始数据的物理或业务意义,难以直接解释。
- 边界问题:
ECDF(x_min) = 1/n > 0和ECDF(x_max) = 1,映射到正态分布时,Φ^{-1}(1/n)和Φ^{-1}(1)分别是一个有限负值和+∞。通常需要将pi调整为(number of xi ≤ x - a) / (n + b)的形式(如(rank(xi) - 0.5) / n或(rank(xi) - 0.375) / (n + 0.25))以避免无穷大。
-
别名/变种: Rank-based Inverse Normal Transformation (Rank-INT), Van der Waerden scores(使用
(rank(xi) - 0.5)/n映射到正态分布)。
2. Box-Cox 变换 (Box-Cox Transformation)
-
核心思想: 通过寻找一个最优的幂变换参数
λ(lambda),使变换后的数据尽可能接近正态分布。它是一种参数化的幂变换族。 -
公式: 仅适用于严格正的数据 (
x > 0)。
y(λ) = { (x^λ - 1) / λ, if λ ≠ 0; ln(x), if λ = 0 } -
参数 λ 的选择: 核心目标是找到使变换后数据最接近正态分布的
λ。通常使用最大似然估计 (MLE) :- 对于一系列候选
λ值(如 -2, -1.5, -1, -0.5, 0, 0.5, 1, 1.5, 2),计算每个λ变换后的数据y(λ)。 - 假设
y(λ)服从正态分布N(μ, σ²)。 - 计算变换后数据的对数似然函数值(或等价地,最小化变换后数据的偏度和峰度)。
- 选择使似然函数最大(或偏度峰度最接近0)的
λ。通常选择使y(λ)的均值和方差稳定(或残差平方和最小)的λ。
- 对于一系列候选
-
常见 λ 值的含义:
λ = 1:接近原始数据((x-1)/1 ≈ x)λ = 0.5:平方根变换(近似)λ = 0:对数变换 (ln(x))λ = -0.5:倒数平方根变换λ = -1:倒数变换 (1/x)
-
优点:
- 参数化且系统化: 通过估计
λ自动找到合适的变换形式。 - 目标明确: 直接优化变换后数据的正态性。
- 可解释性相对较好: 常见的
λ值对应的变换有直观意义(如对数、平方根)。 - 处理右偏态有效: 对处理正值的右偏态(长尾在右侧)数据特别有效。
- 参数化且系统化: 通过估计
-
缺点:
- 仅限于正值: 最大的限制是不能处理零或负数。
- 参数估计依赖正态假设:
λ的 MLE 估计基于变换后数据是正态的前提,这可能不完美。 - 训练/测试集处理: 在建模时,必须使用训练集估计
λ。然后用训练集的λ去转换测试集数据。 - 对异常值敏感: 幂变换对极端值敏感。
-
实现: Python (
scipy.stats.boxcox),R (boxcoxinMASSpackage)。
3. Yeo-Johnson 变换 (Yeo-Johnson Transformation)
-
核心思想: Box-Cox 变换的推广,使其能够处理零和负数。它同样通过寻找最优的幂变换参数
λ来改善数据的正态性、方差稳定性或线性关系。 -
公式: 适用于所有实数 (
x ∈ R)。公式根据x是否大于等于0以及λ是否等于0或2分为四种情况:
y(λ) = { [(x + 1)^λ - 1] / λ, if λ ≠ 0, x >= 0; ln(x + 1), if λ = 0, x >= 0; -[(-x + 1)^{(2-λ)} - 1] / (2 - λ), if λ ≠ 2, x < 0; -ln(-x + 1), if λ = 2, x < 0 } -
参数 λ 的选择: 方法与 Box-Cox 变换完全相同,使用最大似然估计 (MLE) 在一系列候选
λ值中选择能使变换后数据最接近正态分布的那个λ。 -
常见 λ 值的含义 (对于 x >= 0): 与 Box-Cox 相同(λ=1:接近原始;λ=0:log(x+1);λ=0.5:类似平方根)。
-
优点:
- 处理零和负数: 最大优势是解决了 Box-Cox 的关键限制。
- 参数化且系统化: 同 Box-Cox。
- 目标明确: 同 Box-Cox。
- 灵活性: 通过不同的
λ值,可以处理各种偏态分布(左偏和右偏)。
-
缺点:
- 公式稍复杂: 定义比 Box-Cox 复杂一些。
- 参数估计依赖正态假设: 同 Box-Cox。
- 训练/测试集处理: 必须使用训练集估计
λ并应用于测试集。 - 对异常值敏感: 同 Box-Cox。
- 解释性: 对于
x < 0的部分,变换的解释性不如x >= 0的部分直观。
-
实现: Python (
scikit-learn.preprocessing.PowerTransformer(method='yeo-johnson')),R (powerTransformincarpackage)。
总结与比较
| 特征 | 基于 ECDF (Rank-INT) | Box-Cox 变换 | Yeo-Johnson 变换 |
|---|---|---|---|
| 适用范围 | 任何连续分布 | 仅限严格正数 (x > 0) | 所有实数 (x ∈ R) |
| 核心原理 | 非参数 (ECDF + PPF) | 参数化 (幂变换 + MLE 找 λ) | 参数化 (广义幂变换 + MLE 找 λ) |
| 目标分布 | 标准正态 (或其他指定分布) | 正态 | 正态 |
| 处理偏态 | 所有类型 | 主要用于右偏 (需正数) | 左偏和右偏 |
| 对样本量依赖 | 高 | 中 | 中 |
| 对异常值敏感度 | 高 | 高 | 高 |
| 训练/测试处理 | 关键 (用训练集 ECDF) | 关键 (用训练集 λ) | 关键 (用训练集 λ) |
| 解释性 | 差 | 相对较好 (常见 λ) | 相对较好 (x>=0 部分),x<0 稍差 |
| 处理零/负值 | 能 | 不能 | 能 |
| 主要优势 | 无需分布假设,严格单调 | 系统化处理正值偏态 | 系统化处理所有实数的偏态 |
| 主要劣势 | 小样本/异常值敏感,解释性差 | 只能处理正数 | 公式稍复杂 |
选择建议:
-
数据包含零或负数: 直接选择 Yeo-Johnson 变换。
-
数据严格为正:
- 如果你想用一种参数化、系统化的方法寻找最优幂变换,选择 Box-Cox 或 Yeo-Johnson (两者对正值效果类似,Yeo-Johnson 在 λ 估计上可能略有数值稳定性优势)。
- 如果你对原始分布没有信心,或者希望转换更加稳健(不依赖特定参数形式),或者需要映射到特定分布(不仅仅是正态),考虑 基于 ECDF 的方法。但要注意其样本依赖性和异常值敏感性。
-
需要保持单调性: 三种方法都是单调变换。
-
解释性需求: Box-Cox/Yeo-Johnson 的常见 λ 值(如对数、平方根)比 ECDF 转换后的分数更容易解释。