quantile_transform#
- sklearn.preprocessing.quantile_transform(X, *, axis=0, n_quantiles=1000, output_distribution='uniform', ignore_implicit_zeros=False, subsample=100000, random_state=None, copy=True)#
使用分位数信息转换特征。
该方法将特征转换为遵循均匀分布或正态分布。因此,对于给定的特征,这种转换倾向于分散最频繁的值。它还减少了(边际)离群值的影响:因此这是一种稳健的预处理方案。
转换在每个特征上独立进行。首先使用特征的累积分布函数的估计值将原始值映射到均匀分布。然后将得到的值使用相关的分位数函数映射到所需的输出分布。新/未见数据的特征值如果落在拟合范围之外,将被映射到输出分布的边界。请注意,这种转换是非线性的。它可能会扭曲在同一尺度上测量的变量之间的线性相关性,但会使在不同尺度上测量的变量更直接可比。
更多信息请参阅 用户指南 。
- Parameters:
- X{array-like, sparse matrix},形状为 (n_samples, n_features)
要转换的数据。
- axisint, 默认为 0
用于计算均值和标准差的轴。如果为 0,则转换每个特征,否则(如果为 1)转换每个样本。
- n_quantilesint, 默认为 1000 或 n_samples
要计算的分位数数量。它对应于用于离散化累积分布函数的界标数量。如果 n_quantiles 大于样本数量,则 n_quantiles 设置为样本数量,因为更多的分位数不会更好地逼近累积分布函数估计器。
- output_distribution{‘uniform’, ‘normal’}, 默认为 ‘uniform’
转换后数据的边际分布。选项为 ‘uniform’(默认)或 ‘normal’。
- ignore_implicit_zerosbool, 默认为 False
仅适用于稀疏矩阵。如果为 True,则矩阵的稀疏条目将被丢弃以计算分位数统计信息。如果为 False,这些条目将被视为零。
- subsampleint 或 None, 默认为 1e5
用于估计分位数的最大样本数,以提高计算效率。请注意,对于值相同的稀疏和密集矩阵,子采样过程可能不同。通过设置
subsample=None
禁用子采样。Added in version 1.5: 添加了禁用子采样的
None
选项。- random_stateint, RandomState 实例或 None, 默认为 None
确定用于子采样和平滑噪声的随机数生成。 请参阅
subsample
了解更多详细信息。 传递一个 int 以在多次函数调用中获得可重复的结果。 请参阅 Glossary 。- copybool, 默认为 True
如果为 False,尝试避免复制并在原地进行转换。 这不能保证总是就地工作;例如,如果数据是具有 int 数据类型的 numpy 数组,即使设置了 copy=False,也会返回一个副本。
Changed in version 0.23:
copy
的默认值从 False 更改为 True 在 0.23 版本中。
- Returns:
- Xt{ndarray, sparse matrix},形状为 (n_samples, n_features)
转换后的数据。
See also
QuantileTransformer
使用 Transformer API 执行基于分位数的缩放(例如,作为预处理
Pipeline
的一部分)。power_transform
使用幂变换将数据映射到正态分布。
scale
执行标准化,速度更快,但对离群值的鲁棒性较差。
robust_scale
执行鲁棒标准化,去除离群值的影响,但不将离群值和内点放在同一尺度上。
Notes
NaN 被视为缺失值:在拟合中被忽略,在转换中被保留。
Warning
数据泄露风险
除非你知道自己在做什么,否则不要使用
quantile_transform
。一个常见的错误是在将数据拆分为训练集和测试集之前对其进行转换。这将使模型评估产生偏差,因为信息会从测试集泄露到训练集。 一般来说,我们建议在 Pipeline 中使用QuantileTransformer
,以防止大多数数据泄露风险:pipe = make_pipeline(QuantileTransformer(), LogisticRegression())
。有关不同缩放器、转换器和标准化器的比较,请参见:比较不同缩放器对含有异常值的数据的影响 。
Examples
>>> import numpy as np >>> from sklearn.preprocessing import quantile_transform >>> rng = np.random.RandomState(0) >>> X = np.sort(rng.normal(loc=0.5, scale=0.25, size=(25, 1)), axis=0) >>> quantile_transform(X, n_quantiles=10, random_state=0, copy=True) array([...])