特征量化变换方法

机器学习数据预处理中,经常需要对特征进行变换以满足特定算法的需求。一种常见的变换方法是量化变换,它通过分位数信息将特征变换为均匀或正态分布。这种变换方法能够扩展最频繁出现的值,减少边际异常值的影响,因此是一种稳健的预处理方案。

量化变换是独立应用于每个特征的。首先,使用特征的累积分布函数的估计值将原始值映射到均匀分布。然后,使用相关的分位数函数将得到的值映射到所需的输出分布。对于落在拟合范围之外的新/未见过的数据的特征值,将被映射到输出分布的边界。需要注意的是,这种变换是非线性的,它可能会扭曲在同一尺度上测量的变量之间的线性相关性,但可以使在不同尺度上测量的变量更直接地可比。

在进行量化变换时,需要考虑几个参数,如数据集、轴向、分位数的数量、输出分布、是否忽略隐含的零值、样本的子集大小、随机状态和是否复制数据。例如,'n_quantiles' 参数决定了要计算的分位数数量,它对应于用于离散化累积分布函数的地标数量。如果 'n_quantiles' 大于样本数量,它将被设置为样本数量,因为更多的分位数不会给出更好的累积分布函数估计器的近似值。

另一个重要的参数是 'output_distribution',它决定了变换数据的边际分布。默认情况下,选择 'uniform'(均匀分布),也可以选择 'normal'(正态分布)。此外,'ignore_implicit_zeros' 参数仅适用于稀疏矩阵,如果设置为 True,则在计算分位数统计时丢弃矩阵的稀疏条目;如果设置为 False,则将这些条目视为零。

为了提高计算效率,'subsample' 参数允许指定用于估计分位数的最大样本数量。如果设置 'subsample=None',则禁用子采样。'random_state' 参数用于确定子采样和平滑噪声的随机数生成,可以通过传递一个整数来在多次函数调用之间获得可重复的结果。

在进行量化变换时,需要特别注意数据泄露的风险。不要在将数据分割为训练集和测试集之前对整个数据应用量化变换,因为这会从测试集泄露信息到训练集,从而偏倚模型评估。通常建议在 Pipeline 中使用 QuantileTransformer,以防止大多数数据泄露的风险。

在实际应用中,可以使用 Python 的 sklearn.preprocessing 库中的 quantile_transform 函数来进行量化变换。例如,以下代码展示了如何对一个正态分布的数据集进行量化变换:

import numpy as np from sklearn.preprocessing import QuantileTransformer # 设置随机数生成器 rng = np.random.RandomState(0) # 生成一个正态分布的数据集 X = np.sort(rng.normal(loc=0.5, scale=0.25, size=(25, 1)), axis=0) # 应用量化变换 transformed_X = QuantileTransformer(n_quantiles=10, random_state=0, copy=True).fit_transform(X) print(transformed_X)
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485