"""
分箱逻辑:1.类别型特征:
1)类别数在5个以下,可以直接根据类别来分箱 (binning_cate)
2)类别数在5个以上,建议做降基处理,再根据降基后的类别做分箱2.数值型特征:
1)离散型数值特征(特征value的变动幅度较小):若特征value的非重复计数在5个以下,可以直接根据非重复计数值来分箱(binning_cate)若特征value的非重复计数在5个以上,建议根据业务解释或者数据分布做自定义分箱(binning_self)
2)连续型数值特征(特征value的变动幅度较大):可以用卡方分箱或自定义分箱。(binning_num,binning_self)PS:一些特征用卡方分可能会报错,建议这些特征改为手动自定义分箱3.特征有缺失:
1)缺失率在5%以下,可以先对缺失做填充处理再分箱(binning_num)
2)缺失率在5%以上,建议将缺失当作一个类别来分箱(binning_sparse_col)4.稀疏特征分箱
建议将稀疏值(一般为0)单独分为一箱,剩下的值做卡方或者自定义分箱(binning_sparse_col)
"""
def binning_cate(df, col, target):"""df:数据集col:输入的特征target:好坏标记的字段名return:bin_df :特征的评估结果"""total = df[target].count()bad = df[target].sum()good = total - badd1 = df.groupby([col], as_index=True)d2 = pd.DataFrame()d2['样本数'] = d1[target].count()d2['黑样本数'] = d1[target].sum()d2['白样本数'] = d2['样本数'] - d2['黑样本数']d2['逾期用户占比'] = d2['黑样本数'] / d2['样本数']d2['badattr'] = d2['黑样本数'] / badd2['goodattr'] = d2['白样本数'] / goodd2['WOE'] = np.log(d2['badattr'] / d2['goodattr'])d2['bin_iv'] = (d2['badattr'] - d2['goodattr']) * d2['WOE']d2['IV'] = d2['bin_iv'].sum()bin_df = d2.reset_index()bin_df.drop(['badattr', 'goodattr', 'bin_iv'], axis=1, inplace=True)bin_df.rename(columns={col: '分箱结果'}, inplace=True)bin_df['特征名'] = colbin_df = pd.concat([bin_df['特征名'], bin_df.iloc[:, :-1]], axis=1)return bin_dfdef binning_self(df, col, target, cut=None, right_border=True):"""df:数据集col:输入的特征target:好坏标记的字段名cut:总定义划分区间的listright_border:设定左开右闭、左闭右开return:bin_df :特征的评估结果"""total = df[target].count()bad = df[target].sum()good = total - badbucket = pd.cut(df[col], cut, right=right_border)d1 = df.groupby(bucket)d2 = pd.DataFrame()d2['样本数'] = d1[target].count()d2['黑样本数'] = d1[target].sum()d2['白样本数'] = d2['样本数'] - d2['黑样本数']d2['逾期用户占比'] = d2['黑样本数'] / d2['样本数']d2['badattr'] = d2['黑样本数'] / badd2['goodattr'] = d2['白样本数'] / goodd2['WOE'] = np.log(d2['badattr'] / d2['goodattr'])d2['bin_iv'] = (d2['badattr'] - d2['goodattr']) * d2['WOE']d2['IV'] = d2['bin_iv'].sum()bin_df = d2.reset_index()bin_df.drop(['badattr', 'goodattr', 'bin_iv'], axis=1, inplace=True)bin_df.rename(columns={col: '分箱结果'}, inplace=True)bin_df['特征名'] = colbin_df = pd.concat([bin_df['特征名'], bin_df.iloc[:, :-1]], axis=1)ks, precision, tpr, fpr = cal_ks(df, col, target)bin_df['准确率'] = precisionbin_df['召回率'] = tprbin_df['打扰率'] = fprbin_df['KS'] = ksreturn bin_dfdef binning_num(df, target, col, max_bin=None, min_binpct=None):"""df:数据集col:输入的特征target:好坏标记的字段名max_bin:最大的分箱个数min_binpct:区间内样本所占总体的最小比return:bin_df :特征的评估结果"""total = df[target].count()bad = df[target].sum()good = total - badinf = float('inf')ninf = float('-inf')cut = ChiMerge(df, col, target, max_bin=max_bin, min_binpct=min_binpct)cut.insert(0, ninf)cut.append(inf)bucket = pd.cut(df[col], cut)d1 = df.groupby(bucket)d2 = pd.DataFrame()d2['样本数'] = d1[target].count()d2['黑样本数'] = d1[target].sum()d2['白样本数'] = d2['样本数'] - d2['黑样本数']d2['逾期用户占比'] = d2['黑样本数'] / d2['样本数']d2['badattr'] = d2['黑样本数'] / badd2['goodattr'] = d2['白样本数'] / goodd2['WOE'] = np.log(d2['badattr'] / d2['goodattr'])d2['bin_iv'] = (d2['badattr'] - d2['goodattr']) * d2['WOE']d2['IV'] = d2['bin_iv'].sum()bin_df = d2.reset_index()bin_df.drop(['badattr', 'goodattr', 'bin_iv'], axis=1, inplace=True)bin_df.rename(columns={col: '分箱结果'}, inplace=True)bin_df['特征名'] = colbin_df = pd.concat([bin_df['特征名'], bin_df.iloc[:, :-1]], axis=1)ks, precision, tpr, fpr = cal_ks(df, col, target)bin_df['准确率'] = precisionbin_df['召回率'] = tprbin_df['打扰率'] = fprbin_df['KS'] = ksreturn bin_dfdef binning_sparse_col(df, target, col, max_bin=None, min_binpct=None, sparse_value=None):"""df:数据集col:输入的特征target:好坏标记的字段名max_bin:最大的分箱个数min_binpct:区间内样本所占总体的最小比sparse_value:单独分为一箱的value值return:bin_df :特征的评估结果"""total = df[target].count()bad = df[target].sum()good = total - bad# 对稀疏值0值或者缺失值单独分箱temp1 = df[df[col] == sparse_value]temp2 = df[~(df[col] == sparse_value)]bucket_sparse = pd.cut(temp1[col], [float('-inf'), sparse_value])group1 = temp1.groupby(bucket_sparse)bin_df1 = pd.DataFrame()bin_df1['样本数'] = group1[target].count()bin_df1['黑样本数'] = group1[target].sum()bin_df1['白样本数'] = bin_df1['样本数'] - bin_df1['黑样本数']bin_df1['逾期用户占比'] = bin_df1['黑样本数'] / bin_df1['样本数']bin_df1['badattr'] = bin_df1['黑样本数'] / badbin_df1['goodattr'] = bin_df1['白样本数'] / goodbin_df1['WOE'] = np.log(bin_df1['badattr'] / bin_df1['goodattr'])bin_df1['bin_iv'] = (bin_df1['badattr'] - bin_df1['goodattr']) * bin_df1['WOE']bin_df1 = bin_df1.reset_index()# 对剩余部分做卡方分箱cut = ChiMerge(temp2, col, target, max_bin=max_bin, min_binpct=min_binpct)cut.insert(0, sparse_value)cut.append(float('inf'))bucket = pd.cut(temp2[col], cut)group2 = temp2.groupby(bucket)bin_df2 = pd.DataFrame()bin_df2['样本数'] = group2[target].count()bin_df2['黑样本数'] = group2[target].sum()bin_df2['白样本数'] = bin_df2['样本数'] - bin_df2['黑样本数']bin_df2['逾期用户占比'] = bin_df2['黑样本数'] / bin_df2['样本数']bin_df2['badattr'] = bin_df2['黑样本数'] / badbin_df2['goodattr'] = bin_df2['白样本数'] / goodbin_df2['WOE'] = np.log(bin_df2['badattr'] / bin_df2['goodattr'])bin_df2['bin_iv'] = (bin_df2['badattr'] - bin_df2['goodattr']) * bin_df2['WOE']bin_df2 = bin_df2.reset_index()# 合并分箱结果bin_df = pd.concat([bin_df1, bin_df2], axis=0)bin_df['IV'] = bin_df['bin_iv'].sum().round(3)bin_df.drop(['badattr', 'goodattr', 'bin_iv'], axis=1, inplace=True)bin_df.rename(columns={col: '分箱结果'}, inplace=True)bin_df['特征名'] = colbin_df = pd.concat([bin_df['特征名'], bin_df.iloc[:, :-1]], axis=1)ks, precision, tpr, fpr = cal_ks(df, col, target)bin_df['准确率'] = precisionbin_df['召回率'] = tprbin_df['打扰率'] = fprbin_df['KS'] = ksreturn bin_df

  对数据分析、机器学习、数据科学、金融风控等感兴趣的小伙伴,需要数据集、代码、行业报告等各类学习资料,可添加微信:wu805686220(记得要备注喔!),也可关注微信公众号:风控圏子(别打错字,是圏子,不是圈子,算了直接复制吧!)

关注公众号后,可联系圈子助手加入如下社群:

  • 机器学习风控讨论群(微信群)
  • 反欺诈讨论群(微信群)
  • python学习交流群(微信群)
  • 研习社资料(qq群:102755159)(干货、资料、项目、代码、报告、课件)

相互学习,共同成长。

【数据处理】python变量分箱常见手法:分类型、数值型、卡方、自定义相关推荐

  1. python分箱统计个数_【数据处理】python变量分箱常见手法:分类型、数值型、卡方、自定义...

    """ 分箱逻辑: 1.类别型特征: 1)类别数在5个以下,可以直接根据类别来分箱 (binning_cate) 2)类别数在5个以上,建议做降基处理,再根据降基后的类别 ...

  2. 风控场景下的常用特征分箱介绍:BestKs分箱、卡方分箱、聚类分箱等

    介绍分箱方法之前,首先要了解为什么分箱? 分箱的好处: 1.分箱后的特征对异常数据有更强的鲁棒性.比如年龄中有一个异常值为300,分箱之后就可能划到>80这一箱中,而如果直接入模的话会对模型造成 ...

  3. python woe分箱_python自动分箱,计算woe,iv的实例代码

    笔者之前用R开发评分卡时,需要进行分箱计算woe及iv值,采用的R包是smbinning,它可以自动进行分箱.近期换用python开发, 也想实现自动分箱功能,找到了一个woe包,地址https:// ...

  4. python 等深分箱 等宽分箱结合二分箱的数据分析

    python 等深分箱 等宽分箱结合二分箱的数据分析 等深分箱等宽分箱概述 Python里可以通过pcut(等深分箱即每箱的样本量基本一致)和cut(等宽分箱即样本量之间有相同的宽度)对样本进行分箱. ...

  5. python决策树分箱_快速分箱方法

    python 分箱的一种方法 2018.08.02 R语言中有smbining可以进行最优分箱,python中分箱如果既要考虑箱体个数,分箱后信息量大小,也要考虑单调性等其他因素. 这里给出一种简单的 ...

  6. python内置函数可以返回数值型序列中所有元素之和_智慧职教: Python内置函数________________用来返回数值型序列中所有元素之和。...

    智慧职教: Python内置函数________________用来返回数值型序列中所有元素之和. 答:3, 中国大学MOOC: 叙事性是插画的核心,每一幅插画背后都有一个作者心中的故事,或唯美,或悲 ...

  7. python分箱代码_python分箱_python 分箱_python等宽分箱 - 云+社区 - 腾讯云

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 我有一个数据框列与数字值: df.head()46. 544.2100.042. ...

  8. 数据分箱3——决策树分箱(有监督)

    思路比较简单:将某一列数据作为训练集,将label作为结果,直接训练一个决策树,然后根据决策树的分裂节点的阈值作为分箱的依据. sklearn的决策树文档:https://scikit-learn.o ...

  9. 卡方分箱、KS分箱、最优IV分箱、树结构分箱、自定义分箱

    目录 分箱 分箱的概念 卡方分箱及代码实现 自定义分箱代码实现

最新文章

  1. 要获得“机器学习或数据科学”的工作,到底选哪种编程语言更好?
  2. 初学者编写python用什么软件好_初学者编写python用什么软件
  3. java swing 动态生成表格_6 个曾经牛逼哄哄的 Java 技术,你用过吗?
  4. 采用开源技术的好处_采用开源的6个技巧
  5. 什么? 搞不定 Redis 分布式锁?
  6. 做品牌 在男人和女人之间玩转巧妙和平衡
  7. greenplum小版本升级
  8. 计算机考研 专业课 数据结构
  9. 相机相关知识及视场角的计算
  10. 【图论·习题】同余最短路:跳楼机
  11. josn转bln的方法
  12. 【Computer Organization笔记08】指令系统概述,指令格式,寻址方式
  13. python 合并表格
  14. 解决scalac Error: bad option -make:transitive
  15. 心流:提升幸福的奥秘
  16. 开个代理记账公司是否有前途
  17. Java 并发之 AQS 详解(上)
  18. A股非金融上市公司全要素生产率(2000-2021年)
  19. gateway+nacos获取不到服务列表报503
  20. 浅谈设计模式之单例模式

热门文章

  1. abaqus单位怎么设置_ABAQUS-怎样模拟塑料瓶的抗挤压能力?
  2. java与室内设计_【Java JDK和躺平设计家3D室内设计哪个好用】Java JDK和躺平设计家3D室内设计对比-ZOL下载...
  3. python的git_Pygit: 用Python实现Git的功能
  4. linux怎么查看fastq格式文件,2020-01-11 了解FASTQ格式并处理FASTQ文件
  5. java 6 26_WebSphere7.0 Java6.26安装
  6. python线性回归实例_sklearn+python:线性回归案例
  7. Leetcode 203. 移除链表元素 (每日一题 20210914)
  8. Leetcode 167. 两数之和 II - 输入有序数组 (每日一题 20210818)
  9. 归并排序的基本原理及实现
  10. pytorch 笔记:DataLoader 扩展:构造图片DataLoader