风控建模一、初步认识风控

   风险控制(Risk Control),简称风控,是互联网金融的核心。

一、基础知识

1.1 A/B/C卡

  • A卡(Application score card)即申请评分模型(贷款前),用于预测申请时点(申请信用卡、申请贷款)未来一定时间内逾期的概率。
  • B卡(Behavior score card)即行为评分模型(贷款中),用于预测使用时点(获得贷款、信用卡的使用期间)未来一定时间内逾期的概率。
  • C卡(Collection score card)即催收评分模型(贷款后),用于预测进入催收阶段后,未来一定时间内还款的概率。

1.2 信贷业务

        信贷业务,是通过放款收回本金,获得利息的,进而赢得利润。

        有贷款的哥们,贷款平台对其未来还款能力进行预测,将资金优先借贷给有大概率偿还的用户。

1.3 评分卡

        评分卡是以分数的形式来衡量风险几率的一种手段,是对未来一段时间内违约/逾期/失联概率的预测。 有一个明确的正区间,分数越高越安全,有反欺诈评分卡,申请评分卡,行为评分卡,催收评分卡。

        评分卡的特性:稳定性,区分性,预测能力,和逾期概率等价。

1.4 信贷风险与控制

信贷领域有两类风险:

        信用风险,是还款能力和还款意愿在贷款后出现的风险。由于一些不可抗力使用户经济和思想状态发生变化。可以通过风险定价策略等手段可控。

        欺诈风险,贷款目的不正当,没有还款计划。可控性差。

风险管控由两大类系统组成:信用评分系统,欺诈检测系统。

1.5 互联网金融风控体系

        互联网金融风控体系主要由数据信息,策略体系,人工智能模型三部分构成。与传统人工信审相比,人工智能风控,可批量,迅速,准确地处理贷款申请。解放在中小额贷款的劳动力。

7d48fe3f45f7f063eabaa89a38a9405f.png

二、工业建模

2.1 基本定义

在风控场景下遇到的问题,通常都会转化为二分类问题,并将响应变量作为负样本。比如:

  • 信用评分模型,预测用户是否会逾期。 负样本:逾期用户。
  • 营销模型,预测用户被营销是否会贷款。负样本:贷款用户。
  • 失联模型,预测用户是否会失联。负样本:失联用户。

        信贷评分系统中,负样本标签: 逾期超过15天的客户。正样本标签: 未逾期+逾期少于5天的客户。从分布角度来讲,二分类问题一般会假设样本服从二项分布。如果保留5-15天内逾期的用户(灰样本),会让正负样本的实际界限很模糊,去掉中间样本,使样本分布更趋于二项分布,对模型的训练更加有利。不过其中灰样本也会作为测试集,确保模型在训练结束后,对该部分样本也有区分能力。

2.2 数据样本

样本选取时,满足原则:

  • 代表性,样本必须能代表总体。

  • 充分性,样本集数量满足一定要求,少样本无法满足统计的显著性。评分卡建模通常炫耀正负样本不少于1500个。神经网络需要样本量在50万个以上,否则很难保证稳定性。

  • 时效性,样本的观测期与实际应用的时间节点越近越好。然而很多平台,很难保证样本都处于稳定的较近期时间点上。此时可以通过迁移学习(transfer learning)对样本挑选或者对变量进行映射,使得早期样本与近期样本有相似的数据分布。

  • 排除性。不满足当前场景贷款需要的用户不应该作为样本,比如判定为欺诈的用户不应该放在当前样本集中。

        样本大时,做欠采样(subsampling)。负样本一般较少,因此通常只对正样本做欠采样。方法有三种方法:

  • 随机欠采样,正样本的比例随机抽。
  • 分层抽样,保证抽样后,训练,验证,测试的正负样本比例相同。
  • 等比例抽样,正负样本之间的比例进行抽样。

2.3 建模的具体流程:

  1. 业务抽象为分类或回归问题。

  2. 定义标签

  3. 选取合适的样本,匹配出全部信息作为特征。

  4. 特征工程+模型训练+模型评价+模型调优。

  5. 输出模型报告。

  6. 上线+监控

三、规则建模

        风控领域有两种常见的风险规避手段:规则模型和人工智能模型。本小节首先通过规则模型来简单了解一下建模的流程,后面所有的章节也会围绕着人工智能建模展开

#!/usr/bin/env python
# coding: utf-8# In[4]:import pandas as pd
import numpy as np
import os
# os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'# In[5]:path = './'data = pd.read_excel(path + 'oil_data_for_tree.xlsx')
data.head()# In[6]:set(data.class_new)# In[7]:data.shape# org_lst 不需要做特殊变换,直接去重  
# agg_lst 数值型变量做聚合  
# dstc_lst 文本型变量做cnt  # In[8]:org_lst = ['uid','create_dt','oil_actv_dt','class_new','bad_ind']
agg_lst = ['oil_amount','discount_amount','sale_amount','amount','pay_amount','coupon_amount','payment_coupon_amount']
dstc_lst = ['channel_code','oil_code','scene','source_app','call_source']# 数据重组# In[9]:df = data[org_lst].copy()
df[agg_lst] = data[agg_lst].copy()
df[dstc_lst] = data[dstc_lst].copy()
df.head()# 看一下缺失情况# In[10]:df.isna().sum()# 看一下基础变量的describe# In[11]:df.describe()# 对creat_dt做补全,用oil_actv_dt来填补,并且截取6个月的数据。  
# 构造变量的时候不能直接对历史所有数据做累加。  
# 否则随着时间推移,变量分布会有很大的变化。# In[12]:df2 = df.sort_values(['uid','create_dt'],ascending = False)
df2.head()# In[13]:def time_isna(x,y):if str(x) == 'NaT':x = yelse:x = xreturn x
df2['create_dt'] = df2.apply(lambda x: time_isna(x.create_dt,x.oil_actv_dt),axis = 1)
df2['dtn'] = (df2.oil_actv_dt - df2.create_dt).apply(lambda x :x.days)
df = df2[df2['dtn']<180]
df.head()# 对org_list变量求历史贷款天数的最大间隔,并且去重# In[23]:base = df[org_lst]
base['dtn'] = df['dtn']
base = base.sort_values(['uid','create_dt'],ascending = False)
base.tail(30)# In[21]:base.shape# 重复uid,保留日期最近的uid。# In[24]:base = base.drop_duplicates(['uid'],keep = 'first')
base.tail(30)# In[18]:base.shape# In[26]:agg_lst# In[27]:df.head()# 做变量衍生# In[28]:gn = pd.DataFrame()
for i in agg_lst:tp = pd.DataFrame(df.groupby('uid').apply(lambda df:len(df[i])).reset_index())tp.columns = ['uid',i + '_cnt']if gn.empty == True:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')tp = pd.DataFrame(df.groupby('uid').apply(lambda df:np.where(df[i]>0,1,0).sum()).reset_index())tp.columns = ['uid',i + '_num']if gn.empty == True:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')tp = pd.DataFrame(df.groupby('uid').apply(lambda df:np.nansum(df[i])).reset_index())tp.columns = ['uid',i + '_tot']if gn.empty == True:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')tp = pd.DataFrame(df.groupby('uid').apply(lambda df:np.nanmean(df[i])).reset_index())tp.columns = ['uid',i + '_avg']if gn.empty == True:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')tp = pd.DataFrame(df.groupby('uid').apply(lambda df:np.nanmax(df[i])).reset_index())tp.columns = ['uid',i + '_max']if gn.empty == True:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')tp = pd.DataFrame(df.groupby('uid').apply(lambda df:np.nanmin(df[i])).reset_index())tp.columns = ['uid',i + '_min']if gn.empty == True:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')tp = pd.DataFrame(df.groupby('uid').apply(lambda df:np.nanvar(df[i])).reset_index())tp.columns = ['uid',i + '_var']if gn.empty == True:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')tp = pd.DataFrame(df.groupby('uid').apply(lambda df:np.nanmax(df[i]) -np.nanmin(df[i]) ).reset_index())tp.columns = ['uid',i + '_var']if gn.empty == True:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')tp = pd.DataFrame(df.groupby('uid').apply(lambda df:np.nanmean(df[i])/max(np.nanvar(df[i]),1)).reset_index())tp.columns = ['uid',i + '_var']if gn.empty == True:gn = tpelse:gn = pd.merge(gn,tp,on = 'uid',how = 'left')# In[29]:gn.head()# 对dstc_lst变量求distinct个数# In[30]:gc = pd.DataFrame()
for i in dstc_lst:tp = pd.DataFrame(df.groupby('uid').apply(lambda df: len(set(df[i]))).reset_index())tp.columns = ['uid',i + '_dstc']if gc.empty == True:gc = tpelse:gc = pd.merge(gc,tp,on = 'uid',how = 'left')
gc.head()# In[33]:gc.shape,gn.shape, base.shape# 将变量组合在一起# In[34]:fn = pd.merge(base,gn,on= 'uid')
fn = pd.merge(fn,gc,on= 'uid') 
fn.shape# In[35]:fn = fn.fillna(0)# In[36]:fn.head(100)# 训练决策树模型# In[37]:x = fn.drop(['uid','oil_actv_dt','create_dt','bad_ind','class_new'],axis = 1)
y = fn.bad_ind.copy()
from sklearn import treedtree = tree.DecisionTreeRegressor(max_depth = 2,min_samples_leaf = 500,min_samples_split = 5000)
dtree = dtree.fit(x,y)# 输出决策树图像,并作出决策# In[38]:import pydotplus 
from IPython.display import Image
from sklearn.externals.six import StringIOwith open(path + "dt.dot", "w") as f:tree.export_graphviz(dtree, out_file=f)
dot_data = StringIO()
tree.export_graphviz(dtree, out_file=dot_data,feature_names=x.columns,class_names=['bad_ind'],filled=True, rounded=True,special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 
Image(graph.create_png())# value = badrate# In[39]:sum(fn.bad_ind),len(fn.bad_ind), sum(fn.bad_ind)/len(fn.bad_ind)

       其中数据和代码源于GitHub - CourteousWood/Risk_control中introduction,最后画出来的图像为:

        如果画图失败,centos可以采用下面三行解决。

sudo yum -y install graphviz
python3 -m pip install graphviz -i https://pypi.douban.com/simple/
python3 -m pip install pydotplus -i https://pypi.douban.com/simple/

        表中value计算的是叶节点中正负样本标签的均值,在二分类中,均值 等价于  标签为1的样本在总样本的比例。可以看到样本被两个特征划分为三个群体,负样本占比逐渐减少,分别为0.074,0.03,0.012。

dff1 = fn.loc[(fn.pay_amount_tot>240387.5)&(fn.amount_cnt>=3.5)].copy()  
dff1['level'] = 'past_A'  
dff2 = fn.loc[(fn.pay_amount_tot>240387.55)&(fn.amount_cnt<=3.5)].copy()  
dff2['level'] = 'past_B'  
dff3 = fn.loc[fn.pay_amount_tot<=240387.5].copy()  
dff3['level'] = 'past_C'

        通过简单的分群,对三个群体分别采用不同的策略去处理,大大减少业务损失。


从下一节开始,将用人工智能方面模型去解决风控的业务。有其他疑问,欢迎留言,一起讨论+进步!


四、参考文献

  1. 梅子行 <<智能风控原理、算法与工程实践>>
  2. 七月在线之金融风控实战入门
  3. 风控模型的A卡、B卡、C卡 - 知乎

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全面了解风控指标体系

说明 风险管理主要分为四大部分&#xff1a;风险识别、风险分析、风险监控、风险应对。而在量化风险管理的今天&#xff0c;这四个风控部分全都离不开风险指标的梳理、判断、追踪。在信贷业务中&#xff0c;常见贷款流程为&#xff1a;**申请>审批>签约放款>贷后管理…

风控报表体系建设与风控指标

文章目录 风控报表体系建设贷中&#xff1a;监控贷中&#xff1a;资产质量报表贷后&#xff1a;审批监控贷后&#xff1a;拒绝原因分布贷后&#xff1a;用户特征监控贷后&#xff1a;模型监控催收业绩表催收效率表一、应收账款(含销账)(Account Receivable, AR)二、期末贷款余额…

风控模型评估方法以及大数据风控模型概念

更新一下有效性指标中的区分能力指标&#xff1a; KS(Kolmogorov-Smirnov)&#xff1a;KS用于模型风险区分能力进行评估&#xff0c;指标衡量的是好坏样本累计分部之间的差值。好坏样本累计差异越大&#xff0c;KS指标越大&#xff0c;那么模型的风险区分能力越强。 KS的计算步…

风控评分模型

一 概述 余额支付的风险识别模型分为两类&#xff1a;&#xff08;1&#xff09;盗号交易识别风险 和 &#xff08;2&#xff09;盗卡交易识别风险。其中盗卡交易识别风险和余额有关主要是由于骗子注册号码帮盗来的卡&#xff0c;然后进行充值到余额&#xff0c;通过余额支付销…

惊艳!AI创意字体真绝了;6道AIGC高频面试题与解答;为啥语音助手还没集成LLM;深度学习算法红宝书 | ShowMeAI日报

&#x1f440;日报&周刊合集 | &#x1f3a1;生产力工具与行业应用大全 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; &#x1f916; 惊艳&#xff01;手把手教你使用 Stable Diffusion 制作AI创意字体 最近AI创意字体刷爆了 ShowMeAI 社群&#xff01;伙伴们纷纷惊叹这…

qt无法显示图片的原因

qt无法显示图片&#xff1a; 原因&#xff1a; 1.检查图片路径&#xff0c;将图片路径改为全路径 如图片路径单为./jpg时&#xff0c;找不到图片&#xff0c;为全路径时可以找到 2.检查图片格式&#xff0c;不要乱改图片的后缀&#xff08;如1.jpg改成1.png&#xff09;&#…

关于Chrome不显示图片的问题

chrome图片不显示的解决方案 如果 你的IE和火狐浏览器可以正常显示图片&#xff0c;但是唯独谷歌浏览器无法显示图片&#xff0c;并且右键在新窗口中打开图片也是没有问题的。主要原因是因为你的图片链接不是https协议&#xff0c;被浏览器认为是不安全的&#xff0c;所以被浏览…

谷歌浏览器csdn图片无法显示

前排提示&#xff0c;博客中的图片不显示&#xff0c;但是同样的连接放到其他浏览器比如Microsoft Edge应该就能正常显示&#xff0c;文章中有一些步骤截图&#xff0c;请将该文章链接拷贝到其他浏览器查看图片。 看了很多博客的方案都没有解决&#xff0c;综合一下我的解决方…

解决图片不显示的问题

我的副业&#xff1a;觉得我的文章写得不错就支持一下我的副业吧 手机卡、流量卡领取&#xff1a;https://lsqstudy.github.io/post/d76a15aa112345.html 阅读导航 跳转到总目录 解决步骤 1、下载所有图片 链接&#xff1a;https://pan.baidu.com/s/1Q3Xw2GLCX_1ZavS6hIjwKg 提…

ImageWatch无法显示图像

问题描述&#xff1a; 最近遇到一个问题&#xff0c;VS里用来查看Opencv图像的ImageWatch插件&#xff0c;一直显示invalid&#xff0c;如下图&#xff1a; 无效尝试&#xff1a; 重装过ImageWatch插件&#xff0c;没用&#xff0c;Release和Debug都无法查看&#xff0c;最后…

解决im.show()不能显示图片问题

在Python中有一个很有用的图像处理插件&#xff1a;PIL(Python Imageing Library)&#xff0c;PIL目前版本为1.1.7&#xff0c;在PIL处理图像的时候&#xff0c;有时show()一下图片&#xff0c;发现如下&#xff1a; 图(1)无法显示图片 出现该问题的原因如下&#xff1a; 解决…

html无法显示图片解决方法

规范书写 无论你采用服务器调用还是浏览器都要使用相对路径&#xff0c;不然代码迁移很麻烦 相对路径同目录下直接使用文件名 例如下面这种情况index.html 使用img标签可以直接这样写 <img src"firefox-icon.jpg" alt"firefox-icon">低级目录向高…

电脑PC微信头像和图片不能显示出来?

电脑PC微信头像和图片不能显示出来&#xff1f; 最近电脑微信更新了以后&#xff0c;微信头像和图片不能显示出来 小编百度了很多&#xff0c;试了删除缓存&#xff0c;更改网络代理等都不行&#xff0c;最后在一个一个知乎上找到一个解决方式&#xff0c; 具体步骤&#xff1…

ChatGPT大更新!联网/插件功能无需排队,Plus用户下周即可体验

鱼羊 发自 凹非寺量子位 | 公众号 QbitAI 好消息&#xff0c;ChatGPT的联网和插件功能不用等了&#xff01; OpenAI刚刚宣布&#xff0c;ChatGPT Plus用户&#xff0c;下周开始不用排队&#xff0c;直接就能用上这些新功能。 具体来说&#xff0c;在最新的联网和插件Beta版中&a…

postgresql备份恢复

一、逻辑备份与恢复 pg_dump -d test >/tmp/test.sql -p 5433 --备份test这个数据库 psql -p 5433 </tmp/test.sql --恢复 pg_dump > /tmp/full.sql -p 5433 --备份整库 psql </tmp/full.sql -p 5433 --恢复 二、物理备份与恢复 1.开启归档 &#xf…

这可能是全网唯一的免费数据恢复软件,支持电脑和手机恢复,支持通话记录,信息,图片,视频等数据恢复!

自己不小心把电脑和手机中的文件给删除了&#xff0c;有个不少小伙伴遇到过吧&#xff0c;那么有没有方法找回这些删除的资料 有&#xff0c;你只需要今天小七提供的这款数据恢复软件&#xff0c;即可轻松的恢复手机和电脑中删除的文件 小七给大家提供了两个软件安装包&#…

4个免费数据恢复软件:免费恢复您的数据

意外的文件删除或文件损坏可能会令人头疼&#xff0c;尤其是在您不使用云存储的情况下。两者通常都支持已删除的文件恢复和版本控制&#xff0c;以帮助您摆脱此类困境。如果您不使用云&#xff0c;通常唯一的机会就是使用数据恢复软件来找回丢失或损坏的数据。 这种方法有两个…

ChatGPT解答:JavaScript保存当前网页页面图片为pdf文件或者word文件,前端用vue2,给出详细的方案和代码

ChatGPT解答&#xff1a;JavaScript保存当前网页页面图片为pdf文件或者word文件&#xff0c;前端用vue2&#xff0c;给出详细的方案和代码 ChatGPTDemo Based on OpenAI API (gpt-3.5-turbo). JavaScript保存当前网页页面图片为pdf文件或者word文件&#xff0c;前端用vue2&am…

展望AI时代,把握文档图像智能分析与处理的未来(文末送书)

【CCIG技术论坛回顾】展望AI时代&#xff0c;把握文档图像智能分析与处理的未来 前言 CCIG技术论坛 内容回顾及探讨一、人工智能大模型时代的文档识别与理解1.1 文档分析与识别 介绍1.2 文档识别历史回顾1.3 文档的种类与研究问题1.4 文档识别与理解研究现状1.5 大模型带来的挑…