使用sm.binning处理Titanic数据集:如何实现类似cut的自动分类?
用sm.binning实现自动分箱并生成分类变量(替代cut+手动ifelse)
当然可以!scorecard包里的sm.binning()本身就支持自动分箱逻辑,完全能帮你摆脱嵌套ifelse的繁琐,直接生成对应分类变量,完美匹配你想要的类似cut函数的自动分类效果。下面我结合Titanic数据集给你一步步演示操作:
1. 准备工作:加载依赖与数据
首先确保你已经安装了scorecard和pandas,然后导入工具并加载数据:
import pandas as pd from scorecard import sm.binning # 加载Titanic数据集(替换成你的本地路径或数据源) titanic = pd.read_csv("titanic.csv")
2. 用sm.binning执行自动分箱
sm.binning支持多种自动分箱算法,比如基于决策树的tree方法(追求最优预测性)、基于卡方检验的chi方法(追求分布合理性)。这里以Age变量为例,指定二分类目标变量Survived来自动计算分箱边界:
# 对Age变量执行自动分箱 binning_result = sm.binning( data=titanic, y="Survived", # 二分类目标列 x="Age", # 需要分箱的连续变量 method="tree", # 自动分箱方法,可选tree/chi等 show_plot=False # 不需要可视化的话设为False )
3. 基于分箱结果生成分类变量
分箱完成后,binning_result['binning_table']里会包含分箱的边界值。我们可以把这些边界提取出来,配合pd.cut快速生成分类变量——完全不用写一行ifelse:
# 提取分箱边界,补充正负无穷确保覆盖所有数据 cut_points = binning_result['binning_table']['cut_point'].tolist() bins = [-float('inf')] + cut_points + [float('inf')] # 生成自动分箱后的分类变量 titanic['Age_binned'] = pd.cut( titanic['Age'], bins=bins, labels=binning_result['binning_table']['bin'].tolist(), # 用分箱表的标签 include_lowest=True # 确保左边界包含在内 )
4. 验证与批量处理
你可以查看分箱结果和新变量是否匹配:
# 打印分箱规则表 print("分箱规则:") print(binning_result['binning_table']) # 查看原始变量与分箱后变量的对应关系 print("\n样本匹配情况:") print(titanic[['Age', 'Age_binned']].head(10))
如果要批量处理多个连续变量,写个循环就能搞定:
# 批量处理多个连续变量 continuous_vars = ['Age', 'Fare'] for var in continuous_vars: bin_res = sm.binning(data=titanic, y='Survived', x=var, method='tree') cut_points = bin_res['binning_table']['cut_point'].tolist() bins = [-float('inf')] + cut_points + [float('inf')] titanic[f"{var}_binned"] = pd.cut( titanic[var], bins=bins, labels=bin_res['binning_table']['bin'].tolist(), include_lowest=True )
这样就能轻松实现自动分箱并生成分类变量,完全省去手动编写逻辑的麻烦!
内容的提问来源于stack exchange,提问作者aman1230
相关产品推荐
相关产品推荐

