【scikit-learn】sklearn.preprocessing.PowerTransformer 类:正态分布转换(Box-Cox 或 Yeo-Johnson)
PowerTransformer是sklearn.preprocessing提供的数据转换方法,用于将数据转换为更接近正态分布,适用于非正态数据,可以提高机器学习模型的性能。如果数据仅包含正数,可以使用Box-Cox变换,否则应使用Yeo-Johnson变换。如果数据已经服从正态分布,可使用StandardScaler,如果数据包含异常值,可使用RobustScaler。
sklearn.preprocessing.PowerTransformer
PowerTransformer 是 sklearn.preprocessing 提供的 数据转换方法,用于将数据转换为更接近正态分布,适用于 非正态数据,可以提高机器学习模型的性能。
1. PowerTransformer 计算原理
PowerTransformer 主要提供 两种变换方法:
- Box-Cox 变换(
method='box-cox') - Yeo-Johnson 变换(
method='yeo-johnson',默认)
(1) Box-Cox 变换
X′={Xλ−1λ,λ≠0log(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≥0log(X+1),λ=0,X≥0−(∣X∣+1)2−λ+12−λ,λ≠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,X≥0λ=0,X≥0λ=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−XminXmax−XminX' = \frac{X - X_{\min}}{X_{\max} - X_{\min}}X′=Xmax−XminX−Xmin |
RobustScaler |
数据有异常值 | X′=X−medianIQRX' = \frac{X - \text{median}}{IQR}X′=IQRX−median |
示例:
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。
更多推荐


所有评论(0)