风控 决策树规则挖掘

风控 决策树规则挖掘

在风控工作中常会遇到规则挖掘,在数据竞赛中也是如此。通过建模的方式从数据中寻找高“浓度”的规则,在风控应用上可以迅速布设规则,进行补漏!在数据竞赛中可以通过前置规则剔除部分无意义(显而易见)的样本,也可以后置规则根据规则对预测结果做后处理。

本文介绍一个在二分类场景下规则挖掘的思路。通过决策树模型对数据进行拟合,以递归的遍历方式得出树模型的所有路径,将树模型转化为Python函数得出规则。实际应用中特征较多,可以随机抽取特征,建立多棵树进行指标对比等。

本文中采用scikit-learn中的回归树进行建模,这样节点值既是样本在节点上的好坏比,方便计算Lift……,认为一棵树的情况下分类树,回归树不同损失函数对结果精度的影响不大。

如下所示,出入一个树模型,以及所用特征,通过先序遍历进行路径遍历,将每次分类时的特征与阈值存入字符串

def recurse(node, depth):
     indent = "  " * depth
     if tree_.feature[node] != _tree.TREE_UNDEFINED:
         name = feature_name[node]
         threshold = tree_.threshold[node]
         self.defstr.append("{}if x.{} <= {}:".format(indent, name, threshold))
         self.defstr.append('\n')
         recurse(tree_.children_left[node], depth + 1)
         self.defstr.append("{}else:  # if x.{} > {}".format(indent, name, threshold))
         self.defstr.append('\n')
         recurse(tree_.children_right[node], depth + 1)
     else:
         self.defstr.append("{}return {}".format(indent, tree_.value[node][0][0]))
         self.defstr.append('\n')

在主函数中将递归形成的字符串,以exec 函数化,方便调用

cs = treetorule.treetorule(dtree, list(dataSim.columns)[:-1])
cs.torule()
defstr = ''.join(cs.defstr)
exec(defstr)
print(defstr)

计算该树各个叶子节点的规则在数据中的命中情况:

dataSim['mz'] = dataSim.apply(lambda x: treerule(x), axis=1)

计算Lift等指标

# check rule max lift
badRateBase = dataSim['label'].mean()
maxLift = dataSim['mz'].max() / badRateBase
print(f'maxLift: {maxLift}')

运行结果:

def treerule(x):
  if x.f_3 <= -0.22443042695522308:
    if x.f_3 <= -0.7064197957515717:
      if x.f_4 <= -1.9399626851081848:
        return 0.20454545454545456
      else:  # if x.f_4 > -1.9399626851081848
        return 0.02972972972972973
    else:  # if x.f_3 > -0.7064197957515717
      if x.f_4 <= 1.0768189430236816:
        return 0.4
      else:  # if x.f_4 > 1.0768189430236816
        return 0.21212121212121213
  else:  # if x.f_3 > -0.22443042695522308
    if x.f_4 <= 1.4814672470092773:
      if x.f_4 <= 1.1649190783500671:
        return 0.9895561357702349
      else:  # if x.f_4 > 1.1649190783500671
        return 0.8596491228070176
    else:  # if x.f_4 > 1.4814672470092773
      return 0.5
0.98956    383
0.02973    370
0.21212     66
0.85965     57
0.20455     44
0.40000     40
0.50000     40
Name: mz, dtype: int64
maxLift: 1.9870605135948494

完整项目代码:
demo

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值