2021 CCF大数据与计算智能大赛个贷违约预测top 73 解决方案

2023-11-20

一、概述

这是我第二次参加大数据类型的竞赛,也是第一次接触金融类的题目,这一题可以称作CCF BDCI这一年的究极卷王题,3200个队伍参加,1300多个队伍提交,比其他赛题多了几倍,最后尽力也只拿下B榜73/3246的名次。
在次记录自己的解题过程以及所思所想。
赛题地址:https://www.datafountain.cn/competitions/530
在这里插入图片描述

二、解题过程

2.1 数据

本次的数据由3个表组成,分别为个人贷款违约记录数据train_public.csv,某网络信用贷产品违约记录数据train_internet_public.csv,测试集test_public.csv。
数据说明请参考:https://www.datafountain.cn/competitions/530/datasets

通过查看数据,我们可以得知,这三个表可以大致理解为:和测试集分布较为接近的训练集(一万条)train_public,和测试集分布不同的训练集补充train_inte(70多万条),测试集。
很显然,本题的意思在于从补充测试集中找寻合适的数据扩充到原本的数据集中进行训练,然后预测提分,怎么样找到合适的数据成为本题的关键。

对于原始的数据,有一些初步的处理:

  • 对于时间类型的数据,转化为统一的time格式,并可以细化为年,月,周等
  • 对于string类型表达的数据,如工作类型等编码为数字类型
  • 将空值用均值进行填充

对三张表均进行上述操作,构建最基本的三张表

2.2 构建基线

参考社区分享的基线,构建LGBM模型

        clf = LGBMClassifier(
            n_estimators=4000,
            learning_rate=0.03,
            num_leaves=2 ** 5,
            colsample_bytree=.65,
            subsample=.9,
            max_depth=5,
            #             max_bin=250,
            reg_alpha=.3,
            reg_lambda=.3,
            min_split_gain=.01,
            min_child_weight=2,
        )

首先测试仅将train_public一万条数据导入lgbm中进行训练并测试,采用5折交叉验证,最终的结果为0.8786,这即为最初的基线,在我看来,跑通代码是比赛的第一步,也是较为关键的一步o(╥﹏╥)o

2.3 进阶思路一

同样参考社区提出的方法,第一个思路在于先使用train_public训练lgbm,然后使用训练得到的lgbm预测扩充数据集train_inte,设定一个筛选阈值,从中选择预测较为准确的样本。举个例子,我们根据原始训练集训练了lgbm,然后使用该lgbm预测train_inte,发现预测值<0.08的值(预测为0)其真实标签也为0,即预测全对,则我们将预测值<0.08的样本全部纳入原本训练集中进行扩充,此时数据来到7-10万条,代码大致如下:

#首先训练原始样本
oof_preds, IntePre, importances = train_model(train_data, train_inteSame, y, folds)

IntePre['isDef'] = train_inte['is_default']
from sklearn.metrics import roc_auc_score

roc_auc_score(IntePre['isDef'], IntePre.isDefault)
## 选择阈值0.05,从internet表中提取预测小于该概率的样本,并对不同来源的样本赋予来源值
InteId = IntePre.loc[IntePre.isDefault < 0.08, 'loan_id'].tolist()

train_data['dataSourse'] = 1
test_public['dataSourse'] = 1
train_inteSame['dataSourse'] = 0
train_inteSame['isDefault'] = train_inte['is_default']
use_te = train_inteSame[train_inteSame.loan_id.isin(InteId)].copy()
#扩充数据
data = pd.concat([train_data, test_public, use_te]).reset_index(drop=True)

del data
del train_data, test_public

print(train.columns)
print(test.columns)
y = train['isDefault']
#再度训练以及预测
folds = KFold(n_splits=15, shuffle=True, random_state=2021)
oof_preds, test_preds, importances = train_model(train, test, y, folds)

使用该方法可以有效扩充数据集,线上分来到0.8852

2.4 进阶思路二

使用伪标签,该方法即先使用2.3中得到的模型预测测试集,然后再次设定一个阈值,将符合阈值的测试集数据纳入到训练集中,标签根据预测结果给定,此举可以进一步扩充数据集,使得模型看到更多类型的数据。
但值得注意的是,该方法要看赛事官方是否允许,本题中并未禁止
使用该方法后,线上分来到0.8925

2.5 进阶思路三

第三个思路我们在最后几天才想到,即使用聚类的思想,将三张表凑在一起进行聚类,将与测试集聚类在一起的样本挑出来作为训练样本。
经过实验我们发现聚类的结果将大部分训练集和测试集分为一类,可见其分布一致,而train_inte中的数据被分为几类,从中挑选与测试集聚类结果尽量相同的样本,经过我们的挑选,在40万-60万之间(多次实验,记不清了)。
参考代码(此处我们使用了Kmeans,但实际上我们还使用过BIRCH,最后时间紧迫来不及详细测试孰优孰劣):

# 综合分类数据集
from numpy import where
from sklearn.datasets import make_classification
from sklearn.cluster import Birch,MiniBatchKMeans,KMeans
from matplotlib import pyplot
import pandas as pd
import re
import numpy as np
from sklearn.preprocessing import LabelEncoder
# 定义数据集

train_data = pd.read_csv(r'D:\比赛\CCF_BDCI_Money\raw_data\train_public.csv')
test_public = pd.read_csv(r'D:\比赛\CCF_BDCI_Money\raw_data\test_public.csv')
train_inte = pd.read_csv(r'D:\比赛\CCF_BDCI_Money\raw_data\train_internet.csv')

def findDig(val):
    fd = re.search('(\d+-)', val)
    if fd is None:
        return '1-'+val
    return val + '-01'

work_year_dict = {
    '< 1 year': 0,
    '1 year': 1,
    '2 years': 2,
    '3 years': 3,
    '4 years': 4,
    '5 years': 5,
    '6 years': 6,
    '7 years': 7,
    '8 years': 8,
    '9 years': 9,
    '10+ years': 10,
}

class_dict = {
    'A': 1,
    'B': 2,
    'C': 3,
    'D': 4,
    'E': 5,
    'F': 6,
    'G': 7,
}

timeMax = pd.to_datetime('1-Dec-21')
train_data['work_year'] = train_data['work_year'].map(work_year_dict)
test_public['work_year'] = test_public['work_year'].map(work_year_dict)
train_inte['work_year'] = train_inte['work_year'].map(work_year_dict)

train_data['class'] = train_data['class'].map(class_dict)
test_public['class'] = test_public['class'].map(class_dict)
train_inte['class'] = train_inte['class'].map(class_dict)


train_data['earlies_credit_mon'] = pd.to_datetime(train_data['earlies_credit_mon'].map(findDig))
test_public['earlies_credit_mon'] = pd.to_datetime(test_public['earlies_credit_mon'].map(findDig))
train_inte['earlies_credit_mon'] = pd.to_datetime(train_inte['earlies_credit_mon'].map(findDig))

cat_cols = ['employer_type', 'industry']

for col in cat_cols:
    lbl = LabelEncoder().fit(train_data[col])
    train_data[col] = lbl.transform(train_data[col])
    test_public[col] = lbl.transform(test_public[col])
    train_inte[col] = lbl.transform(train_inte[col])


col_to_drop = ['issue_date', 'earlies_credit_mon','post_code','region']
train_data = train_data.drop(col_to_drop, axis=1)
test_public = test_public.drop(col_to_drop, axis=1 )
train_inte = train_inte.drop(col_to_drop, axis = 1)

train_inte = train_inte.drop(['sub_class'], axis = 1)

same_cols = list(set(train_data.columns.tolist()) & set(test_public.columns.tolist()) & set(train_inte.columns.tolist()))

data = pd.DataFrame()

import pdb
for col in same_cols:
    data[col] = pd.concat([train_data[col], test_public[col], train_inte[col]])
    data[col] = data[col].fillna(data[col].mean())

y = np.zeros(len(data))
i = 0
print(data.shape)
data = data.sample(765000)
data = data.reset_index(drop = True)

feat =[f for f in data.columns if f not in ['loan_id', 'user_id', 'isDefault']]
label_csv = pd.DataFrame()
label_csv['loan_id'] = data['loan_id']
label_csv['user_id'] = data['user_id']
col_name = 0

model = KMeans(n_clusters=3 , max_iter=1000)
model.fit(data[feat])
label_csv['kmeans_predict'] = model.predict(data[feat])
# print(label_csv)
label_csv.to_csv('聚类测试_3_no_batch.csv',index=False)


最后聚类得到的文件经过lgbm训练也能达到0.895附近

2.6 融合

最后我们将几种思路用过线上分加权平均,得到最终结果

2.7 调优提分过程

在具体比赛中,很多结果不是一蹴而就的,而是经过了多次调参的结果,在操作中,以下参数对结果影响较大:

  • 学习率大小
  • 思路中提到的阈值
  • 在调模型过程中,我仔细对比了数据,发现部分对于借贷而言是没有作用的,故删除,这一举措对线上分影响较大,我删去的特征有借贷具体的月、周、日,最早确立信贷的月份,邮编,地区等。当然具体问题具体分析,每道题都有不相关的特征,删除这些或有奇效。
  • Kfold折数,15折效果明显优于5折

2.8 其他工作

在比赛中,我们还做了许多其他方面的努力,但对于最终的结果并未产生足够的效果,列举为:

  • 我们发现,数据中有一些噪声,如借贷人最早确立信贷的时间,居然有2070年的,我们查看了测试集的分布,添加时间约束,将样本筛选时间在1996-2002之间,但却使得线上分下降
  • 我们做了一些新的特征,如,我们根据债务收入比和其借贷金额算出其工资等,但对于线上分的影响也是负面的
  • 我们尝试使用xgboost,catboost,随机森林等集成学习模型训练融合,但结果不尽人意

三、结语

感谢你能看到这里,希望我的经历能帮助到你。
竞赛新手,深知才疏学浅,如有错误之处欢迎评论区指出,在此不胜感激。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

2021 CCF大数据与计算智能大赛个贷违约预测top 73 解决方案 的相关文章

  • STM32 串行FLASH文件系统FatFs

    目录 一 Windows系统为例 二 文件系统的结构与特性 为什么要应用文件分配表 三 FatFs文件系统 1 FatFs 文件系统源码介绍 2 FatFs在程序中的关系网 四 配置FatFs移植程序 1 配置diskio c文件 2 配置
  • MobaXterm x11-forwarding

    Linux系统也是有图像界面的 它的方式和Windows不一样 叫做 X Window 采用的是X11协议 X11 中的 X 指的就是 X 协议 11 指的是采用 X 协议的第 11 个版本 客户端是X server 用MobaXterm登
  • CocosCretor解决premultipliedAlpha黑边问题

    在官方文档中的说明 premultipliedAlpha 对于是否启动贴图预乘 当图片的透明区域出现色块时 需要关闭该选项 当图片的半透明区域颜色变黑时 需要启用该选项 之前在项目中导出的spine有黑边问题 也就是半透明区域颜色变黑 然后
  • 《软件测试的艺术》第五章 模块(单元)测试

    软件测试的艺术 第五章 模块 单元 测试 5 0 前言 5 1 测试用例设计 5 2 增量测试 5 3 自顶向下测试和自底向上测试 5 3 1 自顶向下的测试 5 3 2 自底向上的测试 5 3 3 比较 5 4 执行测试 5 5 小结 参

随机推荐

  • vite-svg-loader,在项目里轻松使用svg,ts项目需特别注意!

    前言 vite svg loader插件可以让我们像使用vue组件那样使用svg图 使用起来超级方便 安装 npm install vite svg loader save dev 使用 1 vite config ts配置 import
  • 解决Flutter键盘弹起导致与输入框有间距问题(Flutter键盘弹起Scaffold布局流程)解析

    一 在项目中遇到了个如下问题 当页面底部有个输入框 点击弹出键盘时 输入框与键盘之间有一段间距 通过排除 最后找到了问题根源所在 原因是使用了这个屏幕适配框架导致的 此框架通过直接修改FlutterViewConfiguration 的si
  • Spring boot中,feign远程调用api,用@SpringQueryMap接收GET请求参数,自定义QueryMapEncoder处理特殊类型的参数转换

    feign远程调用时 get请求时 如果有特殊的字段类型 用 SpringQueryMap接收参数时 会出现异常 需要自定义QueryMapEncoder 本文例举OffsetDateTime字段类型处理 1 OffsetDateTimeQ
  • 性能测试 —— Tomcat监控与调优:status页监控

    Tomcat服务器是一个免费的开放源代码的Web 应用服务器 Tomcat是Apache 软件基金会 Apache Software Foundation Jakarta 项目中的一个核心项目 由Apache Sun 和其他一些公司及个人共
  • 圆石说│彭一鸣:运用区块链技术赋能实体旅游产业;微软开放6万项专利包括一个开源区块链项目……

    智联招聘 区块链岗位需求主要集中在一线和新一线城市 智联招聘报告显示 从目前区块链职位的城市分布来看 该领域的岗位需求主要集中在一线和新一线城市中 其中 北京 上海和深圳位于第一梯队 职位占比分别达到24 20 和10 杭州 广州和成都紧随
  • spacemacs复制minibuffer的内容到buffer里

    spacemacs复制minibuffer的内容到buffer里 获取当前buffer的绝对路径 spacemacs复制minibuffer的内容到buffer里 不常用 但可以开阔一下视野 即 发现helm里 还有可进一步操作的命令 举例
  • pil_openvcv_scikit-image_tensorflow四种读图方式对比

    文章目录 1 四种不同的库读取jpg图显示 2 评估所读图片的差异 3 简单说明有差异原因 4 同样的流程对png图片进行处理 5 png图片转jpg 5 1 使用PIL进行转换 5 2 使用Opencv进行转换 5 3 使用Tensorf
  • asp.net ajax跨域访问,支持Ajax跨域访问ASP.NET Web Api 2(Cors)的示例教程

    随着深入使用ASP NET Web Api 我们可能会在项目中考虑将前端的业务分得更细 比如前端项目使用Angularjs的框架来做UI 而数据则由另一个Web Api 的网站项目来支撑 注意 这里是两个Web网站项目了 前端项目主要负责界
  • 【图像处理】非线性滤波

    非线性滤波 图像处理中滤波分线性滤波和非线性滤波两种 其中常见的线性滤波有 方框滤波 中值滤波 高斯滤波等 其主要原理就是每个像素的输出值是输入像素的加权和 所以像素的输入与输出成线性关系 线性滤波器易于构造 并且易于从频域响应角度进行分析
  • 【电路设计】220V AC转低压DC电路概述

    前言 最近因项目需要 电路板上要加上一个交流220V转低压直流 比如12V或者5V这种 一般来说 比较常见也比较简单的做法是使用一个变压器将220V AC进行降压 比如降到22V AC 但是很遗憾的是 支持220V的变压器一般体积很大 而板
  • Pycharm常用快捷键

    成长就是将你的一切都变成心静如水 将一切情绪都调整到静音模式 一 Pycharm常用快捷键 查找 CTRL F 全局查找 CTRL shift F 撤销 CTRL Z 缩进 Tab 行首 HOME 快速修正 alt enter 复写代码 C
  • chatgpt赋能python:如何使用Python进行SEO优化

    如何使用Python进行SEO优化 在数字化时代 SEO已经成为一个广泛使用且需求不断增加的领域 虽然有很多工具和技术可以用于SEO 但Python是其中之一 Python是一种现代编程语言 通常用于处理大数据集 自动化任务 Web开发等特
  • Android面试题内存&性能篇

    Android面试题内存 性能篇 由本人整理汇总 后续将继续推出系列篇 如果喜欢请持续关注和推荐 更多内容可以关注微信公众号 Android高级编程 android tech 系列文章目录 Android面试题View篇 Android面试
  • Linux下Memcached的安装步骤

    一 安装gcc yum y install gcc 二 安装libevent wget http www monkey org provos libevent 2 0 12 stable tar gz tar zxf libevent 2
  • 记录下sudo: export: command not found的原因

    今天设置环境变量 输入以下命令 sudo export PATH PATH 路径 路径为arm linux gcc的bin目录 结果提示 sudo export command not found 在网上搜了一下 网友给出了答案 原理是ex
  • vue+java实现在线播放mp4视频

    首先如果本地的mp4视频可以播放 但是在网页就显示视频格式不正确 可能原视频不是mp4格式的 更改后缀名为mp4了 但是在网页上还是无法播放 可以用 ffmpeg转换视频格式 一般遇到格式问题都是视频格式不对 需要专门的工具来转换 java
  • 《Linux系统调用:localtime,setlocale》

    一 介绍 时区 不同国家 有的甚至是同一国家不同地区 使用不同的时区和夏时制 对于要输入和输出时间的程序来说 必须对系统所处的时区和夏时制加以考虑 所有的细节已经由C语言库包办了 时区的定义 时区信息繁琐又多 出于这个原因系统没有将其直接编
  • 【ES6】Reflect反射机制

    文章目录 一 Reflect概述 二 用法详解 1 Object gt Reflect 2 修改Object方法的返回结果 3 命令式操作 gt 函数式操作 4 与Proxy对象的方法一一对象 5 apply 总结 一 Reflect概述
  • xshell如何连接远程服务器

    1 打开xshell后 点击新建 gt 会话 2 名称可以随意写 主机需要按照要求填写 远程服务器的IP在这里找 3 点击用户身份验证 4 按照要求填写用户名和密码 5 点击确定后 如果出现下面的命令则说明连接成功 6 再次打开xshell
  • 2021 CCF大数据与计算智能大赛个贷违约预测top 73 解决方案

    目录 一 概述 二 解题过程 2 1 数据 2 2 构建基线 2 3 进阶思路一 2 4 进阶思路二 2 5 进阶思路三 2 6 融合 2 7 调优提分过程 2 8 其他工作 三 结语 一 概述 这是我第二次参加大数据类型的竞赛 也是第一次