使用OptBinning自定义分箱生成统计表格时缺失首箱的问题解决
问题:基于optbinning自定义分箱生成完整统计表格
希望用optbinning库基于已有的自定义分箱生成包含所有指标的统计表格,无需执行分箱优化操作。但使用user_splits参数指定分箱后,生成的表格缺失首箱(-inf,28];添加user_splits_fixed参数后效果更差。
模拟数据集代码
import random import pandas as pd from datetime import datetime, timedelta from optbinning import OptimalBinning # 设置随机种子确保可复现 random.seed(42) # 生成模拟数据 data = { 'GB': [random.choice([0, 1]) for _ in range(2000)], 'Period': [(datetime(2021, 1, 1) + timedelta(days=random.randint(0, 731))).strftime("%m/%Y") for _ in range(2000)], 'Age': [random.randint(18, 80) if random.random() > 0.2 else None for _ in range(2000)], 'L6ag': [random.randint(0, 9) if random.random() > 0.2 else None for _ in range(2000)], 'L_3M': [chr(random.randint(65, 90)) if random.random() > 0.2 else None for _ in range(2000)], 'M36m': [random.randint(0, 1000) for _ in range(2000)], 'Balance': [random.randint(0, 100000) for _ in range(2000)] } df = pd.DataFrame(data)
正确解决方案代码
核心是添加skip_optimal_binning=True参数,强制跳过optbinning的优化分箱逻辑,严格保留用户指定的分箱分割点:
# 定义自定义分箱分割点 custom_bins = [28, 37, 63, 67] # 初始化分箱对象,跳过优化流程 optb = OptimalBinning( name="Age", dtype="numerical", user_splits=custom_bins, skip_optimal_binning=True # 关键参数:关闭分箱优化,完全使用自定义分箱 ) # 拟合数据 optb.fit(df["Age"], df["GB"]) # 生成并查看完整统计表格 binning_table = optb.binning_table binning_table.build() # 打印统计表格(包含样本量、坏样本率、WOE等指标) print(binning_table.table) # 可选:可视化分箱结果 binning_table.plot(metric="woe")
补充方案:直接指定分箱区间
如果需要更精确控制每个分箱的上下限,可以在拟合后手动设置分箱:
# 明确指定所有分箱区间 custom_bin_intervals = [ (-float('inf'), 28), (28, 37), (37, 63), (63, 67), (67, float('inf')) ] # 初始化并拟合分箱对象 optb = OptimalBinning(name="Age", dtype="numerical") optb.fit(df["Age"], df["GB"]) # 设置自定义分箱并构建表格 optb.binning_table.set_bins(custom_bin_intervals) optb.binning_table.build() print(optb.binning_table.table)
问题原因说明
默认情况下,OptimalBinning会执行分箱优化逻辑(比如合并样本量过少的分箱、调整分箱满足单调性要求),即使设置了user_splits也可能被调整。skip_optimal_binning=True会完全跳过这一流程,严格按照用户指定的分割点生成分箱,确保所有自定义分箱都被保留。
内容的提问来源于stack exchange,提问作者TomasLeon
相关产品推荐
相关产品推荐

