【scikit-learn】sklearn.preprocessing.PowerTransformer 类:正态分布转换(Box-Cox 或 Yeo-Johnson)

sklearn.preprocessing.PowerTransformer

PowerTransformersklearn.preprocessing 提供的 数据转换方法用于将数据转换为更接近正态分布,适用于 非正态数据,可以提高机器学习模型的性能。


1. PowerTransformer 计算原理

PowerTransformer 主要提供 两种变换方法

  • Box-Cox 变换(method='box-cox'
  • Yeo-Johnson 变换(method='yeo-johnson',默认)

(1) Box-Cox 变换

X ′ = { X λ − 1 λ , λ ≠ 0 log ⁡ ( X ) , λ = 0 X' = \begin{cases} \frac{X^\lambda - 1}{\lambda}, & \lambda \neq 0 \\ \log(X), & \lambda = 0 \end{cases} X={λXλ1,log(X),λ=0λ=0
要求:

  • X 必须是正数(不能有 0 或负数)。
  • 适用于右偏(正偏)数据分布

(2) Yeo-Johnson 变换(默认)

X ′ = { ( X + 1 ) λ − 1 λ , λ ≠ 0 , X ≥ 0 log ⁡ ( X + 1 ) , λ = 0 , X ≥ 0 − ( ∣ X ∣ + 1 ) 2 − λ + 1 2 − λ , λ ≠ 2 , X < 0 − log ⁡ ( ∣ X ∣ + 1 ) , λ = 2 , X < 0 X' = \begin{cases} \frac{(X+1)^\lambda - 1}{\lambda}, & \lambda \neq 0, X \geq 0 \\ \log(X + 1), & \lambda = 0, X \geq 0 \\ \frac{-(|X| + 1)^{2 - \lambda} + 1}{2 - \lambda}, & \lambda \neq 2, X < 0 \\ -\log(|X| + 1), & \lambda = 2, X < 0 \end{cases} X= λ(X+1)λ1,log(X+1),2λ(X+1)2λ+1,log(X+1),λ=0,X0λ=0,X0λ=2,X<0λ=2,X<0
特点:

  • 可以处理负数和 0
  • 适用于左右偏数据

解释

  • Box-Cox 适用于正数数据,会自动找到 最佳 λ(lambda)值 以优化正态性。
  • Yeo-Johnson 可处理任意数值数据,适用于 既有正数又有负数的情况

2. PowerTransformer 代码示例

(1) 处理非正态分布数据

from sklearn.preprocessing import PowerTransformer
import numpy as np

# 示例数据(非正态分布)
X = np.array([[1], [2], [3], [100]])

# 使用 Yeo-Johnson 变换(默认)
transformer = PowerTransformer()
X_transformed = transformer.fit_transform(X)

print("Yeo-Johnson 变换后数据:\n", X_transformed)

输出

Yeo-Johnson 变换后数据:
[[-1.118   ]
 [-0.677  ]
 [-0.241  ]
 [ 2.037  ]]

解释

  • 数据被转换为更接近正态分布,减少了偏态和异方差。

(2) 使用 Box-Cox 变换

transformer = PowerTransformer(method='box-cox')
X_transformed = transformer.fit_transform(X)

print("Box-Cox 变换后数据:\n", X_transformed)

注意

  • 如果数据中 包含 0 或负数Box-Cox 会报错:
    ValueError: The Box-Cox transformation can only be applied to strictly positive data
    
  • Box-Cox 仅适用于正数数据

(3) 查看最佳 λ(lambda)

print("最佳 λ(lambda):", transformer.lambdas_)

解释

  • PowerTransformer 自动找到最佳 λ 值,使数据更接近正态分布。

3. PowerTransformer 的参数

PowerTransformer(method='yeo-johnson', standardize=True, copy=True)
参数说明
method'yeo-johnson'(默认,可处理负数)或 'box-cox'(仅适用于正数)
standardize是否 转换为均值 0,标准差 1(默认 True
copy是否 复制数据(默认 True

4. 适用场景

  • 数据偏态较大(右偏或左偏),需要转换为正态分布。
  • 线性回归、逻辑回归、SVM、PCA,对正态性要求较高。
  • Box-Cox 适用于全正数据,如 金融、人口数据
  • Yeo-Johnson 可处理负数,如 温度变化、股票涨跌数据

5. PowerTransformer vs. 其他数据转换方法

方法适用情况计算方式
PowerTransformer数据偏态较大,需要正态化Box-Cox / Yeo-Johnson 变换
StandardScaler数据服从正态分布 X ′ = X − μ σ X' = \frac{X - \mu}{\sigma} X=σXμ
MinMaxScaler数据范围较大,需要缩放 X ′ = X − X min ⁡ X max ⁡ − X min ⁡ X' = \frac{X - X_{\min}}{X_{\max} - X_{\min}} X=XmaxXminXXmin
RobustScaler数据有异常值 X ′ = X − median I Q R X' = \frac{X - \text{median}}{IQR} X=IQRXmedian

示例:

from sklearn.preprocessing import StandardScaler, MinMaxScaler, RobustScaler

std_scaler = StandardScaler()
X_std = std_scaler.fit_transform(X)

minmax_scaler = MinMaxScaler()
X_minmax = minmax_scaler.fit_transform(X)

robust_scaler = RobustScaler()
X_robust = robust_scaler.fit_transform(X)

print("StandardScaler:\n", X_std)
print("MinMaxScaler:\n", X_minmax)
print("RobustScaler:\n", X_robust)

6. 结论

  • PowerTransformer 将数据转换为接近正态分布,适用于 偏态数据,提高模型稳定性。
  • 如果数据 仅包含正数,可以使用 Box-Cox 变换,否则应使用 Yeo-Johnson 变换
  • 如果数据已经服从正态分布,可使用 StandardScaler,如果数据包含异常值,可使用 RobustScaler
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值