分位数变换#
- 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]#
使用分位数信息转换特征。
此方法将特征转换为服从均匀分布或正态分布。因此,对于给定的特征,这种变换倾向于分散最频繁的值。它还减少了(边缘)异常值的影响:因此这是一个稳健的预处理方案。
变换独立地应用于每个特征。首先,使用特征累积分布函数的估计值将原始值映射到均匀分布。然后,使用相关的分位数函数将获得的值映射到所需的输出分布。低于或高于拟合范围的新/未见数据的特征值将被映射到输出分布的边界。请注意,此变换是非线性的。它可能会扭曲以相同比例测量的变量之间的线性相关性,但会使以不同比例测量的变量更直接地可比较。
更多信息请阅读用户指南。
- 参数:
- X形状为 (n_samples, n_features) 的 {array-like, sparse matrix}
要转换的数据。
- 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
来禁用子采样。版本 1.5 中新增: 添加了
None
选项以禁用子采样。- random_stateint、RandomState 实例或 None,默认值=None
确定子采样和平滑噪声的随机数生成。有关更多详细信息,请参见
subsample
。传递一个整数以在多次函数调用中获得可重复的结果。参见词汇表。- copybool,默认值=True
如果为 False,则尝试避免复制并就地转换。但这并不保证始终能够就地进行转换;例如,如果数据是具有 int 数据类型的 numpy 数组,即使 copy=False,也会返回一个副本。
版本 0.23 中已更改: 在 0.23 中,
copy
的默认值从 False 更改为 True。
- 返回:
- Xt形状为 (n_samples, n_features) 的 {ndarray, sparse matrix}
转换后的数据。
另请参见
备注
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([...])