# “魔镜杯”风控算法大赛拍拍贷风控模型
比赛数据:
```c++
https://link.zhihu.com/?target=https%3A//www.kesci.com/home/competition/56cd5f02b89b5bd026cb39c9/content/1
```
## 项目概述:
1. 比赛数据:
"拍拍贷"提供的数据包括信用违约标签(因变量)、建模所需的基础与加工字段(自变量)、相关用户的网络行为原始数据,数据字段已经做脱敏处理。本次实战采用的是初赛数据,包括3万条训练集和2万条测试集。数据文档包括:
- Master:每一行代表一个样本(一笔成功成交借款),每个样本包含200多个各类字段。
- Log_Info:借款人的登陆信息,每个样本含多条数据。
- Userupdate_Info:借款人修改信息,每个样本多条数据。
2. 比赛规则:
基于训练集数据构建预测模型,使用模型计算测试集的评分(评分数值越高,表示越有可能出现贷款违约),评价标准为AUC。
## 建模思路:
1. 数据清洗工作,主要做一下缺失值处理,常变量处理,空格符处理,字符大小写转换等
2. 特征处理工作,分为特征转换和特征衍生。主要做了以下工作:
- Master数据:地理位置信息的处理(省份,城市),运营商和微博特征的转换,以及对排序特征,periods特征的交叉组合等。
- Log_Info数据:衍生出"累计登陆次数","登录时间的平均间隔","最近一次的登录时间距离成交时间差"等特征。
- Userupdate_Info数据:衍生出"最近的修改时间距离成交时间差","修改信息的总次数", "每种信息修改的次数"等特征。
3. 特征筛选工作:利用lightgbm输出特征重要性进行筛选。
4. 建模工作:
- 单模型,选用的机器学习模型是lightgbm。
- bagging模型:基于bagging的思想,通过对模型参数进行随机扰动,构建多个子模型,选用的基模型是lightgbm。
## 重要工作:
1. 数据离群值判定,清洗
2. 利用XGboost,按特征重要性系统衍生新特征,剥离没用的特征
3. 特征的离散化,二值化,数值型特征衍生排序
4. 交叉验证,网格搜索完成lightGBM超参数设置
5. bagging lightGBM模型
## 项目流程
### 数据清洗(data_input, data_EDA_clean代码模块)
1. 导入合并好的数据,看一下好坏用户比:
Mater数据包含约50000个样本,200多个字段。
```python
# 样本的好坏比
data1.target.value_counts()
```
![](https://www.writebug.com/myres/static/uploads/2022/6/18/09c12ff3de158a290be47f5fd8b5ae48.writebug)
好坏比约11:1,属于不平衡数据集,因为最后模型用的是lightgbm,故本次实战先不采用过采样方法来进行数据抽样,直接用原始数据来建模。
2. 缺失值处理:
缺失变量的数据可视化
![](https://www.writebug.com/myres/static/uploads/2022/6/18/e0d90032497cc2b2f89fd2b55cab00eb.writebug)
有一些变量缺失率很高,如果将缺失填充为0,这类变量其实可看做一类稀疏特征,由于xgboost,lightgbm等GBDT类树模型对高维稀疏特征处理不太好,并考虑到这些变量的业务含义未知,携带的信息量太少,故对缺失率高的变量作删除处理。
除了要考虑变量的缺失情况,也要考虑样本缺失特征个数的情况,一个样本如果缺失的特征很多,说明用户的信息完善程度很低,通过对缺失样本的可视化,发现了这些离群点,可以考虑删除。
```python
# 样本的趋势个数可视化
sc.plot_missing_user(df=data1,plt_size=(16,5))
```
![](https://www.writebug.com/myres/static/uploads/2022/6/18/5172b96bdf47c7239baf3ea2ec86c721.writebug)
```python
# 删除变量缺失个数在100个以上的用户
data1 = sc.missing_delete_user(df=data1,threshold=100)
```
缺失变量个数在100以上的用户数有298个。
3. 常变量处理
当一个变量中单个值所占比例过高(90%以上),说明该变量方差比较小,携带的信息较少,导致区分能力较差,对于这些变量也做删除处理。
4. 字符格式转换
城市特征清洗:
```c++
# 计算4个城市特征的非重复项计数,观察是否有数据异常
for col in ['UserInfo_2','UserInfo_4','UserInfo_8','UserInfo_20']:
print('{}:{}'.format(col,data1[col].nunique()))
print('\t')
```
![](https://www.writebug.com/myres/static/uploads/2022/6/18/9b4df1d9c965746d1d04146c41230f8f.writebug)
UserInfo_8相对其他特征nunique较大,发现有些城市有"市",有些没有,需要做一下格式转换,去掉字符串后缀"市".
print(data1.UserInfo_8.unique()[:50])
![](https://www.writebug.com/myres/static/uploads/2022/6/18/a774b25f486f0c9d86cb7fce8cbc4b7f.writebug)
```python
# UserInfo_8清洗处理,处理后非重复项计数减小到400
data1['UserInfo_8']=[s[:-1] if s.find('市')>0 else s[:] for s in data1.UserInfo_8]
```
UserupdateInfo1特征大小写转换:
'UserupdateInfo1'包含了大小写,如"qQ"和"QQ",属于同一种意思,所以需要对其英文字符统一转换大小写。
```python
# 将UserupdateInfo1里的字符改为小写形式
df2['UserupdateInfo1'] = df2.UserupdateInfo1.map(lambda x:x.lower())
```
### 特征处理(feature_processing代码模块)
1. Master数据:
对Master中的类别型特征(省份,城市,运营商,微博)做特征转换,对数值型变量做排序特征,periods特征的衍生。
类别型特征:
- 省份:
原数据有两个省份字段,推测一个为用户的户籍地址,另一个为用户居住地址所在省份,由此可衍生的字段为:
1. 省份二值化,通过违约率将单个省份衍生为二值化特征,分为户籍省份和居住地省份
2. 户籍省份和居住地省份是否一致,推测不一致的用户大部分为外来打工群体,相对违约率会高一点。
3. 计算违约率时要考虑该省份的借款人数,如果人数太少,参考价值不大
省份二值化
![](https://www.writebug.com/myres/static/uploads/2022/6/18/49c9639052aa04ed9a9cbb2018cc6e41.writebug)
两种省份特征选择出违约率排名前五的省份,并做二值化衍生。
户籍省份和居住地省份不一致衍生
- 城市变量:
原数据中有4个城市信息,推测为用户常登录的IP地址城市,衍生的逻辑为:
通过xgboost挑选比较重要的城市变量,进行二值化衍生
由4个城市特征的非重复项计数可衍生成 登录IP地址的变更次数
城市二值化衍生
```python
# 根据xgboost变量重要性的输出对城市作二值化衍生
```
![](https://www.writebug.com/myres/static/uploads/2022/6/18/6f1242ce615aa99b576bf3e72815b024.writebug)
将特征重要性排名前三的城市做二值化衍生:
IP地址变更次数衍生
- 运营商:
因运营商的种类少,直接做亚编码处理即可。
- 微博:
先对微博特征做一下缺失值填充,再做亚编码处理。
**数值型特征**:
- 排序特征衍生:
对数值型特征按数值从小到大进行排序,衍生成排序特征,排序特征异常值有更强的鲁棒性,可以增强模型的稳定性,降低过拟合风险。
- periods特征衍生:
```python
# 生成只包含periods的临时表
periods_col = [i for i in num_col2 if i.find('Period')>0]
periods_col2 = periods_col+['target']
periods_data = data1.loc[:,periods_col2]
```
观察包含period1所有字段的数据,发现字段之间量级差异比较大,可能代表不同的含义,不适合做衍生。
```c++
periods1_col = [col for col in periods_col if col.find('Period1')>0]
periods_data.loc[:,periods1_col].head()
```
![](https://www.writebug.com/myres/static/uploads/2022/6/18/ff191214a4f0e2676ae98f726d9ddcc5.writebug)
观察后缀都为1的字段,发现字段数据的量级基本一致,可以对其做min,max,avg等统计值的衍生。
```c++
period_1_col=[]
for i in range(0,102,17):
col =
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:设计报告word+源码及数据 数据离群值判定,清洗 利用XGboost,按特征重要性系统衍生新特征,剥离没用的特征 特征的离散化,二值化,数值型特征衍生排序 交叉验证,网格搜索完成lightGBM超参数设置 bagging lightGBM模型 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/125367950
资源推荐
资源详情
资源评论
收起资源包目录
Python实现的拍拍贷金融风控模型.zip (10个子文件)
model_bagging_lightgbm.ipynb 27KB
README.md 15KB
data_input.ipynb 9KB
feature_select.ipynb 48KB
LICENSE 1KB
single_lightgbm_model.ipynb 93KB
core_card.py 6KB
feature_processing.ipynb 246KB
设计报告.docx 916KB
data_EDA_clean.ipynb 291KB
共 10 条
- 1
资源评论
- 要什么微信名2024-02-22资源太好了,解决了我当下遇到的难题,抱紧大佬的大腿~
- Python_Lang2022-12-01发现一个宝藏资源,赶紧冲冲冲!支持大佬~
- Albert_titan2023-05-23资源值得借鉴的内容很多,那就浅学一下吧,值得下载!
shejizuopin
- 粉丝: 9287
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功