上一篇我们介绍了如何通过交叉表来生成规则,本篇我们来介绍一种可以生成多规则的方法,决策树。除了做模型以外,也可以用来挖掘规则,原理是一样的。
下面通过sklearn
的决策树方法来实现风控规则的发现,同时分享一种可以更新决策树节点信息的方法,以辅助制定风控规则。
出品人:东哥起飞
原创:👉原创大数据风控课程《100天风控专家》
一、sklearn决策树
Sklearn中有两个决策树API方法,分别是:
- tree.DecisionTreeClassifier:CART分类树
- tree.DecisionTreeRegressor:CART回归树
要注意的是,Sklearn
没有对ID3和C4.5算法的实现,就只有CART算法,并且是调优过的。下面是官方文档的说明。
X = df[df.columns.difference([yflag,'issue_d','address','emp_title','earliest_cr_line','title'])]
y = df[yflag]
# 划分数据集
x_train,x_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=42)
# 按照最优的方式分裂
model=tree.DecisionTreeClassifier(criterion="gini",
splitter='best',
random_state=42,
max_depth=3,
min_samples_leaf=0.05,
min_samples_split=0.05)
model = model.fit(x_train,y_train)
dot_data=tree.export_graphviz(model,
feature_names=X.columns,
filled=True,
rounded=True,
out_file=None)
graph=graphviz.Source(dot_data)
graph
在信贷风控中,使用决策树生成规则后要通过命中、精准率、召回率等指标进行评估和筛选,而sklearn模型输出的树节点可视化图不包含这些信息,下面提供一种优化方法,可以输出我们想要的结果。
二、可视化更新
该方法仍然使用export_graphviz
可视化方法,但会在此基础上做一些内容的优化调整。
dot_data = tree.export_graphviz(tree_model)
以上代码返回的dot_data是一个长字符串,如下示例,该字符串包含了树分裂的所有分裂点和叶子节点信息。
因此,我们通过正则表达式的方法对该字符串进行信息的替换和更新,比如下面循环对每个节点更新recall召回率指标。
item = re.sub(r'>,', '<br/>recall_rate = ' + str(round(recall_rate * 100, 2)) + '%'+'>, ', item)
命中率,精准率等其他指标也是同样的操作。同时我们也对每个节点更新了颜色的变化,如果相关指标达到要求就置为橘色,这样就可以轻松地看出哪些节点区分效果更好。
if bad_rate >= rule_criterion['bad_rate_criterion'] and reject_rate >= rule_criterion['reject_rate_criterion']:
item = re.sub(r'(?<=fillcolor=").*?(?=")', 'orange', item)
最终的效果是,将决策树节点信息进行全部更新,输出一个新的决策树。这里的分裂方式和数量都没有变化,只是可视化显示的信息有变化。
可以看到,新的可视化结果,每个节点都有精准率、召回率、命中率的指标。
以上内容是《100天风控专家》规则篇的内容之一,共100期以上视频更新,包括业务、产品、策略、模型、数据、系统6大核心模块,理论+Python代码实操,课件+数据+代码均支持下载学习。规则篇课件内容如下。