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)[source]#
使用分位数信息转换特征。
该方法将特征转换为符合均匀分布或正态分布。因此,对于给定的特征,该转换倾向于将最频繁的值分散开来。它还降低了(边缘)异常值的影响:因此,这是一种稳健的预处理方案。
该转换在每个特征上独立应用。首先使用特征累积分布函数的估计值将原始值映射到均匀分布。然后,使用相关的分位数函数将获得的值映射到所需的输出分布。落入拟合范围之外的新/未见数据的特征值将被映射到输出分布的边界。请注意,此转换是非线性的。它可能会扭曲以相同尺度测量的变量之间的线性相关性,但能使以不同尺度测量的变量更具直接可比性。
更多信息请参阅 用户指南。
- 参数:
- Xshape 为 (n_samples, n_features) 的 {array-like, sparse matrix}
要转换的数据。
- axisint, default=0
用于计算均值和标准差的轴。如果为 0,则转换每个特征;否则(如果为 1),则转换每个样本。
- n_quantilesint, default=1000 或 n_samples
要计算的分位数数量。它对应于用于离散化累积分布函数的标记点数量。如果 n_quantiles 大于样本数,则 n_quantiles 被设置为样本数,因为更多的分位数不会提供对累积分布函数估计器更好的近似。
- output_distribution{‘uniform’, ‘normal’}, default=’uniform’
转换后数据的边缘分布。选项为 ‘uniform’(默认)或 ‘normal’。
- ignore_implicit_zerosbool, default=False
仅适用于稀疏矩阵。如果为 True,则在计算分位数统计时忽略矩阵中的稀疏条目。如果为 False,则这些条目被视为零。
- subsampleint 或 None, default=1e5
为提高计算效率,用于估计分位数的最大样本数。请注意,对于值相同的稀疏矩阵和稠密矩阵,子采样过程可能有所不同。通过设置
subsample=None禁用子采样。版本 1.5 新增: 增加了禁用子采样的
None选项。- random_stateint, RandomState instance or None, default=None
确定用于子采样和平滑噪声的随机数生成。有关详细信息,请参见
subsample。传入一个 int 以在多次函数调用中获得可重复的结果。请参阅 术语表。- copy布尔值, 默认为 True
如果为 False,则尝试避免复制并在原处转换。这不能保证总是在原处工作;例如,如果数据是 int 数据类型的 numpy 数组,即使 copy=False,也会返回一个副本。
版本 0.23 变更:
copy的默认值在 0.23 版本中从 False 更改为 True。
- 返回:
- Xt形状为 (n_samples, n_features) 的 {ndarray, sparse matrix}
转换后的数据。
另请参阅
QuantileTransformer使用 Transformer API 执行基于分位数的缩放(例如,作为预处理
Pipeline的一部分)。power_transform使用幂变换将数据映射到正态分布。
scale执行标准化,速度更快,但对异常值的稳健性较差。
robust_scale执行稳健的标准化,消除异常值的影响,但不会将异常值和正常值放在同一尺度上。
注意事项
NaN 被视为缺失值:在拟合过程中忽略,在转换过程中保持。
警告
数据泄露风险
除非您知道自己在做什么,否则请勿使用
quantile_transform。一个常见的错误是在拆分训练集和测试集之前将此方法应用于整个数据集。这将导致模型评估偏差,因为信息会从测试集泄露到训练集中。通常,我们建议在 Pipeline 中使用QuantileTransformer,以防止大多数数据泄露风险:pipe = make_pipeline(QuantileTransformer(), LogisticRegression())。有关不同缩放器、变换器和归一器的比较,请参阅:比较不同缩放器对异常值数据的效果。
示例
>>> 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([...])