风控 决策树规则挖掘
在风控工作中常会遇到规则挖掘,在数据竞赛中也是如此。通过建模的方式从数据中寻找高“浓度”的规则,在风控应用上可以迅速布设规则,进行补漏!在数据竞赛中可以通过前置规则剔除部分无意义(显而易见)的样本,也可以后置规则根据规则对预测结果做后处理。
本文介绍一个在二分类场景下规则挖掘的思路。通过决策树模型对数据进行拟合,以递归的遍历方式得出树模型的所有路径,将树模型转化为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