机器学习:基于AdaBoost算法模型对信用卡是否违约进行识别

news2024/11/19 15:29:08

在这里插入图片描述

系列文章目录

作者:i阿极

作者简介:数据分析领域优质创作者、多项比赛获奖者:博主个人首页

😊😊😊如果觉得文章不错或能帮助到你学习,可以点赞👍收藏📁评论📒+关注哦!👍👍👍

📜📜📜如果有小伙伴需要数据集和学习交流,文章下方有交流学习区!一起学习进步!💪


大家好,我i阿极。喜欢本专栏的小伙伴,请多多支持

专栏案例:机器学习案例
机器学习(一):线性回归之最小二乘法
机器学习(二):线性回归之梯度下降法
机器学习(三):基于线性回归对波士顿房价预测
机器学习(四):基于KNN算法对鸢尾花类别进行分类预测
机器学习(五):基于KNN模型对高炉发电量进行回归预测分析
机器学习(六):基于高斯贝叶斯对面部皮肤进行预测分析
机器学习(七):基于多项式贝叶斯对蘑菇毒性分类预测分析
机器学习(八):基于PCA对人脸识别数据降维并建立KNN模型检验
机器学习(十四):基于逻辑回归对超市销售活动预测分析
机器学习(十五):基于神经网络对用户评论情感分析预测
机器学习(十六):线性回归分析女性身高与体重之间的关系
机器学习(十七):基于支持向量机(SVM)进行人脸识别预测
机器学习(十八):基于逻辑回归对优惠券使用情况预测分析
机器学习(十九):基于逻辑回归对某银行客户违约预测分析
机器学习(二十):LightGBM算法原理(附案例实战)
机器学习(二十一):基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测
机器学习(二十二):基于逻辑回归(Logistic Regression)对股票客户流失预测分析

文章目录

  • 系列文章目录
  • 1、AdaBoost基本原理
  • 2、实验环境
  • 3、AdaBoost函数语法
  • 4、案例实战——信用卡是否违约的识别
    • 4.1导入数据
    • 4.2绘制饼图查看是否违约的客户比例
    • 4.3拆分为训练集和测试集
    • 4.4构建Adaboost模型并预测
    • 4.5返回模型的预测结果
    • 4.6计算客户违约的概率值,用于生成ROC曲线的数据
    • 4.7查看自变量的重要性排序
    • 4.8取出重要性比较高的自变量建模
    • 4.9通过网格搜索法选择提升树的合理参数组合
    • 4.10使用最佳的参数组合构建AdaBoost模型
    • 4.11计算正例的预测概率,用于生成ROC曲线的数据


1、AdaBoost基本原理

AdaBoost是一种通过改变训练样本权重来学习多个弱分类器并线性组合成强分类器的Boosting算法。一般来说,Boosting方法要解答两个关键问题:

  • 一是在训练过程中如何改变训练样本的权重或者概率分布
  • 二是如何将多个弱分类器组合成一个强分类器。

针对这两个问题,AdaBoost的做法非常朴素:

  • 一是提高前一轮被弱分类器分类错误的样本的权重,而降低分类正确的样本的权重
  • 二是对多个弱分类器进行线性组合,提高分类效果好的弱分类器的权重,降低分类误差率高的弱分类器的权重。

给定训练集
在这里插入图片描述
其中
在这里插入图片描述
AdaBoost训练算法如下:
(1) 初始化训练数据样本的权重分布,即为每个训练样本分配一个初始权重:
在这里插入图片描述
(2) 对于t = 1,2,3,…,T,分别执行以下步骤:
(a) 对包含权重分布 D t D_t Dt的训练集进行训练并得到弱分类器 G t ( x ) G_t(x) Gt(x)。 
(b) 计算 G t ( x ) G_t(x) Gt(x)在当前加权训练集上的分类误差率:

ϵ t = P ( G t ( x i ) ≠ y i ) = ∑ i = 1 N w t i I ( G t ( x i ) ≠ y i ) \epsilon_t=P\left(G_t\left(x_i\right) \neq y_i\right)=\sum_{i=1}^N w_{t i} I\left(G_t\left(x_i\right) \neq y_i\right) ϵt=P(Gt(xi)=yi)=i=1NwtiI(Gt(xi)=yi)

(c )根据分类误差率计算当前弱分类器的权重系数 α t \alpha_t αt

α t = 1 2 log ⁡ 1 − ϵ t ϵ t \alpha_t=\frac{1}{2} \log \frac{1-\epsilon_t}{\epsilon_t} αt=21logϵt1ϵt

(d) 调整训练集的权重分布:
在这里插入图片描述

其中 Z t Z_t Zt为归一化因子, Z t = ∑ i = 1 N w i exp ⁡ ( − α t y i G t ( x i ) ) Z_t=\sum_{i=1}^N w_i \exp \left(-\alpha_t y_i G_t\left(x_i\right)\right) Zt=i=1Nwiexp(αtyiGt(xi))

(3) 最后构建 T T T个弱分类器的线性组合:
在这里插入图片描述
最终的强分类器可以写为:
在这里插入图片描述

根据 α t = 1 2 log ⁡ 1 − ϵ t ϵ t \alpha_t=\frac{1}{2} \log \frac{1-\epsilon_t}{\epsilon_t} αt=21logϵt1ϵt的弱分类器权重系数计算过程中,当弱分类器的分类误差率 ϵ t ⩽ 1 2 \epsilon_t \leqslant \frac{1}{2} ϵt21时, 0 ⩽ α t 0 \leqslant\alpha_t 0αt,且 α t \alpha_t αt随着 ϵ t \epsilon_t ϵt的减小而变大,这也正是弱分类器权重系数计算公式的设计思想,它能够使得分类误差率较低的分类器有较大的权重系数。

根据
在这里插入图片描述
训练样本权重分布可以写为:
在这里插入图片描述
当样本被弱分类器正确分类时,它的权重变小;当样本被弱分类器错误分类时,它的权重变大。相比之外,错误分类样本的权重增大了 e 2 α t \mathrm{e}^{2 \alpha_t} e2αt倍,这就使得在下一轮训练中,算法将更加关注这些误分类的样本。

以上就是AdaBoost算法的基本原理。可以看到,算法步骤非常直观易懂,巧妙的算法设计能够非常好地回答Boosting方法的两个关键问题。上述关于AdaBoost的理解可以视为该模型的经典版本。

2、实验环境

Python 3.9

Anaconda

Jupyter Notebook

3、AdaBoost函数语法

AdaBoostClassifier分类器

AdaBoostClassifier(base_estimator=None, n_estimators=50, 
                       learning_rate=1.0, algorithm='SAMME.R', random_state=None)

AdaBoostClassifier回归器

AdaBoostRegressor(base_estimator=None, n_estimators=50, 
                  learning_rate=1.0, loss='linear', random_state=None)
  • base_estimator:用于指定提升算法所应用的基础分类器,默认为分类决策树(CART),也可以是其他基础分类器,但分类器必须支持带样本权重的学习,如神经网络。
  • n_estimators:用于指定基础分类器的数量,默认为50个,当模型在训练数据集中得到完美的拟合后,可以提前结束算法,不一定非得构建完指定个数的基础分类器。
  • learning_rate:用于指定模型迭代的学习率或步长,即对应的提升模型F(x)可以表示为F(x)=F_m−1(x)+υα_mf_m(x),其中的υ就是该参数的指定值,默认值为1;对于较小的学习率υ而言,则需要迭代更多次的基础分类器,通常情况下需要利用交叉验证法确定合理的基础分类器个数和学习率。
  • algorithm:用于指定AdaBoostClassifier分类器的算法,默认为’SAMME.R’,也可以使用’SAMME’;使用’SAMME.R’时,基础模型必须能够计算类别的概率值;一般而言,'SAMME.R’算法相比于’SAMME’算法,收敛更快、误差更小、迭代数量更少。
  • loss:用于指定AdaBoostRegressor回归提升树的损失函数,可以是’linear’,表示使用线性损失函数;也可以是’square’,表示使用平方损失函数;还可以是’exponential’,表示使用指数损失函数;该参数的默认值为’linear’。
  • random_state:用于指定随机数生成器的种子。

4、案例实战——信用卡是否违约的识别

4.1导入数据

# 导入第三方包
import pandas as pd
import matplotlib.pyplot as plt

# 读入数据
default = pd.read_excel(r'D:\CSDN\machine learning\default of credit card.xls')

4.2绘制饼图查看是否违约的客户比例

plt.axes(aspect = 'equal')
# 中文乱码和坐标轴负号的处理
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False
# 统计客户是否违约的频数
counts = default.y.value_counts()
# 绘制饼图
plt.pie(x = counts, # 绘图数据
        labels=pd.Series(counts.index).map({0:'不违约',1:'违约'}), # 添加文字标签
        autopct='%.1f%%' # 设置百分比的格式,这里保留一位小数
       )
# 显示图形
plt.show()

在这里插入图片描述

4.3拆分为训练集和测试集

# 导入第三方包
from sklearn import model_selection
from sklearn import ensemble
from sklearn import metrics

# 排除数据集中的ID变量和因变量,剩余的数据用作自变量X
X = default.drop(['ID','y'], axis = 1)
y = default.y
# 数据拆分
X_train,X_test,y_train,y_test = model_selection.train_test_split(X,y,test_size = 0.25, random_state = 1234)

使用train_test_split函数将数据集拆分为训练集和测试集。其中,参数X和y分别表示自变量和因变量,test_size表示测试集的比例(此处设置为0.25,即25%),random_state用于控制数据集的随机拆分,确保结果可重复。

4.4构建Adaboost模型并预测

# 构建AdaBoost算法的类
AdaBoost1 = ensemble.AdaBoostClassifier()
# 算法在训练数据集上的拟合
AdaBoost1.fit(X_train,y_train)
# 算法在测试数据集上的预测
pred1 = AdaBoost1.predict(X_test)

4.5返回模型的预测结果

# 返回模型的预测效果
print('模型的准确率为:\n',metrics.accuracy_score(y_test, pred1))
print('模型的评估报告:\n',metrics.classification_report(y_test, pred1))

在这里插入图片描述

4.6计算客户违约的概率值,用于生成ROC曲线的数据

y_score = AdaBoost1.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加对角线
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x轴与y轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
plt.show()

在这里插入图片描述

4.7查看自变量的重要性排序

importance = pd.Series(AdaBoost1.feature_importances_, index = X.columns)
importance.sort_values().plot(kind = 'barh')
plt.show()

在这里插入图片描述

4.8取出重要性比较高的自变量建模

predictors = list(importance[importance>0.02].index)
predictors

# 通过网格搜索法选择基础模型所对应的合理参数组合
# 导入第三方包
from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeClassifier

max_depth = [3,4,5,6]
params1 = {'base_estimator__max_depth':max_depth}
base_model = GridSearchCV(estimator = ensemble.AdaBoostClassifier(base_estimator = DecisionTreeClassifier()),
                          param_grid= params1, scoring = 'roc_auc', cv = 5, n_jobs = 4, verbose = 1)
base_model.fit(X_train[predictors],y_train)
# 返回参数的最佳组合和对应AUC值
base_model.best_params_, base_model.best_score_

在这里插入图片描述

4.9通过网格搜索法选择提升树的合理参数组合

# 导入第三方包
from sklearn.model_selection import GridSearchCV

n_estimators = [100,200,300]
learning_rate = [0.01,0.05,0.1,0.2]
params2 = {'n_estimators':n_estimators,'learning_rate':learning_rate}
adaboost = GridSearchCV(estimator = ensemble.AdaBoostClassifier(base_estimator = DecisionTreeClassifier(max_depth = 3)),
                        param_grid= params2, scoring = 'roc_auc', cv = 5, n_jobs = 4, verbose = 1)
adaboost.fit(X_train[predictors] ,y_train)
# 返回参数的最佳组合和对应AUC值
adaboost.best_params_, adaboost.best_score_

在这里插入图片描述

4.10使用最佳的参数组合构建AdaBoost模型

AdaBoost2 = ensemble.AdaBoostClassifier(base_estimator = DecisionTreeClassifier(max_depth = 3),
                                       n_estimators = 300, learning_rate = 0.01)
# 算法在训练数据集上的拟合
AdaBoost2.fit(X_train[predictors],y_train)
# 算法在测试数据集上的预测
pred2 = AdaBoost2.predict(X_test[predictors])

# 返回模型的预测效果
print('模型的准确率为:\n',metrics.accuracy_score(y_test, pred2))
print('模型的评估报告:\n',metrics.classification_report(y_test, pred2))

在这里插入图片描述

4.11计算正例的预测概率,用于生成ROC曲线的数据

y_score = AdaBoost2.predict_proba(X_test[predictors])[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加对角线
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x轴与y轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
plt.show()

在这里插入图片描述


📢文章下方有交流学习区!一起学习进步!💪💪💪
📢首发CSDN博客,创作不易,如果觉得文章不错,可以点赞👍收藏📁评论📒
📢你的支持和鼓励是我创作的动力❗❗❗

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码开发重要工具:jvs-form(表单引擎)2.1.7功能清单及新增功能介绍

jvs-form 2.1.7 版本功能清单 在低代码开发平台中,表单是用于收集和编辑数据的页面。它通常用于创建、更新或查看单个记录的详细信息。 jvs-form是jvs快速开发平台的8大引擎的其中之一,它的特点: 与动态模型联动,支持动态的调整…

Python心经(6)

目录 callable super type()获取对应类型 isinstance判断对象是否是某个类或者子类的实例 issubclass,判断对象是不是类的子孙类 python3的异常处理 反射: 心经第三节和第五节都写了些面向对象的,这一节补充一…

黑苹果 或者 Mac 因 mds资源占用过高,导致频繁死机

开机后不久,风扇狂转,温度升高,然后死机,关机。 1. 使用 “Apple 诊断”测试 Mac 先看看硬件层面是否有问题。 使用“Apple 诊断”测试 Mac。 这款 Mac 的处理器是 Intel ,开启 Mac,然后在 Mac 启动时立…

java的File

一、File (一)新建File对象 File对象表示一个路径,可以是文件路径,也可以是文件夹路径;这个路径可以是存在的,也可以是不存在的。 File类常见的构造方法: 例如: 注意:因…

母线差动保护(一)

与其他的主设备保护相比,母线保护的要求更为苛刻。当变电站母线发生故障时,如不及时切除故障,将会损坏众多电力设备,破坏系统的稳定性,甚至导致电力系统瓦解。如果母线保护拒动,也会造成大面积的停电。因此…

微服务外网部署灵活配置方案(不改代码适配apm和日志中心)

1.综述 之前微服务在进行部署时,有关日志中心和apm相关的配置都是放在代码相应的配置文件中的。 日志中心: /src/main/resources/logback-spring.xml /PIPELINE/docker/flume/hosts apm: /PIPELINE/docker/apm/apm_agent_dev.config /PIPELINE/docker/apm/ap…

TensorFlowLite 声音识别

开发 添加tensorflow的核心依赖 implementation org.tensorflow:tensorflow-lite-task-audio:0.4.0将训练模型放到main/assets文件夹下 在build.gradle中配置 因为打包时tflite文件可能会被压缩,所以需要配置如下 buildFeatures {viewBinding true}androidResources {noComp…

2023 开放原子全球开源峰会高峰论坛成功举办

6 月 11 日,以 “开源赋能,普惠未来” 为主题的 2023 开放原子全球开源峰会高峰论坛在北京成功举办。工业和信息化部相关司局、北京市经济和信息化局、北京经济技术开发区管理委员会相关领导出席并致辞。 北京市经济和信息化局副局长王磊在致辞中表示&am…

4、5类LSA案例

拓扑 需求 实现PC1和PC3互联互通 配置步骤 1)配置接口信息 - 配置PC的IP地址 - 配置路由器的接口 2)配置OSPF单区域 - 创建ospf进程,定义router-id - 指定相应区域 - 宣告网段进入ospf 3)配置OSPF多区域 4) R6配置去往PC3的静…

Matlab论文插图绘制模板第103期—分组散点图

在之前的文章中,分享了Matlab散点图的绘制模板: 进一步,再来分享一下分组散点图的绘制模板。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请自行下载。有需要的朋友可以…

【裸机开发】按键输入实验

目录 一、硬件原理分析 二、寄存器分析 1、时钟源初始化 2、设置 IO 复用 3、初始化 IO 复用引脚(设置电气属性) 4、初始化GPIO 三、汇编代码(start.s) 四、公共头文件(imx6u.h) 四、C 代码编写 …

【6.13 代随_56day】 两个字符串的删除操作、编辑距离

两个字符串的删除操作、编辑距离 两个字符串的删除操作1.方法图解步骤代码 编辑距离1.方法图解步骤代码 两个字符串的删除操作 力扣连接:583. 两个字符串的删除操作(中等) 1.方法 确定递推公式 当word1[i - 1] 与 word2[j - 1]相同的时候 …

STL之list

目录 list模拟实现一. list的基本框架二. list_node类1.构造函数2.其他函数 三. 迭代器(iterator)1.结构2. 构造函数3. 运算符重载operator-> 四.反向迭代器1.结构2.构造函数3.运算符重载 五. list常用方法及实现1. 默认构造函数a.empty_init 2.迭代器…

8. WebGPU 平移变换

我们将开始编写与顶点缓冲区文章中的示例类似的代码,但这次将绘制单个 F 而不是一堆圆,并使用索引缓冲区来保持数据更小。 让我们在像素空间而不是裁剪空间中工作,就像 Canvas 2D API 我们将制作一个 F,将从 6 个三角形构建它 …

啥?PCB拼版对SMT组装有影响!

PCB为什么要拼版? 拼版主要是为了满足生产的需求,有些PCB板太小,不满足做夹具的要求,所以需要拼在一起进行生产。 拼版也可以提高SMT贴片的焊接效率,如只需要过一次SMT,即可完成多块PCB的焊接。 同时也可…

你知道ai绘画工具都有哪些吗?ai画图的软件分享给你

大家好!你有没有想过,如果我们能有一种神奇的工具,可以帮助我们实现想象中的绘画作品,该有多好呢?现在,随着人工智能的发展,我们可以借助ai绘画工具来探索艺术的奇妙世界了!不过你是…

又双叕搞事?我拿着这份“满级”的JVM笔记,拼进了阿里

JVM JVM,一个熟悉又陌生的名词,从认识Java的第一天起,我们就会听到这个名字,在参加工作的前一两年,面试的时候还会经常被问到JDK,JRE,JVM这三者的区别。 JVM(Java Virtual Machine…

汽车IVI中控开发中视频相关的一些知识点

前言: 视频最早的渊源来源于电视。做汽车仪表/IVI中控,尤其是IVI信息娱乐部分,都要涉及到视频这个知识点,各种概念很多,首先需要明确一条主线,那就是SDTV标清电视->HDTV高清电视->UHDTV超高清电视的一个发展脉络,BT601/656是SDTV标清电视接口,BT1120则对应HDTV高…

ShardingSphere

一、基本概念 1、什么是ShardingSphere 1、一套开源的分布式数据库中间件解决方案 2、有三个产品:Sharding-JDBC和Sharding-Proxy、Sharding-Sidecar 3、定位为关系型数据库中间件,合理在分布式环境下使用关系型数据库操作 2、分库分表 1什么是分库…

文物和古建筑防雷综合解决方案

文物和古建筑作为珍贵的历史遗产,需要受到专业的防雷保护,以保持其完整性和安全性。本文将介绍详细的文物和古建筑防雷方案和措施,包括避雷针安装、接地系统建设、监测技术和定期维护等。 引言: 文物和古建筑承载着珍贵的历史记忆…