《投资-374》量化交易 - 特征工程 - sklearn分箱函数与使用方法

在 scikit-learn(sklearn)中,虽然没有专门命名为“分箱”(Binning)的独立模块,但提供了多个**强大的预处理工具**来实现将连续变量转换为离散类别——即“分箱操作”。

这些方法广泛应用于特征工程、模型稳定性提升和非线性关系建模。


✅ 一、sklearn 中用于分箱的核心函数与类

方法所属模块功能说明
🔹 KBinsDiscretizersklearn.preprocessing

最常用

支持等宽、等频、K均值三种分箱方式

🔹 DecisionTreeClassifier/Regressorsklearn.tree用决策树生成最优切分点(有监督分箱)
🔹 FunctionTransformer + 自定义函数sklearn.preprocessing灵活实现自定义规则分箱

📦 二、核心函数详解与使用方法


1️⃣ KBinsDiscretizer —— 最推荐的自动分箱工具

✅ 功能:

将连续特征划分为 n_bins 个区间,并输出离散化后的整数编码或 one-hot 编码。

支持三种策略:
参数 strategy=含义
'uniform'等宽分箱(Equal-width)
'quantile'等频分箱(Equal-frequency)
'kmeans'K-Means聚类分箱(基于簇中心划分)
🧪 基本语法:

from sklearn.preprocessing import KBinsDiscretizer

import numpy as np

# 示例数据(一列)

X = np.array([[1.2], [5.6], [3.4], [7.8], [2.1], [9.5], [6.3]])

# 创建分箱器:分为3箱,使用等频策略,输出one-hot

est = KBinsDiscretizer(

n_bins=3,

encode='onehot', # 可选 'onehot' / 'ordinal'

strategy='quantile' # 'uniform', 'quantile', 'kmeans'

)

X_binned = est.fit_transform(X)

输出说明:
  • encode='ordinal' → 输出 [0, 1, 2] 类型的整数标签
  • encode='onehot' → 输出稀疏矩阵(可用 .toarray() 查看)

💡 推荐用于无监督场景下的特征离散化。


🔄 如何还原原始区间?(获取断点)

# 查看每个特征的边界值

bin_edges = est.bin_edges_[0] # 第一个特征的分界点

print("Bin edges:", )

# 输出示例: [1.2 3.4 6.3 9.5]

可用于后续解释或新数据转换。


2️⃣ 使用 DecisionTree 实现有监督分箱(Supervised Binning)

✅ 场景:

你想根据目标变量 y 来找到最佳切分点(如风控中的WOE分箱前奏)。

方法思路:
  • 训练一棵浅层决策树(深度1~3),仅使用单个连续特征预测 y
  • 提取其分裂阈值作为“最优分箱点”
🧪 示例代码:

from sklearn.tree import DecisionTreeClassifier

import numpy as np

# 模拟数据

X = np.array([10, 20, 30, 40, 50, 60, 70, 80, 90]).reshape(-1, 1)

y = np.array([0, 0, 0, 1, 1, 1, 1, 1, 1]) # 目标变量

# 构建浅层树

tree = DecisionTreeClassifier(

max_depth=2, # 控制复杂度

min_samples_leaf=0.2, # 防止过拟合

random_state=0

)

tree.fit(X, y)

# 获取分割点(通过 tree.tree_.threshold)

thresholds = tree.tree_.threshold[tree.tree_.feature == 0]

print("Optimal split points:", thresholds) # 如 [35.] → 在35处分割

✅ 应用:可据此将原变量分为 [<35, >=35] 两组,再计算每组的坏账率、转化率等。


3️⃣ 自定义规则分箱(配合 FunctionTransformer

✅ 场景:

你需要按业务逻辑手动设置断点,如 BMI 分级、信用评分等级。

🧪 示例:BMI 四分法

from sklearn.preprocessing import FunctionTransformer

import numpy as np

def bmi_category(x):

"""

输入体重(kg)和身高(m),返回类别编码

"""

weight = x[:, 0]

height = x[:, 1]

bmi = weight / (height ** 2)

bins = [0, 18.5, 24, 28, 100]

labels = [0, 1, 2, 3] # 偏瘦、正常、超重、肥胖

return np.digitize(bmi, bins=bins, right=False) - 1

# 包装成转换器

custom_binner = FunctionTransformer(bmi_category, validate=False)

# 使用

X_raw = np.array([[60, 1.7], [75, 1.75], [90, 1.7]]) # [weight, height]

X_cat = custom_binner.transform(X_raw)

print(X_cat) # 输出类别标签

✅ 优势:完全可控,适合强领域知识场景。


🔍 三、常见参数说明(以 KBinsDiscretizer 为例)

参数说明
n_bins分多少个箱子(默认5)
encode'onehot', 'onehot-dense', 'ordinal'
strategy'uniform'(等宽)、'quantile'(等频)、'kmeans'(聚类)
dtype输出类型(float64/int等)

🧩 四、实战流程建议(完整 pipeline)

from sklearn.pipeline import Pipeline

from sklearn.preprocessing import KBinsDiscretizer, StandardScaler

from sklearn.linear_model import LogisticRegression

# 构建流水线:标准化 → 分箱 → 建模

pipeline = Pipeline([

('scaler', StandardScaler()), # 可选,尤其当使用kmeans时

('binner', KBinsDiscretizer(n_bins=5, encode='ordinal', strategy='quantile')),

('model', LogisticRegression())

])

pipeline.fit(X_train, y_train)

⚠️ 注意:只在训练集上 fit()测试集直接 transform(),防止数据泄露。


✅ 五、如何选择合适的分箱策略?

场景推荐方法
数据分布均匀strategy='uniform'
数据偏态严重(如收入)strategy='quantile'(等频)
想发现自然聚集模式strategy='kmeans'
追求最大区分度(有y)决策树找切分点
有明确业务标准自定义规则分箱

❗ 六、注意事项

要点说明
✅ 保留 bin_edges便于解释和未来部署
✅ 不要在测试集重新学习分箱规则必须复用训练集的边界
✅ 避免过多分箱一般3~8箱为宜,防止过拟合
✅ 结合下游任务评估效果用交叉验证判断是否真提升了模型性能

✅ 总结一句话:

**KBinsDiscretizer 是 sklearn 中进行自动化分箱的首选工具**,它支持等宽、等频、K均值三种主流策略,结合 Pipeline 可轻松集成到机器学习流程中。


💡 一句口诀记忆:

“要分箱,用KBins;
等宽 uniform,等频 quantile;
聚类靠 kmeans,监督靠树 splits。”


🎯 掌握这些方法,你就掌握了从数值到类别的关键跃迁能力——
不是所有模型都需要连续输入,有时,“段位”比“分数”更有力量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文火冰糖的硅基工坊

你的鼓励是我前进的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值