CART决策树暴力生成风控规则(Python代码)

news2024/12/26 23:46:33

上一篇我们介绍了决策树节点信息更新的方法风控规则的决策树可视化(升级版),以辅助我们制定风控规则,可视化的方法比较直观,适合做报告展示,但分析的时候效果没那么高。

本篇我们介绍一种通过决策树自动挖掘规则的方法。

出品人:东哥起飞
原创:👉原创大数据风控课程《100天风控专家》更新100期以上

一、树结构信息

通过Sklearn中的tree_可以获取树结构的所有信息,进而将所有决策路径挖掘出来,也就是全自动化地的生成规则。总体想法就是先暴力挖掘规则,然后再从规则池中按照评估指标进行筛选。

以下是官网链接。

https://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html#sphx-glr-auto-examples-tree-plot-unveil-tree-structure-py

二、代码实操

首先,也需要使用DecisionTreeClassifier或者DecisionTreeRegressor构建一个决策树模型对象。

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)

然后将模型对象喂入以下两个函数即可自动生成规则了。

# 输出每条决策树规则对应的最终预测值函数
def predict_value(tree):
    """
    @VX搜:1OO天风控专家
    :param tree: 决策树对象
    :return: 返回节点评估指标的列表
    """
    value_list = []
    tree_ = tree.tree_
    def recurse(node, depth):
        if tree_.feature[node] != _tree.TREE_UNDEFINED:
            recurse(tree_.children_left[node], depth + 1)
            recurse(tree_.children_right[node], depth + 1)
        else:
            # 提取value中的正负样本
            good = tree_.value[node][0][0]
            bad  = tree_.value[node][0][1]
            samples = good+bad
            # 计算坏账率badrate
            bad_rate = round(bad*100/(bad+good),4)
            
            value_list.append([bad_rate,hit_rate,recall_rate,lift])
    recurse(0, 1)
    return value_list

# 决策树规则抽取和解析函数
def extract_tree_rules(tree, feature_names):
    """
    :param tree:             决策树对象
    :param feature_names:    构建决策树使用的特征名称
    :return:                 决策树规则抽取结果
    """
    left = tree.tree_.children_left
    right = tree.tree_.children_right
    threshold = tree.tree_.threshold
    features = [feature_names[i] for i in tree.tree_.feature]
    index_list = np.argwhere(left == -1)[:, 0]
    value_list = predict_value(tree)
    rule_list = []
    # print(value_list)
    def decision_flow_extract(left, right, child, d_flow=None):
        """
        :param left:    数组格式,决策树左子节点id
        :param right:   数组格式,决策树右子节点id
        :param child:   子节点id
        :param d_flow:  子节点决策流
        :return:        子节点对应的决策流
        """
        if d_flow is None:
            d_flow = [child]
        if child in left:
            parent = np.where(left == child)[0].item()
            split = 'le'
        else:
            parent = np.where(right == child)[0].item()
            split = 'rg'
        d_flow.append((parent, split, threshold[parent], features[parent]))
        if parent == 0:
            d_flow.reverse()
            return d_flow
        else:
            return decision_flow_extract(left, right, parent, d_flow)
    rule_list=[]
    left_symbol = '<='
    rgiht_symbol = '>'
    for j, child in enumerate(index_list):
        clause = ''
        for node in decision_flow_extract(left, right, child):
            if len(str(node)) < 3:
                continue
            i = node
            if i[1] == 'le':
                sign = left_symbol
            else:
                sign = rgiht_symbol
            clause = clause + i[3] + sign + str(i[2]) + ' and '
        value_list[j].append(clause[:-4])
        # clause = clause[:-4] + ' Badrate:' + str(round(value_list[j],4))
        rule_list.append(value_list[j])
    return rule_list

这里要我们设置的决策树深度为3,并且树结构生成完整,因此生成的规则中均包含3个变量,8条决策路径总共生成8条规则,具体如下:

规则是用来高风险客户的,因此先对精准率进行从大到小的排序,然然后再看命中率、召回率等是否符合要求。

可以看到第一条规则的评估指标比较符合要求,但其中subgrade存在两个重复的,因为cart算法在每个决策点对特征变量是有放回的。可以考虑合并,等效于:subgrade>19.5 and dti>20.795,这样就非常快速的挖掘出一条风控规则了。

三、更多规则挖掘

如果决策树的参数和数据都固定的话,生成的树结构也就是固定的。如果想继续暴力挖掘更多的规则,可以尝试不同的参数。比如说,选择树深度为2,那么生成的规则都仅包含两个变量,选择splitter参数为random局部最优,每个节点的变量选择也会发生变量,再比如更换随机种子等等,那么不同参数的组合就可以生成不同新的树结构,这样就有成千上万条的规则了。

以下是DecisionTreeClassifier分类模型的参数。

因此,如果想挖掘更多的规则,可以按照不同参数组合的思路将以上函数进行封装来实现暴力规则挖掘的功能。

评估指标如果有固定的标准,也可以设置并完成自动的提取。当然,最后规则挖掘出来最后还要看可解释性了,因为在金融信贷风控中对业务解释性要求比较高。

以上内容是《100天风控专家》规则篇的内容之一,共100期以上视频更新,包括业务、产品、策略、模型、数据、系统6大核心模块,理论+Python代码实操,课件+数据+代码均支持下载学习。规则篇课件内容如下(如感兴趣可VX搜索:100天风控专家)。

在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1520816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于openresty构建运维工具链实践

本文字数&#xff1a;4591字 预计阅读时间&#xff1a;25 01 导读 如今OpenResty已广泛被各个互联网公司在实际生产环境中应用&#xff0c;在保留Nginx高并发、高稳定等特性基础上&#xff0c;通过嵌入Lua来提升在负载均衡层的开发效率并保证其高性能。本文主要介绍接口鉴权、流…

【Java】容器|Set、List、Map及常用API

目录 一、概述 二、List 1、List的常用API 2、ArrayList 3、List遍历 三、Set 1、Set的常用方法: 2、HashSet 3、遍历集合&#xff1a; 四、Map 1、Map常用API 2、HashMap 3、遍历Map 五、迭代器 一、概述 在Java中所有的容器都属于Collection接口下的内容 1…

D-泛醇(右泛醇)应用领域广泛 我国市场参与者众多

D-泛醇&#xff08;右泛醇&#xff09;应用领域广泛 我国市场参与者众多 D-泛醇又称右泛醇、原维生素B5&#xff0c;化学式为C9H19NO4&#xff0c;为泛醇的右旋异构体。D-泛醇外观呈无色粘稠或透明液体&#xff0c;微含臭味&#xff0c;可溶于甲醇、乙醇、水和丙二醇。D-泛醇综…

react native 实现自定义底部导航与路由文件配置

首先先把需要的一些库引入 yarn install react-navigation/native yarn install react-native-screens react-native-safe-area-context yarn install react-navigation/native-stack yarn add react-navigation/bottom-tabs 创建路由文件及四个底部导航页面 router文件下的bot…

MATLAB:一些杂例

a 2; b 5; x 0:pi/40:pi/2; %增量为pi/40 y b*exp(-a*x).*sin(b*x).*(0.012*x.^4-0.15*x.^30.075*x.^22.5*x); %点乘的意义 z y.^2; %点乘的意义 w(:,1) x; %组成w&#xff0c;第一列为x w(:,2) y; %组成w&#xff0c;第二列为y w(:,3) z; %组成w&#xff0c;第三列为z…

大规模C++程序设计 -- 基本规则

文章目录 基本规则概述成员数据访问全局命名空间全局数据自由函数枚举类型、typedef和常量数据预处理宏头文件中的名称 包含卫哨包含冗余卫哨文档标识符命名规则 基本规则 概述 任何精美的艺术不仅来源于创造&#xff0c;而且来自于规范。编程也是如此。C是易总大型语言&…

【New Release】PostgreSQL小版本(16.2, 15.6, 14.11, 13.14,12.18) 发布了

前言 PostgreSQL遵循小版本的发布规律&#xff0c;这一个季度的小版本又发布了。可以算作是2024年第一个季度的版本发布。如果总结其规律&#xff1a;大概就是2月、5月、8月、11月的样子。通常因为11月配合大版本的发布&#xff0c;它是起点&#xff0c;也有可能就是终点。起点…

【Docker篇】自定义Dockerfile的操作

文章目录 &#x1f354;镜像结构&#x1f6f8;什么是Dockerfile⭐基于Ubuntu镜像构建一个新镜像&#xff0c;运行一个java项目&#x1f50e;使用 java:8-alpine &#x1f354;镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 我们以MySQL为例&am…

Vintage账龄分析表计算底层逻辑(Python实操)

大家好&#xff0c;我是东哥。 信贷风控领域中&#xff0c;经常用到账龄Vintage报表&#xff0c;这是入门初学者的难点之一&#xff0c;因为它涉及到用户还款、逾期等多种行为以及业务上的多种统计口径&#xff0c;因此很多朋友一直无法将逻辑梳理清楚。本次来给大家详细介绍V…

Java:多态

目录 1.向上转型2.动态绑定3.方法重写4.理解多态5.多态的优缺点 1.向上转型 把子类对象给到父类&#xff0c;代码如下 class Animal{public String name;public int age;public void eat(){System.out.println(this.name"正在吃饭&#xff01;");} } class Dog ext…

力扣映射思辨题:赎金信

思路很简单&#xff1a;查到就改 bool canConstruct(char* ransomNote, char* magazine) {for(long x0;x<strlen(ransomNote);x){for(long y0;y<strlen(magazine);y){if(magazine[y]ransomNote[x]){ransomNote[x]1;magazine[y]1;break;}}}for(long x0;x<strlen(ranso…

【ArcGIS 脚本工具】批量导出布局为图片

文章开始前要介绍一下ArcMap与ArcPro在布局上的区别。 ArcMap10.x版本的mxd文件默认只有一个布局&#xff0c;所以如果一个项目需要出几张图&#xff0c;做好的办法就是建几个mxd文件。 但是ArcPro在这方面更加整合了&#xff0c;一个aprx文件内可以新建任意多的布局&#xff…

无人机助力智慧农田除草新模式,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建无人机航拍场景下的农田杂草检测识别系统

科技发展到今天&#xff0c;无人机喷洒药物已经不是一件新鲜事情了&#xff0c;在很多高危的工作领域中&#xff0c;比如高空电力设备除冰&#xff0c;电力设备部件传送更换等等&#xff0c;无人机都可以扮演非常出色的作用&#xff0c;前面回到老家一段时间&#xff0c;最近正…

内网渗透之路:常用命令助力信息深度探索

1、查询网络配置信息 ipconfig /all 2、查询操作系统及软件信息 &#xff08;1&#xff09;查询操作系统和版本信息 英文操作系统 systeminfo | findstr /B /C:"OS Name" /C:"OS Version" 中文操作系统 systeminfo | findstr /B /C:"OS 名称&q…

【C#】int+null=null

C#语法&#xff0c;这玩意不报错 intnullnull&#xff0c;有点不合逻辑 (Int32)(bizRepair0rder.CreateTime. Value - regues.Mlodifylime.Value).TotalMinutes (Int32)(bizRepair0rder.CreateTime. Value - reques.llodifylime.Value).TotalMinutes nullstring是引用类型&…

【C#】【SAP2000】读取SAP2000中所有Frame对象在指定工况的温度荷载值到Grasshopper中

if (build true) {// 连接到正在运行的 SAP2000// 使用 COM 接口获取 SAP2000 的 API 对象cOAPI mySapObject (cOAPI)System.Runtime.InteropServices.Marshal.GetActiveObject("CSI.SAP2000.API.SapObject");// 获取 SAP2000 模型对象cSapModel mySapModel mySap…

PlantUML + VS Code

PlantUML 使用实例 文章目录 PlantUML 使用实例1. PlantUML简介1.1 什么是PlantUML1.2 PlantUML优势在哪 2. 怎么用2.1 环境依赖2.2 VS Code组件安装 3. 常用语法3.1 标记开始结束3.2 声明参与者3.3 声明关系3.4 对消息序列编号3.5 组合消息 4. 实例 1. PlantUML简介 1.1 什么…

NCDA大赛中哪些HTML5设计作品展现出色?

与传统的HTML网页设计相比&#xff0c;HTML5网页设计主要是对网页内容的加强。HTML5已成为目前最流行的标记语言&#xff0c;拥有成熟的社区和广泛的浏览器支持&#xff0c;HTML5完整的功能和强大的扩展性使设计师和开发者能够点铁成金。HTML5可以一手控制更多可控元素&#xf…

HDS-NAS分配资源并挂载win和linux

1、首先创建系统文件。 选择nas存储池 2、根据自己的需求创建相应的挂载方式 3、window配置 配置成功 最后即可在window系统网络位置映射网络即可&#xff0c; 格式为\\123.3.4.5\test 注&#xff1a;IP地址 4、liunx挂载方式 创建完成之后即可挂载&#xff0c;注意目的主…

Vue+OpenLayers7入门到实战:OpenLayers如何使用全屏控件,来实现地图容器的全屏和退出全屏功能

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7入门到实战 前言 本章介绍如何使用OpenLayers7在地图上使用地图全屏控件,来控制地图容器的全屏和退出全屏的功能。 注意:这里的全屏控件全屏指的是地图容器全屏,并非整个网页全屏。 网页整体全屏和指定网页节点全屏可以参…