3、单变量基础变换:对数变换、平方根变换、Box-Cox变换的数学原理与适用场景

在特征工程中,单变量变换是处理偏态分布、稳定方差、改善模型线性假设的核心手段。本章聚焦三种最常用的幂次族变换:对数变换、平方根变换和Box-Cox变换,从数学原理出发,明确各自的适用边界与实操要点。

3.1 对数变换(Log Transformation)

数学原理

对数变换将原始变量 \( x \) 映射为 \( \ln(x) \) 或 \( \log_{10}(x) \)。其核心数学性质包括:

  • 压缩右尾:对数函数在 \( x \to 0^+ \) 时斜率极大,在 \( x \to +\infty \) 时斜率趋近于 0,因此能大幅压缩大值、拉伸小值。
  • 乘法变加法:\( \ln(a \cdot b) = \ln(a) + \ln(b) \),将乘法关系转化为线性关系。
  • 弹性解释:在回归模型中,\( \beta \) 表示 百分比变化(半弹性),即 \( x \) 变化 1% 时 \( y \) 变化 \( \beta/100 \) 个单位。
适用前提:变量必须严格为正(\( x > 0 \))。若存在零值,常用 \( \ln(x + c) \) 或 \( \ln(x + 1) \) 处理,但需注意小值区域的扭曲效应。

适用场景

场景 典型变量 效果
收入、房价、销售额 长右尾分布 分布接近正态,减少极端值影响
生物/医学指标 酶浓度、病毒载量 稳定方差,改善线性假设
时间序列 GDP、股票价格 将指数趋势转为线性趋势
比率/倍数数据 转化率、增长率 对称化分布,便于建模

3.2 平方根变换(Square Root Transformation)

数学原理

平方根变换定义为 \( \sqrt{x} \) 或 \( \sqrt{x + 0.5} \)。其压缩强度介于对数变换与原始尺度之间:

  • 中等压缩:对右尾的压缩弱于对数变换,但对左尾的拉伸也更温和。
  • 方差稳定:当原始数据服从 Poisson 分布(方差 = 均值)时,\( \sqrt{x} \) 能使方差近似为常数 0.25。
  • 零值友好:\( \sqrt{0} = 0 \),无需额外偏移,适合计数数据。
关键区别:平方根变换适用于 计数数据 和 低偏态 场景;对数变换适用于 高偏态 和 乘法关系 场景。

适用场景

场景 典型变量 效果
计数数据 点击次数、事件发生次数 稳定 Poisson 方差
面积/长度测量 像素面积、距离 还原物理尺度线性关系
低偏态正数 小范围评分、频次 适度对称化,保留零值

3.3 Box-Cox 变换

数学原理

Box-Cox 变换是幂次变换的参数化家族,由统计学家 George Box 和 David Cox 于 1964 年提出。其定义如下:

Box-Cox 变换公式:
y(λ) = 
  (x^λ - 1) / λ,   若 λ ≠ 0
  ln(x),            若 λ = 0

其中 x > 0,λ 为待估参数。

关键性质:

  • 连续性:当 \( \lambda \to 0 \) 时,\( (x^\lambda - 1)/\lambda \to \ln(x) \),因此对数变换是 Box-Cox 的特例。
  • 参数估计:通过最大似然估计(MLE)或最小化残差方差选择最优 \( \lambda \)。
  • 常见 λ 值:\( \lambda = 1 \)(无变换)、\( \lambda = 0.5 \)(平方根)、\( \lambda = 0 \)(对数)、\( \lambda = -1 \)(倒数)。
注意事项:Box-Cox 变换要求所有数据为正。若存在零或负值,可使用 Yeo-Johnson 变换(允许负值)作为替代。此外,变换后的变量解释性会降低,需谨慎用于业务沟通。

适用场景

场景 说明 推荐 λ 范围
自动寻找最优变换 不确定使用哪种幂次变换时 自动搜索 [-2, 2]
线性回归假设修复 残差非正态、异方差 由 MLE 决定
多变量统一变换 多个特征需相同变换尺度 共享 λ 或各自优化

3.4 三种变换对比总览

特性 对数变换 平方根变换 Box-Cox 变换
数学形式 \( \ln(x) \) \( \sqrt{x} \) \( (x^\lambda - 1)/\lambda \)
参数数量 0(固定) 0(固定) 1(λ 需估计)
压缩强度 强 中 可调(由 λ 控制)
零值处理 需偏移 天然支持 需偏移
解释性 高(百分比变化) 中(原始单位开方) 低(λ 非整数时)
自动化程度 手动 手动 自动搜索最优

3.5 变换效果对比示意图

下图展示了三种变换对同一组右偏数据(模拟收入分布)的处理效果对比:

三种单变量变换效果对比 三种单变量变换效果对比(右偏数据) 原始数据 右偏分布 长尾在右侧 均值 > 中位数 偏度 > 1 对数变换 ln(x) 强压缩右尾 分布接近正态 偏度 ≈ 0 平方根变换 √x 中等压缩 保留部分偏态 偏度 ≈ 0.5 Box-Cox 变换 (x^λ - 1)/λ 自动搜索最优 λ 自适应压缩 偏度 ≈ 0(最优) 变换选择指南 • 高偏态(偏度 > 1.5): 优先对数变换 • 中等偏态(0.5~1.5): 平方根或 Box-Cox • 计数数据(Poisson): 平方根变换 • 不确定最优变换: Box-Cox 自动搜索 • 需要业务解释: 对数变换(百分比) 提示:变换后需检查 残差正态性和方差齐性

3.6 实操建议与代码示例

变换选择流程

  1. 检查数据范围:若含零或负值,考虑 Yeo-Johnson 或加偏移量。
  2. 计算偏度:偏度 > 1.5 优先对数;0.5~1.5 尝试平方根或 Box-Cox。
  3. 尝试 Box-Cox:使用 MLE 自动搜索最优 λ,观察 λ 的置信区间。
  4. 验证效果:检查变换后的直方图、Q-Q 图、方差齐性检验。
  5. 业务解释:若需向非技术人员解释,优先选择对数或平方根。

Python 实现示例

import numpy as np
from scipy import stats
from sklearn.preprocessing import PowerTransformer

# 生成右偏数据
np.random.seed(42)
data = np.random.exponential(scale=2, size=1000)

# 1. 对数变换
log_data = np.log(data + 1e-6)  # 加极小值避免 log(0)

# 2. 平方根变换
sqrt_data = np.sqrt(data)

# 3. Box-Cox 变换(自动搜索最优 λ)
boxcox_data, best_lambda = stats.boxcox(data + 1e-6)
print(f"最优 λ: {best_lambda:.3f}")

# 4. 使用 sklearn 的 PowerTransformer(推荐)
pt = PowerTransformer(method='box-cox', standardize=False)
boxcox_sklearn = pt.fit_transform(data.reshape(-1, 1))
print(f"sklearn 估计 λ: {pt.lambdas_[0]:.3f}")

# 检查偏度变化
print(f"原始偏度: {stats.skew(data):.3f}")
print(f"对数变换偏度: {stats.skew(log_data):.3f}")
print(f"平方根变换偏度: {stats.skew(sqrt_data):.3f}")
print(f"Box-Cox 变换偏度: {stats.skew(boxcox_data):.3f}")
输出示例:
最优 λ: 0.234
sklearn 估计 λ: 0.234
原始偏度: 2.012
对数变换偏度: 0.152
平方根变换偏度: 0.487
Box-Cox 变换偏度: 0.038

3.7 常见陷阱与避坑指南

陷阱 后果 解决方案
对零值直接取对数 产生 -∞,模型崩溃 加偏移量 \( \ln(x+1) \) 或使用 Yeo-Johnson
过度依赖 Box-Cox 自动搜索 λ 非整数时解释困难 将 λ 四舍五入到最近的有理数(0, 0.5, 1)
变换后忘记逆变换 预测值尺度错误 保存变换参数,预测后执行逆变换
对分类变量使用变换 无意义,破坏编码 仅对连续数值变量使用
在测试集上重新估计 λ 数据泄露,评估偏乐观 在训练集上估计 λ,固定后应用于测试集
核心原则:变换的目的是改善模型假设,而非强制正态。若变换后模型性能无明显提升,或业务解释成本过高,应权衡是否保留原始尺度。