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

Python Pandas自动分箱优化:如何让程序自动选择最优分箱?

自动实现按数据量均衡的最优分箱方案

当然可以通过Python工具实现自动根据数据分布确定分箱区间,保证每个分箱的数据量尽可能均衡。以下是几种实用的实现方法:

方法一:使用pandas qcut 快速实现等频分箱

qcut 是pandas专为等频分箱设计的工具,它会根据数据的分位数划分区间,确保每个分箱内的样本数量大致相同,完全匹配你需要的「自动确定最佳分箱数据量」的需求。

import pandas as pd

# 直接将数据分成5个等频分箱,自动生成区间标签
df_binned_desks['binned'] = pd.qcut(
    df_binned_desks['Occupancy x Building x Hour'],
    q=5,  # 指定分箱数量
    duplicates='drop'  # 处理重复分位数,避免报错
)

# 自定义标签格式(和你原代码风格一致)
bins = pd.qcut(
    df_binned_desks['Occupancy x Building x Hour'],
    q=5,
    duplicates='drop',
    retbins=True
)[1]
desk_occ_labels = [f"{x:.0f}-{y:.0f}" for x, y in zip(bins[:-1], bins[1:])]

# 应用自定义标签的分箱
df_binned_desks['binned_with_custom_labels'] = pd.qcut(
    df_binned_desks['Occupancy x Building x Hour'],
    q=5,
    duplicates='drop',
    labels=desk_occ_labels
)

方法二:手动计算分位数实现等频分箱

如果需要更精细的控制(比如调整分箱数量、处理特殊值),可以手动计算分位数后用pd.cut分箱:

import pandas as pd
import numpy as np

# 指定分箱数量
n_bins = 5
# 生成0到1的分位数序列
quantiles = np.linspace(0, 1, n_bins + 1)
# 计算数据对应的分位数点,去重避免重复区间
bins = df_binned_desks['Occupancy x Building x Hour'].quantile(quantiles).unique()

# 生成自定义标签
desk_occ_labels = [f"{x:.0f}-{y:.0f}" for x, y in zip(bins[:-1], bins[1:])]

# 执行分箱,include_lowest=True确保最小值被包含在第一个区间
df_binned_desks['binned'] = pd.cut(
    df_binned_desks['Occupancy x Building x Hour'],
    bins=bins,
    labels=desk_occ_labels,
    include_lowest=True
)

方法三:OptBinning库(适合建模场景的最优分箱)

如果你的分箱是为后续机器学习建模服务,OptBinning库可以结合数据分布和模型性能自动选择最优分箱,同时支持设置分箱数据量的约束:

from optbinning import OptimalBinning

# 初始化分箱器,设置每个分箱的最小样本比例(比如10%)
optb = OptimalBinning(
    name="occupancy",
    dtype="numerical",
    min_bin_size=0.1  # 每个分箱至少包含10%的总样本
)

# 拟合数据(如果有目标变量,可传入y参数实现有监督分箱)
optb.fit(df_binned_desks['Occupancy x Building x Hour'])

# 获取分箱分割点,补充首尾边界
bins = optb.splits
full_bins = [0] + bins + [df_binned_desks['Occupancy x Building x Hour'].max()]
desk_occ_labels = [f"{x:.0f}-{y:.0f}" for x, y in zip(full_bins[:-1], full_bins[1:])]

# 应用分箱
df_binned_desks['binned'] = optb.transform(
    df_binned_desks['Occupancy x Building x Hour'],
    metric="bins"
)

总结

  • 只需实现等频分箱时,pandas qcut 是最简洁高效的选择;
  • 需要自定义分箱逻辑时,手动计算分位数结合pd.cut更灵活;
  • 面向建模场景时,OptBinning能提供兼顾数据分布和模型效果的最优分箱方案。

内容的提问来源于stack exchange,提问作者Arina Belozerova

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 03:05:19