【Python使用】嘿马python数据分析教程第5篇:金融风控相关业务介绍,金融反欺诈 常用特征处理方法【附代码文档】
教程全知识点简介:Excel的使用 全渠道业务概述 1. Excel的使用(预计4小时) 2. 全渠道业务分析(预计4小时) 价格>50的比较少 groupby的操作,不同类别app的价格分布 第01章 Pandas基础 不支持列表和整数间的运算 选取imdb_score这列 每列值加1 每列值乘以2.5 每列值除以7的余数 判断是否大于7 利用通用函数实现加法 第02章 DataFrame基本操作 设定skipna=False,没有缺失值的数值列才会计算结果 第03章 数据分析入门 查看数据类型 用memory_usage方法查看每列的内存消耗 RELAFFIL这列只包含0或1,因此没必要用64位,使用astype方法将其变为8位(1字节)整数 检查两个对象列的独立值的个数 STABBR列可以转变为“类型”(Categorical),独立值的个数小于总数的1% 再次检查内存的使用 第04章 选取数据子集 第05章 布尔索引 读取movie数据集,创建布尔条件 第06章 分组聚合、过滤、转换 如果将列限制到SATMTMID,会报错。这是因为不能访问UGDS。 求每两个城市间的航班总数 选出休斯顿(IAH)和亚特兰大(ATL)之间双方向的航班总数 分别对每行按照出发地和目的地,按字母排序 因为现在每行都是独立排序的,列名存在问题。对列重命名,然后再计算所有城市间的航班数 找到亚特兰大和休斯顿之间的航班数 如果调换顺序,则会出错 用NumPy的sort函数可以大大提高速度 重新用DataFrame构造器创建一个DataFrame,检测其是否与flights_sorted相等 比较速度 读取texas_cities数据集 将Geolocation分解为四个单独的列 将新列与原先的city列连起来 忽略,作者这里是写重复了 函数to_numeric可以将每列自动变为整数或浮点数 |符,可以对多个标记进行分割 更复杂的提取方式 读取names数据集 用loc直接赋值新的行 也可以用字典赋值新行 字典可以打乱列名的顺序 直接append一个字典 按照错误提示,加上ignore_index=True 设定行索引 添加一行 创建一个Series对象 append方法可以将DataFrame和Series相连 append方法可以同时连接多行,只要将对象放到列表中 读取baseball16数据集 选取一行,并将其转换为字典 对这个字典做格式处理,如果是字符串则为空,否则为缺失值 将一行数据添加到DataFrame是非常消耗资源的,不能通过循环的方法来做。下面是创建一千行的新数据,用作Series的列表: 给上面的append操作计时,1000行的数据用了5秒钟 在读取chinook数据库之前,需要创建SQLAlchemy引擎 read_sql_table函数可以读取一张表,第一个参数是表名,第二个参数是引擎 找到每种类型歌曲的平均时长 将Milliseconds列转变为timedelta数据类型 找到每名顾客花费的总时长 现在可以用总量乘以单位价格,找到每名顾客的总消费 sql语句查询方法read_sql_query 第09章 时间序列分析 从hdf5文件crime.h5读取丹佛市的crimes数据集,输出列数据的数据类型和数据的前几行 注意到有三个类型列和一个Timestamp对象列,这些数据的数据类型在创建时就建立了对应的数据类型。 这和csv文件非常不同,csv文件保存的只是字符串。 由于前面已经将REPORTED_DATE设为了行索引,所以就可以进行智能Timestamp对象切分。 可以进行时间部分匹配 也可以选取一整月、一整年或某天的某小时 也可以包含月的名字 其它一些字符串的格式也可行 可以进行切片 提供更为精确的时间 hdf5文件可以保存每一列的数据类型,可以极大减少内存的使用。 在上面的例子中,三个列被存成了类型,而不是对象。存成对象的话,消耗的内存会变为之前的四倍。 为了用日期智能选取和切分,行索引必须包含日期。 在前面的例子中,REPORTED_DATE被设成了行索引,行索引从而成了DatetimeIndex对象。 对行索引进行排序,可以极大地提高速度 读取crime数据集,行索引设为REPORTED_DATE,并排序 输出DatetimeIndex的可用属性和方法 用index找到星期名 groupby可以接收函数作为参数。 用函数将行索引变为周几,然后按照犯罪和交通事故统计 可以用函数列表,用天的小时时间和年做分组,然后对表做重构型 xs方法可以从任意索引层选出一个唯一值 用xs只从2016年选择数据,层级是1 读取employee数据集,用HIRE_DATE列创造一个DatetimeIndex 对性别做分组,查看二者的工资 根据聘用日期,每10年分一组,查看工资情况 如果要按性别和五年分组,可以在groupby后面调用resample 对性别unstack 上面数据的问题,是分组不恰当造成的。 第一名男性受聘于1958年 为了解决前面的分组问题,必须将日期和性别同时分组 groupby返回对象包含resample方法,但相反却不成立 通过加9,手工创造时间区间 也可以使用cut函数创造基于每名员工受聘年份的等宽间隔 第10章 用Matplotlib、Pandas、Seaborn进行可视化 读取flights数据集 创建两列,表示延迟和准时 对类型值和连续值列作图 添加关于年的列,用起飞时间得到小时和分钟 用to_datetime函数,将df_date变为Timestamps对象 用flight_dep作为新的行索引,并根据它统计每周的航班数 如果航班数小于1000,则将其当做缺失值。然后用interpolate方法填补缺失值 找到10个有最长平均入境航班航程、最少100航次的机场 画出航班时间和航程的散点图 用cut函数,将航班距离分成八组 取出特征X和目标y的部分 初始化模型 拟合模型 判
👉👉👉 https://gitee.com/yinuo112/Backend/blob/master/Python/嘿马python数据分析教程/note.md
金融风控相关业务介绍
- 早期信贷风控怎么做?
- 人审靠业务经验,效率低
- 不适用于移动互联网时代的金融场景
- 建模的概念
- 建模就是构造一个数学公式,将我们手上有的数据输入进去,通过计算得到预测结果
- 风控模型最原始的思路就是输入用户的信息,得到这个人 “会还钱” 还是 “不会还钱”。这就是个二分类问题。
- 而评分卡模型就是希望能将一系列的个人信息输入模型,然后得到一个用户的还款概率
- 概率越大,评分越高,越容易还钱
- 概率越小,评分越低,越容易跑路
- 典型例子就是芝麻信用分。
- 为什么一定要应射成某种分数呢
- 有分数刻度的好处
- 我们可以随时根据业务需求调整通过率
- 更容易向用户解释他的信用评级
- 更容易向领导解释一个用户被拒绝的原因
- 更容易监控一个模型的效果
- 风控流程 风控的角度来看,基本上可以归结为以下几个部分: 数据采集 反欺诈 策略 模型 催收
- 数据采集 数据采集会涉及到埋点和爬虫技术,基本上业内的数据都大同小异。免费的运营商数据、和安卓可爬的手机内部信息(app名称,手机设备信息,部分app内容信息)、以及收费的征信数据、各种信息校验、外部黑名单之类的。还有一些特定场景的现金贷和消费金融会有自有的数据可供使用,比如阿里京东自己的电商数据、滴滴的司机数据、顺丰中通的快递数据等等。由于不涉及爬虫,这一块主要让大家理解一下都可以做些什么变量。
- 反欺诈引擎 反欺诈引擎主要包括两个部分,反欺诈规则和反欺诈模型。这里其实很少使用传统监督模型。涉及到的算法以无监督算法、社交网络算法、深度学习居多。大部分的公司都使用的是反欺诈规则,这也是主要提倡的。一个原因是欺诈标签不好得到,很难做监督学习的训练。还有一个原因是传统的机器学习对欺诈的检测效果很差。因为所谓欺诈,就是一些黑产或者个人将自己包装成信用良好的用户,进行借款后失联或者拒不还钱。既然都伪装成了好客户,基于风控人员主观思考建立的统计模型,又怎么可能有好的效果。但是经过一段时间的实验,这一块其实用深度学习反而有意想不到的效果,基本思想可以理解为,简单评分卡解释性强,带来的坏处就是可以被逆向破解,而复杂模型的黑箱操作虽然解释性差,却有一定的安全性,尤其是搭配了在线学习等动态手段之后。反向破解的成本极高。此外还有很多算法诸如异常检测和知识图谱都在这一块有所应用。
- 规则引擎 规则引擎其实就是我们常说的策略,主要通过数据分析、挖掘手段以及一些监督、无监督算法,得到不同字段、各个区间的坏账率(badrate),找到最佳分段区间,然后得到筛选后信用较好的一批特定人群进行放款。这一块主要有单变量分析和一些关键指标的计算和监控,比如Rollrate、PSI、KS、AUC,等等。通常规则和模型是组合使用的,尤其在反欺诈场景中。
- 风控模型 风控模型是机器学习在风控领域的主要体现。当然前面提到的反欺诈模型也是重点之一。主要是通过监督算法构建违约概率预测模型。但是因为实际业务中,是数据的质量并不是永远那么完美,这里通常我们会使用到深度学习、无监督、弱监督等等方法去辅助 传统监督学习算法。 风控模型其中包含了A/B/C卡。模型算法之间可以没有显著区别,而是根据其发生的时间点不同而进行划分的
- 贷前 申请评分卡 Application score card A卡可以用客户历史逾期天数最大的天数
- 贷中 行为评分卡 Behavior score card B卡则可以多期借款中逾期最大的一次
- 贷后 催收评分卡 Collection score card C卡 是否被内催催回来定义y
- 也就是y产生的方式不一样。通常信贷领域都是用逾期天数来定义y
- C卡因为用途不同有不同的建立方法。比如你们公司有内催,有外催。外催肯定是回款率低,单价贵的。那么就可以根据是否被内催催回来定义y。
- 催收 催收是风控的最终手段。这个环节可以产生很多对模型有帮助的数据。比如催收记录的文字描述、触达率、欺诈标签等等。并且坏账的客户会被列入黑名单。其实只要是能被催回来的,都不是坏账。但是很多公司为了保险起见,逾期超过一定时间的客户,即使被催回来,也会被拉入黑名单。这里主要的算法就是催收模型相关的,可能是监督、无监督算法。也有基于社交网络算法构造的失联模型等等。
- 几个概念 Badrate: 坏人占比 MOB (month on book):开卡时长 Vintage分析法是一种动态分析法,用来分析不同时期资产的表现情况,它以贷款的账龄为基础,观察每批放款贷后1,2,3…N个月时的逾期情况。 Roll-Rate分析追溯贷款状态之间每月的迁移情况,展示了每批贷款进入下一个逾期状态的概率。
金融反欺诈 常用特征处理方法
用户基本属性
phone_nember
- 手机号前缀,归属地是否相同
- 是否是虚拟运营商
- 流量卡还是通话卡
电话本备注 nickname
- 昵称符合固定的规律(中文+数字)
- 备注是否符合某种亲密的称呼
birthday
- 年纪 星座 生肖
sex
- 性别是否失衡
password
- 是否都相同
身份证号码
- 年龄 核对
- 性别 核对
- 城市
邮箱
- 是否是一次性邮箱
- username 满足规律
- 是否同一邮箱服务商
- 邮箱里面的数据(账单)
学历
- 相似性
住房
- 租房情况是否雷同
积分
- 是不是超过某个阈值
签到
- 相似性
ip
- 是否是同一个号段
- 每次登录ip地址是否相同
- 是不是临时ip 和 gps
- ip 和 gps 是否能对的上
gps
- 经纬度相似性分析
- 国家 省份 城市 相似性
- ip 和 gps 是否能对的上
wifi
- ssid
- wifi list
- 贷款前的几分钟有没有切换过wifi
application time
- 时间切片
- 注册用了多长时间(太快太慢都有问题)
- 一共申请了几次
login time
- 时间切片
- 登陆了几次、频率
- 最后一次登录时间距贷款时间的间隔
- 同一时间登录做一个校验(同一时间多人登录)
ua(user agent)
- 每次打开是否是同一个ua
渠道
- app/H5/微信
- 渠道ID属于违规渠道
app version
- 每次app的版本号是否相同
- app版本会不会太老了(老版本的app有bug,可能会被黑中介用来我们)
推荐人/联系人
- 名字匹配
- 手机号匹配
设备指纹
imei
- 否都相同
- 每次登录imei号是否都相同
device id
- 否都相同
- 每次登录device id号是否都相同
分辨率
- 手机型号和屏幕分辨率是否一致
mobile type
- 手机品牌
- 手机型号
os(operating system)
- 每次打开操作系统是否都相同
- 来申请的人是否os都相同
- os的版本是否太旧
中文错别字可以考虑转换成拼音做相似度匹配
address
- 地址要标准化
- 模糊匹配
- 相似度计算(cos距离,词向量)
company
- 正则
- 字节拆分
- 关键字提取
- 相似度计算
- 错别字/同音字识别
第三方数据
人行征信
- 公司信息是否一致
[logging 文档]
- 学历是否一致
- 居住地址是否一致
- 手机号码是否一致
- 逾期数据
运营商
- 是否有相同的联系人
- 是否有黑名单客户在通讯录中
- 通话最频繁的几个人(所在地是否和他相同)
社保公积金
- 工资
- 社保
- 公积金
特征工程
特征选择 (feature_selection)
Filter
- 移除低方差的特征 (Removing features with low variance)
- 单变量特征选择 (Univariate feature selection)
Wrapper
- 递归特征消除 (Recursive Feature Elimination)
Embedded
- 使用SelectFromModel选择特征 (Feature selection using SelectFromModel)
- 将特征选择过程融入pipeline (Feature selection as part of a pipeline)
当数据预处理完成后,我们需要选择有意义的特征输入机器学习的算法和模型进行训练。
通常来说,从两个方面考虑来选择特征:
特征是否发散
如果一个特征不发散,例如方差接近于0,也就是说样本在这个特征上基本上没有差异,这个特征对于样本的区分并没有什么用。
特征与目标的相关性
这点比较显见,与目标相关性高的特征,应当优选选择。除移除低方差法外,本文介绍的其他方法均从相关性考虑。
根据特征选择的形式又可以将特征选择方法分为3种:
- Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
- Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
- Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。
特征选择主要有两个目的:
- 减少特征数量、降维,使模型泛化能力更强,减少过拟合;
- 增强对特征和特征值之间的理解。
拿到数据集,一个特征选择方法,往往很难同时完成这两个目的。通常情况下,选择一种自己最熟悉或者最方便的特征选择方法(往往目的是降维,而忽略了对特征和数据理解的目的)。接下来将结合 Scikit-learn提供的例子 介绍几种常用的特征选择方法,它们各自的优缺点和问题。
Filter
1)移除低方差的特征 (Removing features with low variance)
假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用。而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。
In [3]:
from sklearn.feature_selection import VarianceThreshold
X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
sel = VarianceThreshold(threshold=(.8 * (1 - .8)))
sel.fit_transform(X)
Out[3]:
array([[0, 1],
[1, 0],
[0, 0],
[1, 1],
[1, 0],
[1, 1]])
果然, VarianceThreshold 移除了第一列特征,第一列中特征值为0的概率达到了5/6.
2)单变量特征选择 (Univariate feature selection)
单变量特征选择的原理是分别单独的计算每个变量的某个统计指标,根据该指标来判断哪些变量重要,剔除那些不重要的变量。
对于分类问题(y离散),可采用:
- 卡方检验
对于回归问题(y连续),可采用:
- 皮尔森相关系数
- f_regression,
- mutual_info_regression
- 最大信息系数
这种方法比较简单,易于运行,易于理解,通常对于理解数据有较好的效果(但对特征优化、提高泛化能力来说不一定有效)。
- SelectKBest 移除得分前 k 名以外的所有特征(取top k)
- SelectPercentile 移除得分在用户指定百分比以后的特征(取top k%)
- 对每个特征使用通用的单变量统计检验: 假正率(false positive rate) SelectFpr, 伪发现率(false discovery rate) SelectFdr, 或族系误差率 SelectFwe.
- GenericUnivariateSelect 可以设置不同的策略来进行单变量特征选择。同时不同的选择策略也能够使用超参数寻优,从而让我们找到最佳的单变量特征选择策略。
卡方(Chi2)检验
经典的卡方检验是检验定性自变量对定性因变量的相关性。比如,我们可以对样本进行一次chi2 测试来选择最佳的两项特征:
In [4]: ```python from sklearn.datasets import load_iris from sklearn.feature_selection import SelectKBest from sklearn.feature_selection import chi2
- 点赞
- 收藏
- 关注作者
评论(0)