数据挖掘案列分析---LightGBM实战贷款违约预测

news/2024/7/27 7:30:28/文章来源:https://blog.csdn.net/qq_38614074/article/details/136560062

在今天的机器学习时代,各种算法和工具层出不穷,其中LightGBM凭借其出色的性能和速度,在众多机器学习算法中脱颖而出。本次实战项目,将通过一个简单但不简约的案例,展示如何使用LightGBM进行建模,并通过网格搜索进行模型优化。整个流程将包含数据探索性分析(EDA)、建模和模型优化三个主要部分。

一、数据探索性分析(EDA)

首先,我们需要对数据进行探索性分析,以了解数据的分布、特征之间的相关性以及目标变量的趋势。这一步骤对于后续的建模至关重要,因为只有深入了解数据,我们才能选择合适的特征和算法进行建模。

  • 数据加载与预处理
    使用Python的pandas库加载数据,并进行必要的预处理,如缺失值填充、异常值处理等。

  • 数据描述性分析
    通过绘制直方图、箱线图等可视化图表,我们可以直观地了解每个特征的分布情况。同时,计算特征的均值、中位数、标准差等统计量,有助于我们进一步了解数据的整体情况。

  • 特征相关性分析
    利用热力图或相关矩阵,我们可以分析特征之间的相关性。这对于后续的特征选择和模型构建具有重要的指导意义。

二、基于LightGBM的建模

在完成数据探索性分析后,我们将使用LightGBM进行建模。LightGBM是一种基于决策树算法的梯度提升框架,具有高效、快速、准确等优点。

  • 数据划分
    将数据集划分为训练集和测试集,以便在训练模型时评估其性能。

  • 模型训练
    使用LightGBM的API进行模型训练。我们可以调整LightGBM的参数,如学习率、树的数量、叶子节点的最小样本数等,以寻找最佳模型。

  • 模型评估
    通过计算准确率、召回率、F1值等指标,评估模型在测试集上的性能。同时,绘制ROC曲线和AUC值,进一步了解模型的分类性能。

三、基于网格搜索的模型优化

虽然LightGBM具有许多优秀的默认参数,但针对不同的问题和数据集,我们仍然需要调整参数以获得更好的性能。网格搜索是一种常用的参数优化方法,它通过遍历所有可能的参数组合来找到最优参数。

  • 参数空间定义
    根据LightGBM的文档和经验,我们定义一个包含多个参数的参数空间。这些参数可能包括学习率、树的数量、最大深度、叶子节点的最小样本数等。

  • 网格搜索执行
    使用scikit-learn的GridSearchCV函数进行网格搜索。该函数将自动遍历参数空间中的所有组合,并使用交叉验证评估每个组合的性能。最终,它将返回具有最佳性能的参数组合。

  • 最优模型构建与评估
    使用网格搜索找到的最优参数组合构建新的LightGBM模型,并在测试集上进行评估。与之前的模型相比,优化后的模型应该具有更好的性能。

四、基于LIghtGBM的贷款违约预测

实战项目使用的数据集,具体的实现代码如下:

4.1、导入相应的python库
import pandas as pd 
import numpy as np 
pd.set_option('display.max_columns', 100)
from IPython.display import display_htmlimport plotly_express as px 
import plotly.graph_objects as go import matplotlib
import matplotlib.pyplot as plt 
plt.rcParams["font.sans-serif"] = ["SimHei"]    #设置字体
plt.rcParams["axes.unicode_minus"] = False      #解决“-”负号乱码问题
import seaborn as sns 
%matplotlib inlineimport missingno as ms 
import gc from datetime import datetime
from sklearn.model_selection import train_test_split, StartifiedKFold, Gr 
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.decomposition import PCA
from imblearn.under_sampling import ClusterCentroids
from imblearn.over_sampling import KMeansSMOTE, SMOTE 
from sklearn.model_selection import KFold from sklearn.metrics import accuracy_score, recall_score, precision_sco
from sklearn.metrics import roc_auc_score, precision_recall_curve, confu# Classifiers
from sklearn.linear_model import LogisticRegression 
from sklearn.svm import SVC 
from sklearn import tree
from pydotplus import graph_from_dot_data
from sklearn.tree import DecisionTreeClassifier 
from sklearn.ensemble import RandomForestClassifier, AdaBoostClassifier 
from catboost import CatBoostClassifier 
import lightgbm as lgb 
import xgboost as xgb from scipy import statsimport warnings
warnings.filterwarnings("ignore")
4.2 导入数据查看数据情况
df = pd.read_csv("random_data.csv")
df.columns 
# 缺省值情况
df.isnull().sum()
df["History_Default_Times"].value_counts()  # 历史违约次数统计:df["Sex"].value_counts()                    # 男女人数几乎相同,很均衡。  df["Default"].value_counts()                # 目标变量是否违约的人数对比df[df["History_Default_Times"] == 2]        # 需要注意的是:历史违约次数大于0,不代表一定是违约客户。比如历史违约次数为2,最终是否违约的客户两种情况都有。
4.3 数据简单的可视化
# 是否违约的客户收入存在差异:
fig = px.violin(df, x="Default",y="Income")
fig.show()
# 基于seaborn绘制密度图:sns.displot(data=df,x="Income",hue="Default",kind="kde")
plt.show()                                  # 可以看到在低收入和高收入人群中容易发生违约。fig = px.violin(df, x="Default",y="Age")
fig.show()
sns.displot(data=df,x="Age",hue="Default",kind="kde")
plt.show()                                  # 可以看到是是否违约客户的年龄段分布是一致的。
4.4 数据集合切分
#  提取特征和目标变量
X = df.drop(columns="Default")
Y = df["Default"]# 划分训练集和测试集数据
from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
4.5 模型训练
from lightgbm import LGBMClassifiermodel = LGBMClassifier()
model.fit(X_train, y_train)  # 模型训练 
4.6 模型预测
y_pred = model.predict(X_test)
y_pred
4.7 模型评估
### 1、对比测试集中的实际值和预测值:
predict_true = pd.DataFrame()predict_true["预测值"] = list(y_pred)
predict_true["实际值"] = list(y_test)
predict_true# 模型在测试集上的准确率from sklearn.metrics import accuracy_score
accuracy = accuracy_score(y_pred, y_test)
accuracy# ROC-AUC曲线的绘制:
y_pred_proba = model.predict_proba(X_test)
y_pred_proba[:5]from sklearn.metrics import roc_curve  # ROC-AUC曲线
fpr, tpr, thres = roc_curve(y_test, y_pred_proba[:,1])
plt.plot(fpr, tpr)
plt.title("ROC_AUC Curve of Default")
plt.show()# 3、查看具体的AUC值:
from sklearn.metrics import roc_auc_score
score = roc_auc_score(y_test, y_pred_proba[:,1])score
4.8 特征重要度
model.feature_importances_
model.feature_name_features_df = pd.DataFrame({"features": model.feature_name_,"importances": model.feature_importances_})
features_df
4.9 模型调优
# 基于网格搜索的模型调优:
from sklearn.model_selection import GridSearchCV# 设定待搜索的参数及其取值范围:
parameters = {"num_leaves": [10, 15, 13],"n_estimators":[10,20,30],"learning_rate":[0.05,0.1,0.2]}model = LGBMClassifier()  #  基础模型实例化# 定义搜索实例化对象
grid_search = GridSearchCV(model, # 基础模型parameters,  # 搜索参数scoring="roc_auc", # 评价指标cv=5  # 交叉验证5次)grid_search.fit(X_train, y_train)  # 模型训练
4.10 K折交叉验证
import os
import gc
import mathimport pandas as pd
import numpy as npimport lightgbm as lgb
import xgboost as xgb
from catboost import CatBoostRegressor
from sklearn.linear_model import SGDRegressor, LinearRegression, Ridge
from sklearn.preprocessing import MinMaxScalerfrom sklearn.model_selection import StratifiedKFold, KFold
from sklearn.metrics import log_loss
from sklearn.model_selection import train_test_splitfrom tqdm import tqdm
import matplotlib.pyplot as plt
import time
import warnings
warnings.filterwarnings('ignore')def cv_model(clf, train_x, train_y, test_x, seed=2024):# 使用K折交叉验证训练和验证模型folds = 5kf = KFold(n_splits=folds, shuffle=True, random_state=seed)# 初始化oof预测和测试集预测oof = np.zeros(train_x.shape[0])test_predict = np.zeros(test_x.shape[0])cv_scores = []# KFold交叉验证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]# 转换数据为lightgbm数据格式train_matrix = clf.Dataset(trn_x, label=trn_y)valid_matrix = clf.Dataset(val_x, label=val_y)# 定义lightgbm参数params = {'boosting_type': 'gbdt', # GBDT算法为基础'objective': 'multiclass', # 多分类任务'num_class': 4,          # 设置多分类问题的类别个数'num_leaves': 2 ** 5,    # 指定叶子的个数,默认值为31,大会更准,但可能过拟合。最大不能超过2^max_depth# 构建弱学习器,对特征随机采样的比例,默认值为1,可以防止过拟合,每次迭代中随机选择80%的参数来建树'feature_fraction': 0.8,   'bagging_fraction': 0.8, # 每次迭代时用的数据比例,用于加快训练速度和减小过拟合'bagging_freq': 4,   # 表示bagging(采样)的频率,0意味着没有使用bagging ,k意味着每k轮迭代进行一次bagging'learning_rate': 0.025,'seed': seed,# 使用线程数,一般设置成-1,使用所有线程。这个参数用来控制最大并行的线程数,如果你希望取得所有CPU的核,那么你就不用管它。'nthread': 28,  'n_jobs':24, # 使用多少个线性并构造模型'verbose': -1,'lambda_l1': 0.4,   # L1正则化权重项,增加此值将使模型更加保守。'lambda_l2': 0.5,   # L2正则化权重项,增加此值将使模型更加保守# 'device' : 'gpu'}# 使用训练集数据进行模型训练model = clf.train(params, train_set=train_matrix, valid_sets=valid_matrix, num_boost_round=2000, verbose_eval=100, 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) oof[valid_index] = val_predtest_predict += test_pred / kf.n_splits# 计算打印当前折的分数score = np.sqrt(mean_squared_erroe(vale_pred, val_y))cv_scores.apped(score)print(cv_scores)return oof, test_predict
4.11 输出最优的参数,并在最优的参数上进行lightgbm模型的训练
# 输出最佳的参数组合:
dict_params = grid_search.best_params_  dict_params# 基于最佳的参数组合建立新模型:
new_model = LGBMClassifier(num_leaves=10, # 使用最佳参数n_estimators=30,learning_rate=0.05)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1006491.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux基础命令[15]-less

文章目录 1. less 命令说明2. less 命令语法3. less 命令示例3.1 不加参数3.2 -N(显示行号)3.3 打开多个文件3.4 标记导航3.5 搜索内容 4. 总结 1. less 命令说明 less:用来分页查看文件,与 more 相比更加的灵活,并且…

rancher是什么

Rancher Labs是制作Rancher的公司。Rancher Labs成立于2014年,是一家专注于企业级容器管理软件的公司。它的产品设计旨在简化在分布式环境中部署和管理容器的过程,帮助企业轻松地采用容器技术和Kubernetes。Rancher Labs提供的Rancher平台支持Docker容器…

Windows kafka 简单集群搭建

Windows kafka 简单集群搭建 文章目录 Windows kafka 简单集群搭建1.环境说明2.Zookeeper集群搭建2.1 ZooKeeper下载2.2 ZooKeeper安装2.2.1 解压zookeeper-3.4.8.tar.gz2.2.2 进入conf目录下,复制zoo_sample.cfg为zoo.cfg2.2.3 修改zoo.cfg文件2.2.4 生成myid文件2…

定向广播助力西安南绕城高速高新至雁塔段可借用应急车道通行车辆分流诱导

HT-600定向广播助力西安南绕城应急车道分流!定向广播是安装在高速公路上的一种大功率、远程定向传声设备,主要应用与高速公路事故易发段、高速公路分合流处等要害地点。 为了缓解绕城高速潮汐车流拥堵现象,着力服务群众便捷出行,西…

【C++ 学习】内存管理

1. new / delete 和 malloc / free 的区别? malloc / free 和 new / delete 的共同点:都是从堆上申请空间,并且需要用户手动释放。不同的地方是: malloc 和 free 是函数,new 和 delete 是操作符; malloc 申请的空间不…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的障碍物检测系统(深度学习代码+UI界面+训练数据集)

摘要:开发障碍物检测系统对于道路安全性具有关键作用。本篇博客详细介绍了如何运用深度学习构建一个障碍物检测系统,并提供了完整的实现代码。该系统基于强大的YOLOv8算法,并对比了YOLOv7、YOLOv6、YOLOv5,展示了不同模型间的性能…

NBlog整合OSS图库

NBlog部署维护流程记录(持续更新):https://blog.csdn.net/qq_43349112/article/details/136129806 由于项目是fork的,所以我本身并不清楚哪里使用了图床,因此下面就是我熟悉项目期间边做边调整的。 目前已经调整的功能…

深度学习预备知识(线性代数)

介绍: 深度学习是一种机器学习的方法,涉及到大量的线性代数运算。线性代数是研究向量空间和线性映射的数学学科。在深度学习中,线性代数常用于表示和处理输入数据和模型参数。下面是一些深度学习中常见的线性代数概念和运算: 1. …

【DevOps基础篇之k8s】如何通过Kubernetes CKA认证考试

【DevOps基础篇之k8s】如何通过Kubernetes CKA认证考试 目录 【DevOps基础篇之k8s】如何通过Kubernetes CKA认证考试核心概念资源监控生命周期管理Cluster维护安全认证问题排查其他推荐超级课程: Docker快速入门到精通Kubernetes入门到大师通关课这些是我在准备CK

YOLOv5涨点优化:backbone改进 | TransXNet:聚合全局和局部信息的全新CNN-Transformer视觉主干| CVPR2024

💡💡💡本文独家改进:CVPR2024 TransXNet助力检测,代替YOLOv5 Backbone 改进结构图如下: 收录 YOLOv5原创自研 https://blog.csdn.net/m0_63774211/category_12511931.html 💡💡💡全网独家首发创新(原创),适合paper !!! 💡💡💡 2024年计算…

Day31:安全开发-JS应用WebPack打包器第三方库JQuery安装使用安全检测

目录 打包器-WebPack-使用&安全 第三方库-JQuery-使用&安全 思维导图 JS知识点: 功能:登录验证,文件操作,SQL操作,云应用接入,框架开发,打包器使用等 技术:原生开发&…

华为三层交换机:ACL的基本实验

实验要求&#xff1a; PC1不允许访问PC3&#xff0c;PC3可以访问PC1 分析问题&#xff1a; PC1不允许访问PC3&#xff0c;问题中含有“目标地址”则我们需要设置目标地址&#xff0c;这样基本ACL是不行的&#xff0c;必须使用高级ACL [sw1]acl ? INTEGER<2000-2999>…

国家网安教育技术产业融合发展试验区建设专家指导组莅临麒麟信安调研

3月12日下午&#xff0c;由教育部网络安全教学指导委员会秘书长&#xff08;专家组组长&#xff09;封化民、工业和信息化部规划司原司长肖华、中国现代国际关系研究院原副院长张力等领导组成的国家网安教育技术产业融合发展试验区建设专家指导组莅临麒麟信安及湖南欧拉生态创新…

【原创】[新增]ARCGIS之土地报备Txt、征地Xls格式批量导出Por旗舰版

一、软件简介 2024年新增旗舰版软件&#xff0c;本软件全新界面开发&#xff0c;保留原有软件功能及一些使用习惯&#xff0c;并集成了现已有的所有定制格式的支持&#xff0c;并增加自定义格式的导出&#xff1b;做到1N2&#xff08;即为1种通用版本N种定制格式导出txt、Xls&a…

《次神光之觉醒》游戏简单拆解

文章目录 一、 介绍二、 游戏拆解图三、 部分模块拆解1.主界面关卡制放置挂机2.养成升级战斗属性值角色养成装备养成技能养成天赋养成藏品养成契约养成宠物养成挖矿养成 3.副本4.任务5.pvppvp竞技场锦标赛黄金矿工锦标赛公会营地 6.社交游戏圈世界频道好友系统 一、 介绍 《次…

Windows C++ 使用WinAPI实现RPC

demo下载地址&#xff1a;https://download.csdn.net/download/2403_83063732/88958730 1、创建IDL文件以及acf文件&#xff08;创建helloworld.idl helloworld.acf&#xff09; 其中IDL文件&#xff1a; import "oaidl.idl"; import "ocidl.idl"; [ …

Axure原型设计项目效果 全国职业院校技能大赛物联网应用开发赛项项目原型设计题目

目录 前言 一、2022年任务书3效果图 二、2022年任务书5效果图 三、2022年国赛正式赛卷 四、2023年国赛第一套样题 五、2023年国赛第二套样题 六、2023年国赛第三套样题 七、2023年国赛第四套样题 八、2023年国赛第七套样题 九、2023年国赛正式赛题&#xff08;第八套…

MySQL关联查询如何优化

好久不见&#xff0c;关于这篇文章&#xff0c;我也是想了很久&#xff0c;还是决定写一篇文章&#xff0c;有很多同学问过 mysql 相关的问题&#xff0c;其实关联查询如何优化&#xff0c;首先我们要知道关联查询的原理是什么&#xff1f; 左连接 left join SELECT 字段列表…

Go——数组

Golang Array和以往认知的数组有很大的。 数组是同一种数据类型的固定长度的序列。数组定义&#xff1a;var a[len] int&#xff0c;比如&#xff1a;var a [5]int&#xff0c;数组长度必须是常量&#xff0c;且类型的组成部分。一旦定义&#xff0c;长度不能变。长度是数组类…

计算机网络-数据链路层

一、认识以太网 "以太网" 不是⼀种具体的网络&#xff0c;而是一种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理 层的内容。 例如&#xff1a;规定了网络拓扑结构&#xff0c;访问控制方式&#xff0c;传输速率等; 例如&#xff1a;以太网中的网线必须使用…