摘要:
合集:AI案例-ML-泛金融业
赛题:车辆贷款违约预测挑战赛
主办方:科大讯飞 + Datawhale
主页:http://challenge.xfyun.cn/topic/info?type=car-loan
AI问题:分类问题
数据集:包含52个特征字段的车辆贷款借款人数据集
数据集价值:违约预测
解决方案:LightGBM
一、赛题描述
背景
随着监管政策步入关键落地期,受合规监管标的限额影响,曾备受追捧的大额标的逐渐消失,小额分散的车贷业务成为网贷平台转型的主要方向之一。车贷资产由于进入门槛低、借款额度低、流动性高、限期短等优点,但做好风险防控依然是行业的主要问题之一。国内某贷款机构就面临了这样的难题,该机构的借款人往往拖欠还款或拒不还款,导致该机构的不良贷款率居高不下。面对如此头疼的问题,该机构将部分贷款数据开放,诚邀大家帮助他们建立风险识别模型来预测可能违约的借款人(敏感信息已脱敏)。
任务
给定某机构实际业务中的相关借款人信息,包含53个与客户相关的字段,其中loan_default字段表明借款人是否会拖欠付款。任务目标是通过训练集训练模型,来预测测试集中loan_default字段的具体值,即借款人是否会拖欠付款,以此为依据,降低贷款风险。
二、数据集说明
数据集由训练集和测试集组成,包含52个特征字段,同时对部分字段信息进行脱敏。训练集包括15万条数据,测试集包括3万条数据。训练集和测试集的区别是测试集中没有 loan_default 字段。
train.csv 和 test.csv 文件:
特征字段 | 字段描述 |
---|---|
customer_id | 客户标识符 |
main_account_loan_no | 主账户申请贷款数量 |
main_account_active_loan_no | 主账户申请的有效贷款数量 |
main_account_overdue_no | 主账号逾期数量 |
main_account_outstanding_loan | 主账户未偿还的贷款余额 |
main_account_sanction_loan | 主账户所有贷款被批准的贷款金额 |
main_account_disbursed_loan | 主账户所有贷款已发放的贷款金额 |
sub_account_loan_no | 二级账户申请贷款数量 |
sub_account_active_loan_no | 二级账户申请的有效贷款数量 |
sub_account_overdue_no | 二级账户逾期数量 |
sub_account_outstanding_loan | 二级账户未偿还的贷款金额 |
sub_account_sanction_loan | 二级账户所有贷款被批准的贷款金额 |
sub_account_disbursed_loan | 二级账户所有贷款已发放的贷款金额 |
disbursed_amount | 已发放贷款金额 |
asset_cost | 资产成本 |
branch_id | 发放贷款的分行 |
supplier_id | 发放贷款的车辆经销商 |
manufacturer_id | 汽车制造商 |
year_of_birth | 客户出生日期 |
disbursed_date | 贷款日期 |
area_id | 付款区域 |
employee_code_id | 记录付款的对接员工 |
mobileno_flag | 是否填写手机号 |
idcard_flag | 是否填写身份证 |
Driving_flag | 是否出具驾驶证 |
passport_flag | 是否填写护照 |
credit_score | 信用评分 |
main_account_monthly_payment | 主账户月供金额 |
sub_account_monthly_payment | 二级账户的月供金额 |
last_six_month_new_loan_no | 过去六个月客户的新贷款申请数量 |
last_six_month_defaulted_no | 过去六个月客户的违约数量 |
average_age | 平均贷款期限 |
credit_history | 信用记录 |
enquirie_no | 客户查询贷款次数 |
loan_to_asset_ratio | 贷款与资产比例 |
total_account_loan_no | 所有账户申请贷款数量 |
main_account_inactive_loan_no | 主账户申请的无效贷款数量 |
sub_account_inactive_loan_no | 二级账户申请的无效贷款数量 |
total_inactive_loan_no | 所有账户申请的无效贷款数量 |
total_overdue_no | 所有账户的逾期次数 |
total_outstanding_loan | 所有账户的未结余额的总额 |
total_sanction_loan | 来自所有账户的所有贷款被批准的贷款金额 |
total_disbursed_loan | 为所有账户的所有贷款支付的贷款金额 |
total_monthly_payment | 所有账户的月供金额 |
outstanding_disburse_ratio | 已发放贷款总额/未偿还贷款总额(两者比例) |
main_account_tenure | 主账户还款期数 |
sub_account_tenure | 二级账户还款期数 |
disburse_to_sactioned_ratio | 已发放贷款/批准贷款(两者比例) |
active_to_inactive_act_ratio | 有效贷款次数/无效贷款次数(两者比例) |
Credit_level | 信用评分 |
employment_type | 工作类型 |
age | 年龄 |
loan_default | 1表示客户逾期,0表示客户未逾期 |
数据集版权许可协议
GPL2 license
三、解决方案样例
解决方案
项目目标是预测借款人是否会违约(不偿还贷款)。由于车贷业务具有小额分散的特点,风险防控成为关键问题。该模型可以帮助贷款机构识别高风险借款人。本方案实现了一个基于LightGBM算法的车辆贷款违约预测模型。
安装开发库
【本样例运行环境的关键版本信息】
python 3.12.3
lightgbm 3.3.0
导入相关系统库
导入必要的库:pandas, numpy, lightgbm, sklearn等
import pandas as pd
import numpy as np
import lightgbm as lgb
from sklearn.model_selection import KFold
from sklearn.metrics import roc_auc_score
import warnings
warnings.filterwarnings('ignore')
代码结构解析和运行
1、数据准备
读取三个CSV文件:
train.csv
: 训练数据test.csv
: 测试数据sample_submit.csv
: 提交样本格式
train = pd.read_csv('./data/train.csv')
test = pd.read_csv('./data/test.csv')
sample_submit = pd.read_csv('./data/sample_submit.csv')
2、特征工程
all_cols = [f for f in train.columns if f not in ['customer_id', 'loan_default']]
x_train = train[all_cols]
x_test = test[all_cols]
y_train = train['loan_default']
- 提取所有特征列,排除客户ID和目标列(loan_default)
- 将数据分为训练集(x_train, y_train)和测试集(x_test)
3、模型训练
核心是cv_model
函数,实现了5折交叉验证的LightGBM模型训练:
- 参数设置:
boosting_type
: ‘gbdt’ (梯度提升决策树)objective
: ‘binary’ (二分类问题)metric
: ‘auc’ (使用AUC作为评估指标)- 其他重要参数控制模型复杂度、学习率等
- 训练过程:
- 使用KFold将数据分为5份
- 对每一折:
- 创建训练集和验证集
- 使用LightGBM的Dataset格式准备数据
- 训练模型,设置早停机制(200轮不提升则停止)
- 在验证集上预测并计算AUC
- 对测试集预测并平均各折结果
- 评估指标:
- 输出每一折的AUC分数
- 计算平均AUC和标准差
def cv_model(clf, train_x, train_y, test_x, clf_name='lgb'):
folds = 5
seed = 2021
kf = KFold(n_splits=folds, shuffle=True, random_state=seed)
train = np.zeros(train_x.shape[0])
test = np.zeros(test_x.shape[0])
cv_scores = []
for i, (train_index, valid_index) in enumerate(kf.split(train_x, train_y)):
print('\n************************************ Train Dataset Part {} ************************************'.format(str(i+1)))
trn_x, trn_y, val_x, val_y = train_x.iloc[train_index], train_y[train_index], train_x.iloc[valid_index], train_y[valid_index]
train_matrix = clf.Dataset(trn_x, label=trn_y)
valid_matrix = clf.Dataset(val_x, label=val_y)
params = {
'boosting_type': 'gbdt',
'objective': 'binary',
'metric': 'auc',
'min_child_weight': 5,
'num_leaves': 2 ** 7,
'lambda_l2': 10,
'feature_fraction': 0.9,
'bagging_fraction': 0.9,
'bagging_freq': 4,
'learning_rate': 0.01,
'seed': 2021,
'n_jobs':-1,
'verbose': -1,
}
model = clf.train(params, train_matrix, 50000, valid_sets=[train_matrix, valid_matrix], verbose_eval=500,early_stopping_rounds=200)
val_pred = model.predict(val_x, num_iteration=model.best_iteration)
test_pred = model.predict(test_x, num_iteration=model.best_iteration)
train[valid_index] = val_pred
test += test_pred / kf.n_splits
cv_scores.append(roc_auc_score(val_y, val_pred))
print(cv_scores)
print("\n%s_scotrainre_list:" % clf_name, cv_scores)
print("%s_score_mean:" % clf_name, np.mean(cv_scores))
print("%s_score_std:" % clf_name, np.std(cv_scores))
return train, test
训练模型:
lgb_train, lgb_test = cv_model(lgb, x_train, y_train, x_test)
4、预测与输出
- 对测试集预测结果应用阈值(0.25)转换为0/1分类
- 保存预测结果到CSV文件
sample_submit['customer_id'] = test['customer_id']
sample_submit['loan_default'] = lgb_test
sample_submit['loan_default'] = sample_submit['loan_default'].apply(lambda x:1 if x>0.25 else 0).values
sample_submit.to_csv('prediction_result.csv', index=False)
预测结果数据样例展示:
customer_id loan_default
14342 0
94753 0
140283 0
134742 0
4749 0
184730 0
44743 1
27804 0
187134 0
...
模型特点
- 算法选择:
- 使用LightGBM,适合处理表格数据,训练速度快
- 采用梯度提升框架,具有较好的预测性能
- 训练策略:
- 5折交叉验证提高模型稳定性
- 早停机制防止过拟合
- 多折结果平均减少方差
- 性能评估:
- 使用AUC作为主要指标,适合不平衡分类问题
- 平均AUC约0.662,标准差0.005,表现稳定但有一定提升空间
AUC(Area Under the Curve,曲线下面积)是机器学习特别是分类问题中广泛使用的性能评估指标,尤其在二分类问题中应用最为普遍。AUC衡量的是分类器将正类样本排在负类样本前面的概率,其值范围在0.5到1之间:
- 0.5:随机猜测(无区分能力)
- 1:完美分类器
- <0.5:比随机猜测还差(可能标签定义反了)
源码开源协议
GPL-3.0 license
https://github.com/datawhalechina/competition-baseline/blob/master/LICENSE