本文是数据挖掘比赛入门教程,以车辆贷款违约预测挑战赛为例,演示用LightGBM树模型快速搭建基线。涵盖数据读取与内存优化、EDA分析、特征筛选,通过5折交叉验证训练模型,输出预测结果,还分享进阶思路,助力初学者系统认识比赛并入门。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

本项目作为个比赛的入门教程,将演示如何用树模型快速搭建比赛基线及分享比赛进阶提升思路。希望能够帮助初学者对比赛形成一个系统的认识,更好地入门并在比赛中取得好成绩。
LightGBM是基于XGBoost的一款可以快速并行的树模型框架,内部集成了多种集成学习思路,在代码实现上对XGBoost的节点划分进行了改进,内存占用更低训练速度更快。
LightGBM官网:https://lightgbm.readthedocs.io/en/latest/
参数介绍:https://lightgbm.readthedocs.io/en/latest/Parameters.html
使用介绍:你应该知道的LightGBM各种操作!
使用树模型的优势:树模型是生成规则的利器,能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回归问题。
对于采用表格数据的任务,基本都是决策树模型的主场,像XGBoost和LightGBM这类提升(Boosting)树模型已经成为了现在数据挖掘比赛中的标配。
In [1]# LightGBM的安装# 默认版本!pip install lightgbm# GPU版本,训练更快# !pip install lightgbm --install-option=--gpu
Looking in indexes: https://mirror.baidu.com/pypi/simple/ Requirement already satisfied: lightgbm in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (3.1.1) Requirement already satisfied: numpy in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from lightgbm) (1.16.4) Requirement already satisfied: wheel in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from lightgbm) (0.33.6) Requirement already satisfied: scikit-learn!=0.22.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from lightgbm) (0.22.1) Requirement already satisfied: scipy in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from lightgbm) (1.3.0) Requirement already satisfied: joblib>=0.11 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from scikit-learn!=0.22.0->lightgbm) (0.14.1)
此次以讯飞赛题:车辆贷款违约预测挑战赛为例,并以树模型构建赛题基线模型
赛事地址:http://challenge.xfyun.cn/topic/info?type=car-loan
赛题任务:通过训练集训练模型,来预测测试集中loan_default字段的具体值,即借款人是否会拖欠付款,其中1表示客户逾期,0表示客户未逾期。
运行要求:对配置上无高要求,选择CPU版本即可运行本项目。树模型一般处理特征多或维度高时才会对内存会有一定要求。
Openflow
一键极速绘图,赋能行业工作流
88
查看详情
In [2]
# 解压比赛数据集%cd /home/aistudio/data/data101719/ !unzip data.zip
/home/aistudio/data/data101719 Archive: data.zip inflating: sample_submit.csv inflating: test.csv inflating: train.csvIn [3]
# 导入依赖包import pandas as pdimport numpy as npfrom sklearn.model_selection import KFoldfrom sklearn.metrics import f1_score, roc_auc_scorefrom tqdm import tqdmimport gcimport timeimport lightgbm as lgbimport warnings
warnings.filterwarnings('ignore')
<IPython.core.display.HTML object>In [4]
# 内存优化脚本,避免内存溢出def reduce_mem(df, cols):
start_mem = df.memory_usage().sum() / 1024 ** 2
for col in tqdm(cols):
col_type = df[col].dtypes if col_type != object:
c_min = df[col].min()
c_max = df[col].max() if str(col_type)[:3] == 'int': if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
df[col] = df[col].astype(np.int8) elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
df[col] = df[col].astype(np.int16) elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
df[col] = df[col].astype(np.int32) elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
df[col] = df[col].astype(np.int64) else: if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
df[col] = df[col].astype(np.float16) elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
df[col] = df[col].astype(np.float32) else:
df[col] = df[col].astype(np.float64)
end_mem = df.memory_usage().sum() / 1024 ** 2
print('{:.2f} Mb, {:.2f} Mb ({:.2f} %)'.format(start_mem, end_mem, 100 * (start_mem - end_mem) / start_mem))
gc.collect() return df
In [5]
# 读取比赛数据集train = pd.read_csv('./train.csv') # 训练集test = pd.read_csv('./test.csv') # 测试集# 对数据集进行内存优化train = reduce_mem(train, [f for f in train.columns])
test = reduce_mem(test, [f for f in test.columns])
100%|██████████| 53/53 [00:01<00:00, 42.04it/s] 100%|██████████| 52/52 [00:00<00:00, 559.02it/s]
60.65 Mb, 18.02 Mb (70.28 %) 11.90 Mb, 3.55 Mb (70.19 %)
<br/>In [6]
# 根据赛题要求设置提交结果文件格式:'customer_id', 'loan_default'# 'loan_default'作为要对测试集数据进行预测的标签,1表示客户逾期,0表示客户未逾期。sample_submit = pd.DataFrame(columns=['customer_id', 'loan_default']) sample_submit['customer_id'] = test['customer_id']
全局数据分析:数据的整体情况,包括数据类型、大小、质量等
单变量数据分析:对每个变量进行探索性分析,包括类别变量,连续变量,文本变量等
交叉特征分析:特征与标签的交叉分析以及特征与特征之间的交叉等
训练集、测试集分布分析:训练集和测试集的分布不一致是导致线上和线下不一致的重要原因
参考文章:初学者竞赛学习手册
In [7]# 数据大小概览,可以看出此赛题的字段较多,如何善用好特征是比赛一大难点train.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 150000 entries, 0 to 149999 Data columns (total 53 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 customer_id 150000 non-null int32 1 main_account_loan_no 150000 non-null int16 2 main_account_active_loan_no 150000 non-null int16 3 main_account_overdue_no 150000 non-null int8 4 main_account_outstanding_loan 150000 non-null int32 5 main_account_sanction_loan 150000 non-null int32 6 main_account_disbursed_loan 150000 non-null int32 7 sub_account_loan_no 150000 non-null int8 8 sub_account_active_loan_no 150000 non-null int8 9 sub_account_overdue_no 150000 non-null int8 10 sub_account_outstanding_loan 150000 non-null int32 11 sub_account_sanction_loan 150000 non-null int32 12In [8]sub_account_disbursed_loan 150000 non-null int32 13 disbursed_amount 150000 non-null int32 14 asset_cost 150000 non-null int32 15 branch_id 150000 non-null int8 16 supplier_id 150000 non-null int16 17 manufacturer_id 150000 non-null int8 18 area_id 150000 non-null int8 19 employee_code_id 150000 non-null int16 20 mobileno_flag 150000 non-null int8 21 idcard_flag 150000 non-null int8 22 Driving_flag 150000 non-null int8 23 passport_flag 150000 non-null int8 24 credit_score 150000 non-null int16 25 main_account_monthly_payment 150000 non-null int32 26 sub_account_monthly_payment 150000 non-null int32 27 last_six_month_new_loan_no 150000 non-null int8 28 last_six_month_defaulted_no 150000 non-null int8 29 *erage_age 150000 non-null int8 30 credit_history 150000 non-null int8 31 enquirie_no 150000 non-null int8 32 loan_to_asset_ratio 150000 non-null float16 33 total_account_loan_no 150000 non-null int16 34 sub_account_inactive_loan_no 150000 non-null int16 35 total_inactive_loan_no 150000 non-null int8 36 main_account_inactive_loan_no 150000 non-null int16 37 total_overdue_no 150000 non-null int8 38 total_outstanding_loan 150000 non-null int32 39 total_sanction_loan 150000 non-null int32 40 total_disbursed_loan 150000 non-null int32 41 total_monthly_payment 150000 non-null int32 42 outstanding_disburse_ratio 150000 non-null float64 43 main_account_tenure 150000 non-null int32 44 sub_account_tenure 150000 non-null int32 45 disburse_to_sactioned_ratio 150000 non-null float32 46 active_to_inactive_act_ratio 150000 non-null float16 47 year_of_birth 150000 non-null int16 48 disbursed_date 150000 non-null int16 49 Credit_level 150000 non-null int8 50 employment_type 150000 non-null int8 51 age 150000 non-null int8 52 loan_default 150000 non-null int8 dtypes: float16(2), float32(1), float64(1), int16(10), int32(17), int8(22) memory usage: 18.0 MB
# 确定每个字段中不同的个数,对nunique为1的字段直接删除。train.nunique()
customer_id 150000 main_account_loan_no 104 main_account_active_loan_no 35 main_account_overdue_no 19 main_account_outstanding_loan 48609 main_account_sanction_loan 30564 main_account_disbursed_loan 32862 sub_account_loan_no 36 sub_account_active_loan_no 21 sub_account_overdue_no 8 sub_account_outstanding_loan 2108 sub_account_sanction_loan 1519 sub_account_disbursed_loan 1725 disbursed_amount 19235 asset_cost 38902 branch_id 82 supplier_id 2888 manufacturer_id 10 area_id 22 employee_code_id 3241 mobileno_flag 1 idcard_flag 1 Driving_flag 2 passport_flag 2 credit_score 570 main_account_monthly_payment 21499 sub_account_monthly_payment 1304 last_six_month_new_loan_no 24 last_six_month_defaulted_no 14 *erage_age 100 credit_history 100 enquirie_no 23 loan_to_asset_ratio 1994 total_account_loan_no 103 sub_account_inactive_loan_no 90 total_inactive_loan_no 27 main_account_inactive_loan_no 91 total_overdue_no 19 total_outstanding_loan 49406 total_sanction_loan 31216 total_disbursed_loan 33557 total_monthly_payment 21843 outstanding_disburse_ratio 4391 main_account_tenure 12816 sub_account_tenure 1230 disburse_to_sactioned_ratio 375 active_to_inactive_act_ratio 211 year_of_birth 48 disbursed_date 1 Credit_level 14 employment_type 3 age 48 loan_default 2 dtype: int64
1.特征交互:特征和特征之间组合、特征和特征之间衍生
2.特征编码:one-hot编码、label-encode编码等
3.特征选择:通过对特征重要性及相关性的分析,精简掉无用的特征
特征工程很大程度上是在帮助模型学习,在模型学习不好的地方或者难以学习的地方,采用特征工程的方式帮助其学习,通过人为筛选、人为构建组合特征让模型原本很难学好的东西可以更加容易地进行学习、进而拿到更好的效果。
In [9]# 筛掉无用特征all_cols = [f for f in train.columns if f not in ['customer_id','loan_default','mobileno_flag','idcard_flag','disbursed_date']]
主要演示如何用树模型快速地搭建一个比赛基线模型,在特征工程及模型优化上需要结合具体赛题要求进行针对性地优化。
In [10]# 训练集x_train = train[all_cols]# 训练集标签字段y_train = train['loan_default']# 要进行预测的测试集x_test = test[all_cols]In [11]
# 定义训练和预测函数def train_predict(clf, train_x, train_y, test_x, clf_name='lgb'):
# 5折交叉验证
folds = 5
seed = 2025
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('************************************ {} ************************************'.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_le*es': 2 ** 7, 'lambda_l2': 10, 'feature_fraction': 0.9, 'bagging_fraction': 0.9, 'bagging_freq': 4, 'learning_rate': 0.01, 'seed': 2025, '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("%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)) # 在训练完成后输出feature_importance,输出各特征的重要性
print(pd.DataFrame({ 'column': all_cols, 'importance': model.feature_importance()/5,
}).sort_values(by='importance',ascending=False)) return train, test
In [12]
# 进行模型的训练与预测lgb_train, lgb_test = train_predict(lgb, x_train, y_train, x_test)
************************************ 1 ************************************
Training until validation scores don't improve for 200 rounds
[500] training's auc: 0.757221 valid_1's auc: 0.665608
Early stopping, best iteration is:
[648] training's auc: 0.774819 valid_1's auc: 0.666395
[0.6663954692558639]
************************************ 2 ************************************
Training until validation scores don't improve for 200 rounds
[500] training's auc: 0.756217 valid_1's auc: 0.6646
Early stopping, best iteration is:
[774] training's auc: 0.786664 valid_1's auc: 0.665809
[0.6663954692558639, 0.6658088579217993]
************************************ 3 ************************************
Training until validation scores don't improve for 200 rounds
[500] training's auc: 0.757318 valid_1's auc: 0.664588
[1000] training's auc: 0.809107 valid_1's auc: 0.665196
Early stopping, best iteration is:
[840] training's auc: 0.794933 valid_1's auc: 0.665534
[0.6663954692558639, 0.6658088579217993, 0.6655342821383231]
************************************ 4 ************************************
Training until validation scores don't improve for 200 rounds
[500] training's auc: 0.758371 valid_1's auc: 0.650627
[1000] training's auc: 0.809869 valid_1's auc: 0.652059
Early stopping, best iteration is:
[996] training's auc: 0.809559 valid_1's auc: 0.652149
[0.6663954692558639, 0.6658088579217993, 0.6655342821383231, 0.652148910391985]
************************************ 5 ************************************
Training until validation scores don't improve for 200 rounds
[500] training's auc: 0.757135 valid_1's auc: 0.662366
Early stopping, best iteration is:
[692] training's auc: 0.779432 valid_1's auc: 0.662648
[0.6663954692558639, 0.6658088579217993, 0.6655342821383231, 0.652148910391985, 0.662648392749281]
lgb_scotrainre_list: [0.6663954692558639, 0.6658088579217993, 0.6655342821383231, 0.652148910391985, 0.662648392749281]
lgb_score_mean: 0.6625071824914504
lgb_score_std: 0.005338481209206612
column importance
18 employee_code_id 1421.0
15 supplier_id 1374.6
14 branch_id 1341.0
29 loan_to_asset_ratio 1307.0
12 disbursed_amount 1150.2
13 asset_cost 1089.6
44 year_of_birth 995.4
21 credit_score 781.6
17 area_id 760.6
39 outstanding_disburse_ratio 635.6
27 credit_history 565.6
40 main_account_tenure 560.8
26 *erage_age 560.8
22 main_account_monthly_payment 445.8
16 manufacturer_id 434.6
38 total_monthly_payment 371.6
3 main_account_outstanding_loan 339.4
43 active_to_inactive_act_ratio 304.6
35 total_outstanding_loan 264.8
36 total_sanction_loan 233.0
46 employment_type 228.6
4 main_account_sanction_loan 213.2
37 total_disbursed_loan 205.6
28 enquirie_no 188.8
5 main_account_disbursed_loan 182.2
31 sub_account_inactive_loan_no 155.4
0 main_account_loan_no 155.4
25 last_six_month_defaulted_no 155.2
30 total_account_loan_no 152.6
42 disburse_to_sactioned_ratio 141.6
33 main_account_inactive_loan_no 134.4
1 main_account_active_loan_no 126.4
2 main_account_overdue_no 126.4
24 last_six_month_new_loan_no 122.8
47 age 117.6
34 total_overdue_no 87.4
45 Credit_level 53.4
19 Driving_flag 27.0
23 sub_account_monthly_payment 12.4
41 sub_account_tenure 12.4
6 sub_account_loan_no 10.8
9 sub_account_outstanding_loan 8.0
20 passport_flag 7.0
32 total_inactive_loan_no 5.6
10 sub_account_sanction_loan 5.6
11 sub_account_disbursed_loan 3.0
8 sub_account_overdue_no 0.2
7 sub_account_active_loan_no 0.2
In [13]
# 保存预测结果文件sample_submit['loan_default'] = lgb_test# 注意由于赛题要求输出的为0或1,故需要对预测结果进行一定的转换。此处设置大于0.25为1,小于或等于0.25则为0。sample_submit['loan_default'] = sample_submit['loan_default'].apply(lambda x:1 if x>0.25 else 0).values# 保存结果文件sample_submit.to_csv('result.csv', index=False)
以上就是【数据挖掘入门】使用树模型快速搭建比赛基线模型及进阶分享的详细内容,更多请关注其它相关文章!
# 更快
# seo代码培训
# 秦皇岛抖音网站推广优势
# 回归模型网站建设海报图
# 买衬衫关键词搜索排名
# 调查问卷网站建设素材
# 任城区营销推广招聘
# 机车店营销推广方法
# seo舆论处理招聘
# 太原seo优化哪家便宜
# 网络推广营销公司seo推广公司
# 都是
# 如何用
# 内存优化
# 为例
# python
# 中文网
# 官网
# 数据挖掘
# 一言
# 进阶
# play.ht
# type
# whee
# udio
# tome
# red
# cos
# 内存占用
# ai
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
优化推广96088 】
【
技术知识133117 】
【
IDC资讯59369 】
【
网络运营7196 】
【
IT资讯61894 】
相关推荐:
智能电网技术:提高能源效率和可靠性
华为云发布华为云盘古模型3.0和升腾AI云服务,亮点亮相2025华为开发者大会
聚焦WAIC|AI技术支撑大模型探索未来
2025 世界人工智能大会闭幕,32 个重大产业签约总额达 288 亿元
磐镭发布全新 GeForce RTX 4080 ARMOUR 显卡,售价为 9499 元
助力人工智能产业高质量发展 龙岗区算法训练基地正式启用
“五年内人类程序员将消失”预言引争议,AI真的那么强大了吗?
昇腾AI大模型训推一体化解决方案将在WAIC发布
视觉中国推出AI灵感绘图功能,付费后可在“合法合规前提下使用”
电池比 Air 2S 大 20%,大疆 Air 3 无人机现身 FCC
谷歌推出 SAIF 框架,倡导安全环境下探索和发展人工智能
有远见!华为四年前注册商标Vision Pro:苹果AR国内要改名
郭帆导演成功利用AI技术制作的《流浪地球3》预告片在央视热播,引发巨大反响
人形机器人打开精密齿轮市场全新空间!受益上市公司梳理
“上海市民营企业人工智能赋能创新中心”揭牌成立
马斯克回应“人工智能让一切变得更好”:我们已经是半机器人了
无需照相馆,AI证件照生成软件即将推出
Meta开源文本生成音乐大模型,我们用《七里香》歌词试了下
“可用”“有用”的讯飞星火认知大模型将亮相世界人工智能大会
国内AI大模型“安卓时刻”到来!阿里云通义千问免费、开源、可商用
国内首款大尺寸仿鸵双足机器人“大圣”亮相,穿戴红色战袍
时隔 4 年:谷歌更新安卓机器人 LOGO,形象更立体
日媒关注中国推进鸟类识别 AI 普及,除监测保护外还可预防传染性疾病
科学家称,面对人工智能,人类未来或只有灭亡与虚拟永生两个选择
微软AR/VR专利提出使用时间复用谐振驱动产生双极性电源
上海发布“元宇宙关键技术攻关行动方案”,加快 AIGC 等突破
美图第二届影像节发布七款AI影像创作工具
人工智能在服务优化方面优缺点有哪些
优化系统韧性:故障恢复与监控在RabbitMQ中的应用
0代码微调大模型火了,只需5步,成本低至150块
看懂AI,找到增长新势能 | 笔记侠AI峰会等你来
【|直播|预告】人工智能高峰论坛将于7月2日13:30准时开播!
首届亚太网络法实务大会召开 九位大咖探讨元宇宙与人工智能发展
周星驰支持的人工智能与 Web3 初创公司 Moonbox 完成 100 万美元融资
IBM和NASA合作发布可追踪碳排放的开源AI基础模型
传Meta 2025年推出首款AR眼镜,采用军用级别材料,计划生产1000台
人形机器人概念大热!这些产业链标的或受提振
以计算机视觉技术为基础的库存管理如何改革零售行业
加州用AI监测野火:1032个摄像头联网扫描森林异常
农业产业升级:AI驱动的“崃·见田”开启农田未来展望
一文读懂自动驾驶的激光雷达与视觉融合感知
OpenAI 静默关闭 AI 文本检测工具,准确率仅为 26%
选对AI智能写作软件,让创作游刃有余!
联想举办2025创新开放日,展出260余项算力及AI产品技术
写出优质文章的妙招:利用"稿见AI助手"的实用指南
生成式人工智能如何改变云安全的游戏规则
跑不动的元宇宙,虚拟世界比现实更冷酷
人工智能如何与智能家居集成
机构研选 | 虚拟电厂是电力物联网升级版 智能电网望迎来高速发展
谷歌计划在上海举办开发者大会,重点关注机器学习和生成式AI领域
2025-07-30
运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。