幂变换是一系列参数化且单调的转换方法,它们被应用于数据以使其更接近正态分布。这种转换对于处理与非恒定方差(异方差性)相关的问题非常有用,或者在需要数据符合正态分布的情况下。目前,幂变换支持Box-Cox变换和Yeo-Johnson变换。通过最大似然估计来确定稳定方差和最小化偏度的最优参数。Box-Cox变换要求输入数据必须严格为正,而Yeo-Johnson变换支持正数和负数数据。默认情况下,对转换后的数据应用零均值、单位方差的标准化处理。
在进行幂变换时,可以选择不同的方法。'yeo-johnson'方法可以处理正数和负数,而'box-cox'方法仅适用于严格正数的数据。从版本0.23开始,默认的变换方法从'box-cox'更改为'yeo-johnson'。标准化参数用于控制是否对转换后的输出应用零均值、单位方差的标准化处理。如果设置为False,则尝试避免复制并在原地进行转换,但这并不总是保证能够成功;例如,如果数据是具有整数数据类型的numpy数组,即使设置了copy=False,也会返回一个副本。
转换后的数据将被存储在X_trans变量中,其形状与输入数据X相同。此外,还有一个等效的转换方法,即使用Transformer API(例如作为预处理流水线的一部分)。还有另一种转换方法quantile_transform,它将数据映射到具有参数output_distribution='normal'的标准正态分布。
需要注意的是,NaN值被视为缺失值:在拟合过程中被忽略,并在转换过程中保持不变。对于不同的缩放器、转换器和正规化器的比较,可以参考相关文档。
import numpy as np
from sklearn.preprocessing import power_transform
data = [
[1, 2],
[3, 2],
[4, 5]
]
print(power_transform(data, method='box-cox'))
# 输出:[[-1.332... -0.707...]
# [ 0.256... -0.707...]
# [ 1.076... 1.414...]]
警告:数据泄露风险。除非清楚自己在做什么,否则不要使用power_transform。一个常见的错误是在将数据划分为训练集和测试集之前就将其应用于整个数据集。这将导致模型评估产生偏差,因为信息会从测试集泄露到训练集中。通常,建议在流水线中使用PowerTransformer,以防止大多数数据泄露的风险,例如:
pipe = make_pipeline(PowerTransformer(), LogisticRegression())