当前位置: 首页 > news >正文

【金融风控项目-07】:业务规则挖掘案例

文章目录

  • 1.规则挖掘简介
  • 2 规则挖掘案例
    • 2.1 案例背景
    • 2.2 规则挖掘流程
    • 2.3 特征衍生
    • 2.4 训练决策树模型
    • 2.5 利用结果划分分组

1.规则挖掘简介

  • 两种常见的风险规避手段:
    • AI模型
    • 规则
  • 如何使用规则进行风控
    • **使用一系列逻辑判断(以往从职人员的经验)**对客户群体进行区分, 不同群体逾期风险有显著差别
    • 比如:多头借贷是否超过一定的数量,设定一个值,如果超过这个值则拒绝借贷
    • 采用一条规则就可以将用户进行分组,可以将用户划分到高风险组,在高风险组中的用户则直接进行拒绝;如果不在高风险组就进入到下一条规则的判断
  • 规则和AI模型的优点:
    • 规则:可以快速使用,便于业务人员理解,但是判断相对简单粗暴,单一维度不满条件直接拒绝
    • AI模型:开发周期长,对比使用规则更复杂,但是更加灵活,用于对于风控精度要求更高的场景。
  • 可以通过AI模型辅助建立规则引擎,决策树很适合规则挖掘的场景。

2 规则挖掘案例

2.1 案例背景

某互联网公司拥有多个业务板块,每个板块下都有专门的贷款产品。

  • 外卖平台业务的骑手可以向平台申请“骑手贷”

  • 电商平台业务的商户可以申请“网商贷”

  • 网约车业务的司机可以向平台申请“司机贷”

公司有多个类似的场景,共用相同的规则引擎及申请评分卡,贷款人都是该公司的兼职人员
近期发现,“司机贷”的逾期率较高

  1. 整个金融板块30天逾期率为1.5%
  2. 司机贷”产品的30天逾期达到了5%

期望解决方案:

  • 现有的风控架构趋于稳定
  • 希望快速开发快速上线,解决问题
    • 尽量不使用复杂的方法
    • 考虑使用现有数据挖掘出合适的业务规则

数据:
在这里插入图片描述

  • 常用的数据分为两类:数值型数据和类别型数据
  • 原始数据中有些数据需要进行处理,有些数据不需要进行处理

2.2 规则挖掘流程

加载数据

import pandas as pd
import numpy as np
data = pd.read_excel('../data/rule_data.xlsx')
data.head()

在这里插入图片描述

data.shape

在这里插入图片描述

# 查看有多少类别
data.class_new.unique()

在这里插入图片描述

data.info()

在这里插入图片描述

  • create_dt - 有很多缺失值,需要进行处理

2.3 特征衍生

原始数据的特征太少,考虑在原始特征基础上衍生出一些新的特征来,将特征分成三类分别处理

  • 数值类型变量:按照id分组后,采用多种方式聚合,衍生新特征
    • 最终得到每个特征按照id分组聚合之后的df
  • 分类类型变量,按照id分组后,聚合查询条目数量,衍生新特征
  • 其它:日期时间类型,是否违约(标签),用户评级等不做特征衍生处理
# 原始数据中有19个特征
# org_list - 不用于进行特征衍生的列
# agg_list - 数值类型的特征,需要进行分组聚合
# count_list - 类别型特征,需要进行分组计数
org_list = ['uid','create_dt','oil_actv_dt','class_new','bad_ind']
agg_list = ['oil_amount','discount_amount','sale_amount','amount','pay_amount','coupon_amount','payment_coupon_amount']
count_list = ['channel_code','oil_code','scene','source_app','call_source']
  • 对原始数据进行copy,防止操作出错,需要重新加载数据
df = data[org_list].copy()
df[agg_list] = data[agg_list].copy()
df[count_list] = data[count_list].copy()
# 查看数据是不是又缺失值
df.isna().sum()

在这里插入图片描述

  • 缺失值填充
# 按照uid和create_dt进行降序排序
df.sort_values(['uid','create_dt'],ascending = False)
  • 对creat_dt做补全,用oil_actv_dt来填补
# 传入两个值
ef time_isna(x,y):if str(x) == 'NaT':x = yreturn x
df2 = df.sort_values(['uid','create_dt'],ascending = False)
# apply返回一个由自定函数返回值组成的series
# axis = 1 将df2的行送入到series中 ,df传入的虽然是行,但是结构仍然是series
df2['create_dt'] = df2.apply(lambda x: time_isna(x.create_dt,x.oil_actv_dt),axis = 1)
# df2.apply(lambda x: time_isna(x.create_dt,x.oil_actv_dt),axis = 1)

在这里插入图片描述

  • 截取申请时间和放款时间不超过6个月的数据(考虑数据时效性)
# 两个时间相减得到的是timedelta类型的数据
# 需要通过x.days获取到具体的不带days的数据
df2['dtn'] = (df2.oil_actv_dt - df2.create_dt).apply(lambda x :x.days)
df = df2[df2['dtn']<180]
df.head()

在这里插入图片描述

  • 将用户按照id编号排序,并保留最近一次申请时间,确保每个用户有一条记录(每个样本送入到模型中都是一条数据)
base = df[org_list] # 不进行特征衍生的数据
base['dtn'] = df['dtn']
base = base.sort_values(['uid','create_dt'],ascending = False)
base = base.drop_duplicates(['uid'],keep = 'first')
base.shape 

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

  • 特征值衍生
    • 对连续统计型变量进行函数聚合
    • 方法包括对历史特征值计数、求历史特征值大于0的个数、求和、求均值、求最大/小值、求最小值、求方差、求极差等
gn = pd.DataFrame() # 创建一个空的dataframe
for i in agg_list: # 遍历需要进行特征衍生的特征# 按照uid进行分组,groupby()应用apply函数传入的是每个组的df# 获取长度tp = df.groupby('uid').apply(lambda df:len(df[i])).reset_index()tp.columns = ['uid',i + '_cnt']if gn.empty:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')#求历史特征值大于0的个数tp = df.groupby('uid').apply(lambda df:np.where(df[i]>0,1,0).sum()).reset_index()tp.columns = ['uid',i + '_num']if gn.empty:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')#求和tp = df.groupby('uid').apply(lambda df:np.nansum(df[i])).reset_index()tp.columns = ['uid',i + '_tot']if gn.empty:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')#求平均值tp = df.groupby('uid').apply(lambda df:np.nanmean(df[i])).reset_index()tp.columns = ['uid',i + '_avg']if gn.empty:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')#求最大值tp = df.groupby('uid').apply(lambda df:np.nanmax(df[i])).reset_index()tp.columns = ['uid',i + '_max']if gn.empty:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')#求最小值tp = df.groupby('uid').apply(lambda df:np.nanmin(df[i])).reset_index()tp.columns = ['uid',i + '_min']if gn.empty:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')#求方差tp = df.groupby('uid').apply(lambda df:np.nanvar(df[i])).reset_index()tp.columns = ['uid',i + '_var']if gn.empty:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')#求极差tp = df.groupby('uid').apply(lambda df:np.nanmax(df[i]) -np.nanmin(df[i]) ).reset_index()tp.columns = ['uid',i + '_ran']if gn.empty:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')
  • 查看衍生结果
gn.columns

在这里插入图片描述

  • 对dstc_lst变量求distinct个数
    • 对类别型的变量,按照uid进行分组之后,去重之后进行计数
gc = pd.DataFrame()
for i in count_list:tp = df.groupby('uid').apply(lambda df: len(set(df[i]))).reset_index()tp.columns = ['uid',i + '_dstc']if gc.empty:gc = tpelse:gc = pd.merge(gc,tp,on = 'uid',how = 'left')
  • 将三个部分的df进行拼接
fn = pd.merge(base,gn,on= 'uid')
fn = pd.merge(fn,gc,on= 'uid') 
fn.shape
  • merge过程中可能会出现缺失情况,填充缺失值
fn = fn.fillna(0)
fn.head(100)

2.4 训练决策树模型

  • 选择数据,训练模型
x = fn.drop(['uid','oil_actv_dt','create_dt','bad_ind','class_new'],axis = 1)
y = fn.bad_ind.copy()
from sklearn import tree
dtree = tree.DecisionTreeRegressor(max_depth = 2,min_samples_leaf = 500,min_samples_split = 5000)
dtree = dtree.fit(x,y)
  • 输出决策树图像
import pydotplus 
from IPython.display import Image
from six import StringIO
# import os
# os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'
# with open("dt.dot", "w") as f:
#     tree.export_graphviz(dtree, out_file=f)
dot_data = StringIO() # 开辟内存空间
# dtree - 指定模型
# out_file - 指定空间
# feature_name - 指定特征矩阵x的列名 x.columns
# class_name - 指定y标签列的列名
tree.export_graphviz(dtree, out_file=dot_data,feature_names=x.columns,class_names=['bad_ind'],filled=True, rounded=True,special_characters=True)
dot_data.getvalue()
graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 

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

2.5 利用结果划分分组

group_1 = fn.loc[(fn.amount_tot>48077.5)&(fn.amount_cnt>3.5)].copy()
group_1['level'] = 'past_A'
group_2 = fn.loc[(fn.amount_tot>48077.5)&(fn.amount_cnt<=3.5)].copy()
group_2['level'] = 'past_B'
group_3 = fn.loc[fn.amount_tot<=48077.5].copy()
group_3['level'] = 'past_C'
  • 如果拒绝past_C类客户,则可以使整体负样本占比下降至0.021
  • 如果将past_B也拒绝掉,则可以使整体负样本占比下降至0.012
  • 至于实际对past_A、past_B、past_C采取何种策略,要根据利率来做线性规划,从而实现风险定价

相关文章:

【金融风控项目-07】:业务规则挖掘案例

文章目录 1.规则挖掘简介2 规则挖掘案例2.1 案例背景2.2 规则挖掘流程2.3 特征衍生2.4 训练决策树模型2.5 利用结果划分分组 1.规则挖掘简介 两种常见的风险规避手段&#xff1a; AI模型规则 如何使用规则进行风控 **使用一系列逻辑判断(以往从职人员的经验)**对客户群体进行区…...

退款成功订阅消息点击后提示订单不存在

问题表现&#xff1a; 退款成功发送的小程序订阅消息点击进入后提示订单不存在。 修复方法&#xff1a; 1.打开文件app/services/message/notice/RoutineTemplateListService.php 2.找到方法sendOrderRefundSuccess 3.修改图中红圈内的链接地址 完整方法代码如下 /*** 订…...

实验一 顺序结构程序设计

《大学计算机&#xfe63;C语言版》实验报告 实验名称 实验一 顺序结构程序设计 实验目的 &#xff08;1&#xff09;掌握C语言中常量和变量的概念。 &#xff08;2&#xff09;掌握C语言中常见的数据类型。 &#xff08;3&#xff09;掌握C语言中变量的定义和赋值方法。 …...

Elasticsearch搜索流程及原理详解

Elasticsearch搜索流程及原理详解 1. Elasticsearch概述1.1 简介1.2 核心特性1.3 应用场景2. Elasticsearch搜索流程2.1 搜索请求的发起2.2 查询的执行2.3 结果的聚合与返回3. Elasticsearch原理详解3.1 倒排索引3.2 分布式架构3.3 写入流程3.4 读取流程4. 技术细节与操作流程4…...

芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号)

芯片之殇——“零日漏洞”(文后附高通64款存在漏洞的芯片型号) 本期是平台君和您分享的第113期内容 前一段时间,高通公司(Qualcomm)发布安全警告称,提供的60多款芯片潜在严重的“零日漏洞”,芯片安全再一次暴露在大众视野。 那什么是“零日漏洞”?平台君从网上找了一段…...

【gitlab】gitlabrunner部署

1、下载镜像 docker pull gitlab/gitlab-runner:latest 2、启动gitrunner容器 docker run -d --name gitlab-runner --restart always \ -v /root/gitrunner/config:/etc/gitlab-runner \ ///gitlab-runner的配置目录&#xff0c;挂载在宿主机上方便修改,里面有config.…...

Flink监控checkpoint

Flink的web界面提供了一个选项卡来监控作业的检查点。这些统计信息在任务终止后也可用。有四个选项卡可以显示关于检查点的信息:概述(Overview)、历史(History)、摘要(Summary)和配置(Configuration)。下面依次来看这几个选项。 Overview Tab Overview选项卡列出了以…...

Ribbon 入门实战指南

Ribbon 是 Netflix 开发的一个开源项目&#xff0c;用于实现客户端负载均衡功能。它在微服务架构中广泛使用&#xff0c;并且是 Spring Cloud 生态中的重要组成部分。本文将带你从基础入门&#xff0c;逐步掌握如何在 Spring Cloud 项目中使用 Ribbon 实现客户端负载均衡。 1 负…...

uniapp: 微信小程序包体积超过2M的优化方法(主包从2.7M优化到1.5M以内)

一、问题描述 在使用uniapp进行微信小程序开发时&#xff0c;经常会遇到包体积超过2M而无法上传&#xff1a; 二、解决方案 目前关于微信小程序分包大小有以下限制&#xff1a; 整个小程序所有分包大小不超过 30M&#xff08;服务商代开发的小程序不超过 20M&#xff09; 单个…...

【百日算法计划】:每日一题,见证成长(026)

题目 给定一个包含正整数、加()、减(-)、乘(*)、除(/)的算数表达式(括号除外)&#xff0c;计算其结果。 表达式仅包含非负整数&#xff0c;&#xff0c; - &#xff0c;&#xff0c;/ 四种运算符和空格 。 整数除法仅保留整数部分。 * * 示例 1: 输入: “32X2” 输出: 7 import…...

【大模型】prompt实践总结

文章目录 怎么才算是好的prompt设计准则基本原则精炼原则(奥卡姆剃刀准则)具体原则真实操作技巧指定角色增加fewshots列表化代码化强调需求真实迭代大模型优化情形任务的定义和评估标准似乎可以再明确一下出现了一些之前没有考虑过的特殊情况,可以重新组织语言优化Prompt来处…...

在Qt(以及C++)中, 和 * 是两个至关重要的符号--【雨露均沾】

在Qt&#xff08;以及C&#xff09;中&#xff0c;& 和 * 是两个至关重要的符号&#xff0c;它们用于处理引用和指针。我们将逐个解释这两个符号&#xff0c;并提供简单示例来说明它们的用法。 1. 引用&#xff08;&&#xff09; 定义: 引用是一种别名&#xff0c;它不…...

本地部署Apache Answer搭建高效的知识型社区并一键发布到公网流程

文章目录 前言1. 本地安装Docker2. 本地部署Apache Answer2.1 设置语言选择简体中文2.2 配置数据库2.3 创建配置文件2.4 填写基本信息 3. 如何使用Apache Answer3.1 后台管理3.2 提问与回答3.3 查看主页回答情况 4. 公网远程访问本地 Apache Answer4.1 内网穿透工具安装4.2 创建…...

Ubuntu常见命令

关于export LD_LIBRARY_PATHcmake默认地址CMakelists.txt知识扩充/home&#xff1a;挂载新磁盘到 /home 子目录 关于export LD_LIBRARY_PATH 程序运行时默认的依赖库的位置包括lib, /usr/lib ,/usr/local/lib 通过命令export LD_LIBRARY_PATHdesired_path:$LD_LIBRARY_PATH追加…...

网络安全领域的最新动态和漏洞信息

网络安全领域的最新动态和漏洞信息涉及多个方面&#xff0c;以下是对这些信息的详细归纳&#xff1a; 一、网络安全领域最新动态世界互联网大会乌镇峰会召开2024年11月19日至22日&#xff0c;以“拥抱以人为本、智能向善的数字未来——携手构建网络空间命运共同体”为主题的202…...

华为开源自研AI框架昇思MindSpore应用案例:人体关键点检测模型Lite-HRNet

如果你对MindSpore感兴趣&#xff0c;可以关注昇思MindSpore社区 一、环境准备 1.进入ModelArts官网 云平台帮助用户快速创建和部署模型&#xff0c;管理全周期AI工作流&#xff0c;选择下面的云平台以开始使用昇思MindSpore&#xff0c;获取安装命令&#xff0c;安装MindSpo…...

每日OJ题_牛客_天使果冻_递推_C++_Java

目录 牛客_天使果冻_递推 题目解析 C代码 Java代码 牛客_天使果冻_递推 天使果冻 描述&#xff1a; 有 n 个果冻排成一排。第 i 个果冻的美味度是 ai。 天使非常喜欢吃果冻&#xff0c;但她想把最好吃的果冻留到最后收藏。天使想知道前 x个果冻中&#xff0c;美味…...

独立站干货:WordPress主机推荐

WordPress作为全球最受欢迎的独立站建设平台&#xff0c;提供了灵活性和强大的功能&#xff0c;使得建站变得简单而高效。本文将为您详细介绍WordPress建站的流程&#xff0c;并推荐几款实测后觉得好用的主机商。 WordPress建站流程 域名注册 首先需要注册一个域名&#xff0c…...

支持多种快充协议和支持多种功能的诱骗取电协议芯片

汇铭达XSP15是一款应用于手持电动工具、智能家居、显示器、音箱等充电方案的大功率快充协议芯片&#xff0c;支持最大功率100W给设备快速充电&#xff0c;大大缩短了充电时间。芯片支持通过UART串口发送电压/电流消息供其它芯片读取。支持自动识别连接的是电脑或是充电器。支持…...

Android中常见内存泄漏的场景和解决方案

本文讲解Android 开发中常见内存泄漏场景及其解决方案&#xff0c;内容包括代码示例、原因分析以及最佳实践建议。 1. 静态变量导致的内存泄漏 静态变量的生命周期与应用进程一致&#xff0c;如果静态变量持有了对 Activity 或其他大对象的引用&#xff0c;就可能导致内存泄漏…...

MyBatis Plus中的@TableId注解

TableId 注解用于将某个成员变量指定为数据表主键&#xff0c;以下为使用示例&#xff1a; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lo…...

java基础概念33:常见API-Objects工具类

一、使用场景 二、成员方法 2-1、equals方法 源码&#xff1a; 2-2、isNull方法、nonNull方法 三、小结...

脚手架vue-cli,webpack模板

先安装node.js&#xff0c;它是服务器端&#xff0c;用于给页面提供服务。前端学习不需要会node.js&#xff0c;只需要学会node.js衍生出来的npm命令即可。 npm 是node.js的一个工具&#xff0c;作用是进行包管理&#xff0c;npm是node.js的包管理器。 接着安装脚手架&#xff…...

什么是React Native?

写在前面 React Native (RN) 是一个由 Facebook 开发的开源框架&#xff0c;用于构建跨平台的移动应用程序。它允许开发者使用 JavaScript 和 React 来创建原生 iOS 和 Android 应用。RN 的出现极大地简化了移动应用的开发过程&#xff0c;使得开发者可以更快速、更高效地构建…...

Three.js LOD(Level of Detail)通过根据视距调整渲染细节的技术

在 Three.js 中&#xff0c;LOD&#xff08;Level of Detail&#xff09;技术是一种通过根据视距调整渲染细节的技术&#xff0c;旨在提高渲染性能并优化用户体验。LOD 技术尤其在处理复杂场景或高多边形模型时显得尤为重要。在这篇博客中&#xff0c;我们将详细介绍 LOD 的概念…...

Vulnhub靶场案例渗透[12]-Grotesque: 1.0.1

文章目录 一、靶场搭建1. 靶场描述2. 下载靶机环境3. 靶场搭建 二、渗透靶场1. 确定靶机IP2. 探测靶场开放端口及对应服务3. 目录扫描4. 敏感信息获取5. 反弹shell6. 权限提升 一、靶场搭建 1. 靶场描述 get flags difficulty: medium about vm: tested and exported from vi…...

招聘和面试

本篇内容是根据2019年4月份#82 Hiring and job interviews音频录制内容的整理与翻译 小组成员 Mat Ryer、Ashley McNamara、Johnny Boursiquot 和 Carmen Andoh 讨论了受聘、雇用和工作面试的过程。如果人是团队中最重要的部分&#xff0c;我们如何选择与谁一起工作&#xff1…...

Gin 框架入门(GO)-1

解决安装包失败问题(*) go env -w GO111MODULE=on go env -w GOPROXY=https://goproxy.cn,direct 1 介绍 Gin 是一个 Go (Golang) 编写的轻量级 http web 框架,运行速度非常快,Gin 最擅长的就是 Api 接口的高并发。 2 Gin 环境搭建 1.下载并安装 gin go get -u github.…...

LeetCode:700. 二叉搜索树中的搜索

目录 题目描述: 代码: 题目描述: 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 示例 1: 输入&#xff1a;root [4,2,7,1,3…...

用邻接矩阵实现图的深度优先遍历

问题描述 给定一个无向图&#xff0c;用邻接矩阵作为图的存储结构&#xff0c;输出指定顶点出发的深度优先遍历序列。在深度优先遍历的过程中&#xff0c;如果同时出现多个待访问的顶点&#xff0c;则优先选择编号最小的一个进行访问。 输入描述 第一行输入三个正整数&#…...

做网站要坚持/南昌seo快速排名

找过网上很多方法和办法发现都不行&#xff0c;后头才发现是浏览器的原理。/汗 <embed src"音乐文件目录要带.mp3" hidden"true" autostart"true" loop"true" />该方法只适用于IE浏览器&#xff0c;我使用80.0.3987.149&#xf…...

北京市建设监理协会官方网站/友链交换网站

数据类型&#xff1a; 可变对象与不可变对象&#xff1a; 元组&#xff08;tuple)、数值型&#xff08;number)、字符串(string)均为不可变对象&#xff0c;而字典型(dictionary)和列表型(list)&#xff0c;集合(set)的对象是可变对象。字典的key一定要是不可变对象 无序与有序…...

ps软件下载电脑版多少钱/seo策略

1、percona-toolkit简介percona-toolkit是一组高级命令行工具的集合&#xff0c;用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务&#xff0c;这些任务包括&#xff1a;l 检查master和slave数据的一致性l 有效地对记录进行归档l 查找重复的索引l 对服务器信息进行汇总…...

做网站网页需要什么软件/开鲁网站seo站长工具

原文地址为&#xff1a; ASP.NET MVC5 网站开发实践 - 概述前段时间一直在用MVC4写个网站开发的demo&#xff0c;由于刚开始学所有的代码都写在一个项目中&#xff0c;越写越混乱&#xff0c;到后来有些代码自己都理不清了。1月26日晚上在群里跟怒放 他们讨论这个问题&#xff…...

app开发和网站开发一样么/简单的个人主页网站制作

中台&#xff0c;一个火热到发烫的词汇。附耳细听&#xff0c;到处都在喊中台&#xff0c;似乎不知道中台就差了意思&#xff0c;张嘴闭嘴说中台才算OG老炮儿。但是&#xff0c;时至今日&#xff0c;中台仍然是一个被定义中的概念&#xff0c;大家对这个词汇都有感觉&#xff0…...

站外推广内容策划/怎么seo网站关键词优化

可能大家也知道&#xff0c;测试行业发展到2019年就已经稳定了&#xff0c;技术和上升机制已经成熟&#xff1b;可以说只要用心查找&#xff0c;任何人都能知道什么样的技术才能享受的高薪和优质待遇。 但很多测试人员可能知识不成体系或技术不得进步的原因&#xff0c; 只能做…...