首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python实现变量分箱及应用

之前发的内容里,代码看不清,此篇为重发。

个人观点,信贷行业中,模型稳定性往往比模型效果更重要。信贷行业所做的任何规则、政策、模型的调整,都需要较长时间才能知道结果如何,模型迭代周期相较于其他行业可能更长,因此一个模型的稳定性至关重要。当然在模型迭代周期较短的场景下,可以去追求更好的模型效果,比如有些反欺诈场景,模型模型迭代快,模型可以快速及时调整。但对于大多数其他情况,无论是做评分卡还是机器学习,个人在实践中会为了稳定性牺牲掉一些效果。

提高模型的稳定性往往就是防止模型过拟合,当然不同算法中有很多防止过拟合的技术 上的细节,除去算法上的技术处理,还有一个非常重要的一点,就是对入模的特征进行处理, 其中一点就是变量分箱。分箱是将变量离散化(类别变量的分箱,也可以理解为“离散化”, 因为分箱后整理类别会变少),挖掘出变量的主要趋势,剔除变量的噪音。

之前使用SAS和R实现过分箱,学了Python后,就把R的代码翻译成python代码,因为R和 python太像了。

将代码封装在函数cut_bin里,函数中各参数分别为,df待分箱的数据集, Kvar数据集主键, Yvar数据集y值, max_depth决策树深度, p决策树叶节点数据占比。 代码如下:

该函数输出两个对象,df_bin分箱后的数据集,dict_bin为存放各变量分箱结果的字典。df_bin分箱后的数据集示例:

dict_bin示例:

某变量分箱结果,从Bad_Rate可以看出该变量风险递增,有很好的趋势和业务解释性:

在训练样本上分箱后,如何将分箱结果应用到测试样本呢?下面函数实现了将训练样本上分箱方式“套进” 测试样本里。其中df是测试样本数据集,Kvar是主键,Yvar是y值,lst_bin是训练样本上的分箱结果的字典。该函数也输出两个对象,df_bin是测试样本分箱结果,dict_bin是测试样本变量分箱结果的字典。具体示例和上面结果相似。

上面的两个函数实现了变量分箱的自动化,现在想看看训练样本和测试样本里某个变量的趋势是否一致。编了两个函数实现该功能。train_test_bindict_trend里的参数为训练和测试样本的分箱结果的字典,train_test_bin_trend参数为训练和测试样本的分箱数据集。

运行后的结果如下,左侧为该变量在训练样本上的趋势,右侧为测试样本上的趋势,从图中可以看出该变量的趋势比较稳定,但为了业务上更好解释,可以将2和3进行合并,这样趋势就更明显也更好解释,也会在某种程度上消除掉一些噪音。

现在我想改变上面这个变量的分箱,比如分箱的个数更多一些或更少一些,或改变每段的最少占比等。

如改变每段占比至少10%,看看趋势如何:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180314G021P400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券