分箱二

本文探讨了分箱技术在数据分析中的重要作用,通过将连续数据离散化,简化复杂数据结构,提升模型稳定性和解释性。介绍了等深分箱、等宽分箱和最优分箱方法,并结合实例展示了如何在实际问题中选择合适的分箱策略,以达到降低噪声、发现潜在模式的目的。
摘要由CSDN通过智能技术生成
import sklearn
import numpy as np
import pandas as pd
import scipy
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
model_data = pd.read_csv('model_data.csv',index_col=0)
model_data.head()
SeriousDlqin2yrs RevolvingUtilizationOfUnsecuredLines age NumberOfTime30-59DaysPastDueNotWorse DebtRatio MonthlyIncome NumberOfOpenCreditLinesAndLoans NumberOfTimes90DaysLate NumberRealEstateLoansOrLines NumberOfTime60-89DaysPastDueNotWorse NumberOfDependents
0 0 0.015404 53.000000 0.000000 0.121802 4728.0 5.000000 0.0 0.000000 0.0 0.000000
1 0 0.168311 63.000000 0.000000 0.141964 1119.0 5.000000 0.0 0.000000 0.0 0.000000
2 1 1.063570 39.716057 1.141971 0.417663 3500.0 5.141971 1.0 0.141971 2.0 3.716057
3 0 0.088684 73.000000 0.000000 0.522822 5301.0 11.000000 0.0 2.000000 0.0 0.000000
4 1 0.622999 53.636002 0.000000 0.423650 13000.0 9.819992 0.0 2.000000 0.0 0.181999
auto_col_name = ['RevolvingUtilizationOfUnsecuredLines','age','DebtRatio','MonthlyIncome','NumberOfOpenCreditLinesAndLoans']
# 将分箱(一)中的代码封装为函数
def get_bins(data,col_name,max_bin_num,min_bin_num=2,target_col_name='SeriousDlqin2yrs',pic=True):
    try:
        bin_result,updown = pd.qcut(data[col_name],q=max_bin_num,retbins=True)
    except:
        max_bin_num -= 1
        bin_result,updown = pd.qcut(data[col_name],q=max_bin_num,retbins=True)
    bin_target = pd.DataFrame(bin_result)
    bin_target['target'] = model_data['SeriousDlqin2yrs']
    bin_target_count = bin_target.groupby(col_name)['target'].value_counts().unstack().fillna(0)
    target0_cnt = sum(bin_target_count[0])
    target1_cnt = sum(bin_target_count[1])
    box_info = [*zip(updown[:-1],updown[1:],bin_target_count[0],bin_target_count[1])]
                     #每组下限   每组上限    该年龄段0标签人数总计  该年龄段1标签人数总计
    
    # 保证每组中0 1标签的人数都不为0
    while sum(0 in box_info[i][2:] for i in range(len(box_info))): # 判断每个分组的两个标签的人数有没有0,如果有0就执行以下操作
        comb_index = [int(0 in box_info
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值