天池学习赛--贷款违约预测
贷款违约预测
赛题以金融风控中的个人信贷为背景,要求选手根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题。通过这道赛题来引导大家了解金融风控中的一些业务背景,解决实际问题,帮助竞赛新人进行自我练习、自我提高。
环境配置
import time
import datetime
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from keras.losses import mean_squared_error
from sklearn.model_selection import KFold
import lightgbm as lgb
通过 pip install -r requiremens.txt
即可安装需要的python包
数据预处理
赛题以预测用户贷款是否违约为任务,数据集报名后可见并可下载,该数据来自某信贷平台的贷款记录,总数据量超过120w,包含47列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取80万条作为训练集,20万条作为测试集A,20万条作为测试集B,同时会对employmentTitle、purpose、postCode和title等信息进行脱敏
原始数据包括训练集和测试集有100万条,数据量相对较大,后续需要进行特征工程,所以对于数据进行预处理在数据挖掘过程中是一项重要的工作。
# 缺失情况
percent_missing = train_data.isnull().sum() * 100 / len(train_data)
missing_value_df = pd.DataFrame({
'column_name': train_data.columns,
'percent_missing': percent_missing
})
print(missing_value_df)
# 数据情况
print(train_data.head())
print(train_data.info())
训练集的缺失情况如上图,缺失字段包括
’employmentTitle’, ‘employmentLength’, ‘postCode’, ‘dti’, ‘pubRecBankruptcies’, ‘revolUtil’, ‘title’, ‘n0’, ‘n1’, ‘n2’, ‘n4’, ‘n5’, ‘n6’, ‘n7’, ‘n8’, ‘n9’, ‘n10’, ‘n11’, ‘n12’, ‘n13’, ‘n14’
缺失值的处理有三种方法:1.填充(平均值,众数,或与已有数值明显区分的数值-999等);2.直接删除(删除存在缺失值或缺失率较高的样本);3.缺失值预测(利用其他列来预测缺失列数据)。可知缺失情况较为严重的n0-n14特征在train和test中同时缺失较为突出,简单的对这些缺失值填充-999,之后对缺失数据分析统计意义特征。
数据处理
def dataProcessing():
"""
数据预处理
:return: null
"""
# 处理工作年限
train_data[['employmentLength']].fillna(-999, inplace=True)
train_data['employmentLength'] = train_data['employmentLength'].apply(lambda x: transform_employmentLength(x))
test_data['employmentLength'] = test_data['employmentLength'].apply(lambda x: transform_employmentLength(x))
# 处理贷款发放时间
train_data['issueDate_day'] = train_data['issueDate'].apply(lambda x: transform_date(x))
test_data['issueDate_day'] = test_data['issueDate'].apply(lambda x: transform_date(x))
# 处理早期信用额度
train_data['earliesCreditLine'] = train_data['earliesCreditLine'].apply(
lambda x: transform_earliesCreditLine(x))
test_data['earliesCreditLine'] = test_data['earliesCreditLine'].apply(
lambda x: transform_earliesCreditLine(x))
# 处理贷款等级
train_data['grade'] = train_data['grade'].apply(lambda x: transform_grade(x))
test_data['grade'] = test_data['grade'].apply(lambda x: transform_grade(x))
# 处理贷款子等级
train_data['subGrade'] = train_data['subGrade'].apply(lambda x: transform_subGrade(x))
test_data['subGrade'] = test_data['subGrade'].apply(lambda x: transform_subGrade(x))
数据可视化
数据可视化能够很好的展示不同特征之间的关系,对于进行特征处理有很大的帮助
模型选取
针对金融风控领域:大部分选取的是机器学习模型中的Random Forests, lightgbm,xgboost,catboost等树模型,而不是深度学习模型,原因主要包括:1.样本数量小 2.样本不均衡 3.深度学习模型对于特定结构的特征学习效果较好(比如文本和图像),而针对具有实际意义的金融领域特征来说,传统树模型构造的可解释性特征效果显著。
lightGBM在传统的GBDT算法上进行了如下优化:
- 基于Histogram的决策树算法。
- 单边梯度采样 Gradient-based One-Side Sampling(GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。
- 互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。
- 带深度限制的Leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长 (level-wise) 的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。
- 直接支持类别特征(Categorical Feature)
- 支持高效并行
- Cache命中率优化
params = {'num_leaves': 9,
'min_data_in_leaf': 40,
'objective': 'regression', # 目标函数
'max_depth': 16,
'learning_rate': 0.01,
'boosting': 'gbdt',
'bagging_freq': 5,
'bagging_fraction': 0.8, # 每次迭代时用的数据比例
'feature_fraction': 0.8201, # 每次迭代中随机选择80%的参数来建树
'bagging_seed': 11,
'reg_alpha': 1.728910519108444,
'reg_lambda': 4.9847051755586085,
'random_state': 42,
'metric': 'rmse',
'verbosity': -1,
'subsample': 0.81,
'min_gain_to_split': 0.01077313523861969,
'min_child_weight': 19.428902804238373,
'num_threads': 4
}
预测结果