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
λ
,
λ
≠
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,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 − X min X max − X min X' = \frac{X - X_{\min}}{X_{\max} - X_{\min}} X′=Xmax−XminX−Xmin |
RobustScaler | 数据有异常值 | X ′ = X − median I Q R X' = \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
。