You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中用sklearn将数据集标准化为五分位数离散桶?

实现等频五分桶的两种方法(基于sklearn)

当然可以实现!而且用sklearn的工具包就能轻松搞定,甚至有两种常用思路,我给你拆解清楚:

方法一:用QuantileTransformer + 手动映射

你提到的QuantileTransformer确实可以帮你完成第一步——把数据转换成0-1区间的均匀分布,这时候每个20%的样本刚好对应0-0.2、0.2-0.4…0.8-1这些区间。我们只需要加一步简单的数学映射,就能把这些连续值转成1-5的离散桶:

from sklearn.preprocessing import QuantileTransformer
import numpy as np

# 生成示例数据(替换成你的数据集)
X = np.random.normal(0, 1, 1000).reshape(-1, 1)

# 初始化转换器,输出0-1的均匀分布
qt = QuantileTransformer(output_distribution='uniform', random_state=42)
X_normalized = qt.fit_transform(X)

# 将0-1的连续值映射为1-5的离散桶
# 逻辑:0≤x<0.2 → 1,0.2≤x<0.4 →2,…,0.8≤x≤1 →5
X_bins = np.floor(X_normalized * 5).astype(int) + 1

这里的核心逻辑是:QuantileTransformer会把数据按分位数压缩到0-1,乘以5后得到0-5的连续值,用floor取整后得到0-4的整数,最后加1就转换成了你需要的1-5桶标签。

方法二:用KBinsDiscretizer(更直接的分桶工具)

其实sklearn里还有专门做离散分桶的工具——KBinsDiscretizer,它可以直接按你的需求生成等频分桶,不需要额外的映射步骤,更省心:

from sklearn.preprocessing import KBinsDiscretizer

# 初始化离散化器:设置5个桶,采用分位数策略(保证每个桶样本数近似相等)
kbd = KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='quantile', random_state=42)
# 拟合转换后得到0-4的标签,加1转成1-5
X_bins = kbd.fit_transform(X).astype(int) + 1

这里的strategy='quantile'就是告诉工具按分位数分桶,确保每个桶里的样本占比接近20%;encode='ordinal'让输出是顺序型的整数标签,最后加1就得到你要的1-5区间。

小提示

  • 如果你的数据集有重复值,分桶后的样本占比可能会有微小偏差,但整体会符合“前20%、次20%”的要求;
  • 设置random_state是为了保证多次运行的分桶结果一致;
  • 两种方法都支持多特征数据,KBinsDiscretizer默认会对每个特征单独分桶,QuantileTransformer也可以通过设置n_quantiles来适配。

内容的提问来源于stack exchange,提问作者Niccola Tartaglia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:56:33