趋近智
分位数变换提供了一种独特的特征分布修改方法。与标准化和归一化 (normalization)等主要调整特征尺度的方法,或对数变换和Box-Cox变换等旨在使分布更接近高斯分布的方法不同,分位数变换是一种非线性过程。它将特征的概率分布映射到特定的均匀分布或正态分布,而与原始分布的形状无关。这是通过利用数据点的秩或分位数来实现的。
分位数变换的核心思想是估计特征的经验累积分布函数(CDF),然后使用此CDF将原始值映射到目标输出分布。
由于此方法依赖于数据点的秩顺序而非其绝对值,它对异常值具有天然的鲁棒性。异常值将被映射到目标分布的极端边缘(例如,对于均匀分布接近0或1,对于正态分布则是较大的负值/正值),但不会像StandardScaler或MinMaxScaler那样不成比例地影响其他点的变换。
Scikit-learn提供了sklearn.preprocessing.QuantileTransformer类用于此目的。让我们看看如何使用它。
import numpy as np
import pandas as pd
from sklearn.preprocessing import QuantileTransformer
import plotly.graph_objects as go
from plotly.subplots import make_subplots
# 生成一些偏斜数据
np.random.seed(42)
data_original = np.random.exponential(scale=2, size=1000).reshape(-1, 1) + 1 # 加1以避免之后使用对数时出现零的问题
# 初始化变换器
qt_uniform = QuantileTransformer(output_distribution='uniform', n_quantiles=1000, random_state=42)
qt_normal = QuantileTransformer(output_distribution='normal', n_quantiles=1000, random_state=42)
# 应用变换
data_uniform = qt_uniform.fit_transform(data_original)
data_normal = qt_normal.fit_transform(data_original)
# 创建DataFrame以便绘图
df = pd.DataFrame({
'原始数据': data_original.flatten(),
'均匀分位数': data_uniform.flatten(),
'正态分位数': data_normal.flatten()
})
# --- 可视化 ---
fig = make_subplots(rows=1, cols=3, subplot_titles=('原始指数数据', '均匀分位数变换后', '正态分位数变换后'))
fig.add_trace(go.Histogram(x=df['原始数据'], name='原始', marker_color='#4dabf7'), row=1, col=1)
fig.add_trace(go.Histogram(x=df['均匀分位数'], name='均匀', marker_color='#38d9a9'), row=1, col=2)
fig.add_trace(go.Histogram(x=df['正态分位数'], name='正态', marker_color='#be4bdb'), row=1, col=3)
fig.update_layout(
title_text='分位数变换对偏斜数据的影响',
bargap=0.1,
showlegend=False,
height=350,
margin=dict(l=20, r=20, t=60, b=20)
)
# 显示Plotly图表JSON
# print(fig.to_json()) # 你会在你的环境中运行此代码
原始指数数据的分布。
均匀分位数变换后的分布。请注意值是如何均匀分散的。
正态分位数变换后的分布。数据现在类似于高斯形状。
分位数变换具有多项优点和重要的考量事项:
fit_transform时的数据泄露: 与其他缩放器一样,只在训练数据上应用fit,然后对训练和测试数据都应用transform,这一点很重要。在分割之前直接将fit_transform应用于整个数据集(包括测试数据)可能导致数据泄露,即测试集中的信息隐式地影响训练过程,从而导致过分乐观的性能估计。在以下情况,考虑使用分位数变换:
分位数变换虽然是一个有用的工具,但有时会使模型的可解释性更具挑战性,因为变换后的值不再与原始尺度有直接的线性关系。然而,对于许多预测建模任务,模型性能的提升通常会弥补这一缺点。
这部分内容有帮助吗?
QuantileTransformer 类的官方文档,详细说明其参数、用法和工作机制。© 2026 ApX Machine LearningAI伦理与透明度•