机器学习 之 使用逻辑回归 进行银行贷款预测(请帮忙点点赞谢谢,这对我很重要)

news2024/11/15 1:45:31

目录

一、逻辑回归简介

逻辑回归的基本原理

线性组合:

Sigmoid函数:

二、实战案例

 1.导入数据

 2.准备环境

混淆矩阵的基本概念

混淆矩阵的作用

3.加载数据

4.数据预处理

什么是标准化?

标准化的计算公式

划分数据集

5.逻辑回归模型训练与参数选择

召回率的概念

召回率公式: 

正则化参数 C

8折交叉验证的概念

在代码中的应用

6.模型评估

7.调整概率阈值


在本文中,我们将探讨如何使用逻辑回归算法来预测银行贷款申请人的违约风险。首先,我们简要介绍逻辑回归的基础知识,然后通过一个具体的例子来展示如何利用Python中的sklearn库来实现这一过程。

一、逻辑回归简介

逻辑回归是一种广泛应用于二分类问题的统计方法。尽管它的名字中包含“回归”,但它主要用于分类任务,特别是当因变量(目标)只有两种可能的结果时。

逻辑回归的基本原理

线性组合

首先,逻辑回归通过给定的数据特征计算一个线性组合。如果用数学语言来说,就是使用特征的加权和。例如,如果我们想预测一个人是否会购买某个产品,我们可以考虑年龄、收入等因素,并给这些因素分配权重。
逻辑回归模型的线性组合部分可以表示为:

  • z 是线性组合的结果。
  • β0​ 是截距。
  • β1,β2,…,βn​ 是各自变量 x1,x2,…,xn的系数。
  • x1,x2,…,xn是输入特征。
  1. Sigmoid函数

    • 计算出线性组合之后,逻辑回归会使用一个特殊的函数叫做Sigmoid函数(也称为Logistic函数),将这个线性组合转换成一个介于0到1之间的概率值。Sigmoid函数的形状像一个S形,它的公式是 

  2. 决策边界

    • 通过Sigmoid函数得到的概率值,我们可以设定一个阈值(通常是0.5),如果预测的概率大于这个阈值,我们就认为样本属于正类(比如“买”),否则就认为它属于负类(比如“不买”)。

二、实战案例

 1.导入数据

导入一份进行脱敏处理过后的银行贷款数据

现在让我们通过一个具体的例子来应用逻辑回归解决银行贷款预测问题。在这个例子中,我们将使用一个假设的信用卡欺诈数据集,该数据集包含了客户的财务记录和是否欺诈的信息。

 2.准备环境

首先,我们需要导入所需的库。

# 导入库
import pandas as pd  # 用于数据处理和分析的库
import matplotlib.pyplot as plt  # 用于绘制图表的库
from pylab import mpl  # 用于设置matplotlib的字体,以支持中文显示
import numpy as np  # 用于数值计算的库

并定义一些辅助函数。

def cm_plot(y, yp):
    #confusion_matrix函数会计算出TP、TN、FP、FN的值,并将它们组织成一个矩阵。
    from sklearn.metrics import confusion_matrix  # 导入混淆矩阵计算函数
    import matplotlib.pyplot as plt  # 导入绘图库

    # 计算混淆矩阵
    cm = confusion_matrix(y, yp)

    # 使用matshow绘制混淆矩阵
    plt.matshow(cm, cmap=plt.cm.Blues)
    plt.colorbar()  # 显示颜色条

    # 在混淆矩阵中添加数值标签
    for x in range(len(cm)):
        for y in range(len(cm)):
            plt.annotate(cm[x, y], xy=(y, x), horizontalalignment='center',
                         verticalalignment='center')

    # 设置坐标轴标签
    plt.ylabel('True label')  # 真实标签
    plt.xlabel('Predicted label')  # 预测标签

    # 返回绘制好的图像
    return plt
混淆矩阵的基本概念

假设有一个二分类问题,目标是将样本分为两个类:“正类”和“负类”。在混淆矩阵中,行代表实际的类别,而列代表预测的类别。因此,混淆矩阵有四个基本组成部分:

  • 真正例(True Positive, TP): 实际为正例并且被正确分类为正例的数量。
  • 真负例(True Negative, TN): 实际为负例并且被正确分类为负例的数量。
  • 假正例(False Positive, FP): 实际为负例但被错误分类为正例的数量(也称为第一类错误)。
  • 假负例(False Negative, FN): 实际为正例但被错误分类为负例的数量(也称为第二类错误)。
混淆矩阵的作用

混淆矩阵是一种表格形式的工具,它帮助我们评估逻辑回归这类分类器在区分不同类别时的表现。通过四个关键的数字——真正例、假正例、假负例和真负例——混淆矩阵清晰地展示了分类器的预测结果与实际情况之间的对比。这样一来,我们就能了解到逻辑回归模型在哪些方面表现良好,在哪些方面还有待改进。

3.加载数据

接下来,加载数据并进行初步探索。

data = pd.read_csv(r'creditcard.csv')  # 读取银行贷款数据集
data.head()  # 显示数据集的前几行

4.数据预处理

设置matplotlib字体以便正确显示中文,并绘制类别分布图

# 设置matplotlib字体
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 设置字体为微软雅黑
mpl.rcParams['axes.unicode_minus'] = False  # 设置坐标轴显示负号时不使用Unicode字符

# 绘制类别分布
labels_count = pd.value_counts(data['Class'])  # 统计每个类别的数量
plt.title('正负例样本数')  # 设置图表标题
plt.xlabel('类别')  # 设置x轴标签
plt.ylabel('频数')  # 设置y轴标签
labels_count.plot(kind='bar')  # 绘制条形图
plt.show()  # 显示图表

绘图结果为:

接下来进行数据预处理,包括标准收入列和移除时间列。

# 数据预处理 - 标准化收入
from sklearn.preprocessing import StandardScaler  # 导入标准化库

# 实例化标准化器
scaler = StandardScaler()
a = data[['Amount']]  # 选择'Amount'列
data['Amount'] = scaler.fit_transform(data[['Amount']])  # 标准化'Amount'列

# 移除时间列
data = data.drop(['Time'], axis=1)  # 移除'Time'列
什么是标准化?

标准化(Standardization)是一种常见的数据预处理技术,主要用于将特征缩放到具有相同尺度的范围内,以消除特征之间量纲的影响。简单来说,标准化的目标是让数据的分布接近标准正态分布,即均值为0,标准差为1。

标准化的计算公式

对于某个特征(比如'Amount'列),标准化的计算公式如下:

其中:

  • x 是原始数据点。
  • μ 是所有数据点的平均值(均值)。
  • σ 是所有数据点的标准差。
  • z 是经过标准化处理后的数据点。

划分数据集

将数据集分为训练集和测试集。

# 划分数据集为训练集和测试集
# 导入数据分割和交叉验证库
from sklearn.model_selection import train_test_split, cross_val_score 

# 定义特征和目标变量
x = data.drop('Class', axis=1)  # 特征变量(自变量)
y = data.Class  # 目标变量(因变量)

# 分割数据
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0) 

 分割后的数据:

5.逻辑回归模型训练与参数选择

通过交叉验证选择最佳的正则化参数C。

# 通过交叉验证选择最佳C参数
for i in c_param_range:
    # 实例化逻辑回归模型
    lr = LogisticRegression(C=i, penalty='l2', solver='lbfgs', max_iter=1000)
    #遍历c_param_range中的每个C值,创建一个逻辑回归模型实例lr,设置模型的C参数为当前循环中的值,正则化类型为'l2'(岭回归),优化算法为'lbfgs'(有限内存拟牛顿法),最大迭代次数为1000次。

    # 使用8折交叉验证计算平均召回率
    score = cross_val_score(lr, x_train, y_train, cv=8, scoring='recall')

    # 计算平均召回率
    score_mean = sum(score) / len(score)

    # 添加平均召回率到列表
    scores.append(score_mean)

    # 输出平均召回率
    print(score_mean)

# 找出最佳C参数
best_c = c_param_range[np.argmax(scores)]  # 找到最佳的C参数

# 使用最佳C参数训练逻辑回归模型
lr = LogisticRegression(C=best_c, penalty='l2', max_iter=1000)
lr.fit(x_train, y_train)  # 训练模型

平均召回率和最佳c参数:

召回率的概念

召回率(Recall)是一种衡量分类器正确识别出所有实际正例的能力的指标。

  • 正例:实际为真的案例(比如实际有病的人)。
  • 负例:实际为假的案例(比如实际上没有病的人)。
  • 真阳性 (TP):模型预测为正例并且实际也为正例的样本数。
  • 假阴性 (FN):模型预测为负例但实际为正例的样本数。
召回率公式: 

  • 如果召回率高,意味着模型能够识别出大部分的实际正例。
  • 如果召回率低,则表明模型错过了很多实际的正例。
正则化参数 C

  • 含义C 参数决定了模型对过拟合的容忍程度。较大的 C 值会让模型更加关注训练数据的细节,较小的 C 值会让模型更加简化,避免过度关注训练数据的细节。
8折交叉验证的概念

8折交叉验证是一种评估模型性能的方法,其主要思想是将数据集分成8个相等的部分(称为“折”),然后使用其中7个部分作为训练数据,剩下的1个部分作为验证数据,重复这个过程8次,每次使用不同的那一部分作为验证数据。

在代码中的应用

在给定的代码中,我们使用 cross_val_score 函数来进行8折交叉验证。以下是具体的:

  1. 定义模型:创建一个逻辑回归模型实例,并设置参数如 C 值、正则化类型等。
  2. 执行交叉验证:使用 cross_val_score 函数,传入模型、训练数据 x_train 和 y_train、交叉验证的折数 cv=8 以及评估指标 scoring='recall'
  3. 获取结果cross_val_score 函数会返回一个数组,包含了每次交叉验证的结果(即每次验证数据上的召回率)。

6.模型评估

评估模型在训练集和测试集上的性能。

# 模型评估 - 训练集
from sklearn import metrics  # 导入评估指标库

# 预测训练集
train_predicted = lr.predict(x_train)

# 打印训练集分类报告
print(metrics.classification_report(y_train, train_predicted))

# 绘制混淆矩阵
cm_plot(y_train, train_predicted).show()

# 模型评估 - 测试集
# 预测测试集
test_predicted = lr.predict(x_test)

# 打印测试集分类报告
print(metrics.classification_report(y_test, test_predicted))

训练集分类报告:                                       测试集分类报告:

训练集分类报告:                                              测试集分类报告:

 

7.调整概率阈值

通过调整概率阈值来优化模型的召回率。

# 调整概率阈值
recalls = []
thresholds = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]  # 不同的阈值

# 循环遍历不同的阈值
for i in thresholds:
    # 获取预测概率
    y_predict_proba = lr.predict_proba(x_test)

    # 将预测概率转换为DataFrame
    y_predict_proba = pd.DataFrame(y_predict_proba)

    # 删除第0列
    y_predict_proba = y_predict_proba.drop([0], axis=1)

    # 根据阈值将概率转换为预测标签
    y_predict_proba[y_predict_proba > i] = 1
    y_predict_proba[y_predict_proba <= i] = 0

    # 计算召回率
    recall = metrics.recall_score(y_test, y_predict_proba[1])

    # 添加召回率到列表
    recalls.append(recall)

    # 输出每个阈值对应的召回率
    print("{} Recall metric in the testing dataset: {:.3f}".format(i, recall))

每个阈值对应的召回率: 

以上就是使用逻辑回归进行银行贷款预测的一个完整示例。通过这些步骤,您可以有效地评估申请人的违约风险,并据此做出决策。

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

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

相关文章

19.缓存的认识和基本使用

缓存介绍 缓存是数据交换的缓冲区Cache&#xff0c;是临时存储数据的地方&#xff0c;一般读写性能较高。 数据库的缓存就是建立索引。 缓存的作用 1.降低后端负载。 2.提高读写效率&#xff0c;降低响应时间。 缓存的问题 1.保证数据的一致性。 2.增加代码维护成本。解…

Kafka运行机制(二):消息确认,消息日志的存储和回收

前置知识 Kafka基本概念https://blog.csdn.net/dxh9231028/article/details/141270920?spm1001.2014.3001.5501Kafka运行机制&#xff08;一&#xff09;&#xff1a;Kafka集群启动&#xff0c;controller选举&#xff0c;生产消费流程https://blog.csdn.net/dxh9231028/arti…

Qt 0816作业

一、思维导图 二、将day1做的登录界面升级优化【资源文件的添加】 三、在登录界面的登录取消按钮进行一下设置 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到…

C++ | Leetcode C++题解之第350题两个数组的交集II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {sort(nums1.begin(), nums1.end());sort(nums2.begin(), nums2.end());int length1 nums1.size(), length2 nums2…

函数递归VS操作符深入?

1>>前言 函数递归函数递归&#xff0c;当小白听到这样的词会感到无比陌生&#xff0c;请不要惊慌&#xff0c;这是正常的&#xff0c;以至于都不是很经常用到&#xff0c;但是它的算法&#xff0c;它的思想是值得我们深入思考的。还有一些复杂操作符&#xff0c;如按位与…

【原创】java+swing+mysql共享充电宝管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

PyTorch之TensorBoard使用

接回上一篇&#xff1a;PyTorch深度学习框架-CSDN博客 在学习这篇之前建议先按照上一篇搭建好整个PyTorch环境 然后这一篇讲怎么用TensorBoard&#xff0c;这个玩意是Tensorflow官方推出的一个可视化工具&#xff0c;当使用Tensorflow训练大量深层的神经网络时&#xff0c;我们…

全局锁、表级锁、行级锁

锁的作用和特点 WHY&#xff1a;锁的出现是为了解决并发场景下不同用户同时对共享资源进行操作&#xff0c;而可能引发的并发问题。 HOW&#xff1a;控制不同线程对资源访问的规则。 全局锁 顾名思义&#xff0c;全局锁就是对整个数据库实例加锁。一般在进行全库备份的时候…

prometheus + grafana + 告警

配置环境 准备三台主机&#xff0c;将三台主机的信息分别写入/etc/hosts文件中 192.168.100.115 server.example.com server 192.168.100.116 agent1.example.com agent1 192.168.100.117 grafana.example.com grafana [rootserver ~]# cat /etc/hosts 127.0.0.1 localhos…

【MySQL 08】内置函数 (带思维导图)

文章目录 &#x1f308; 一、日期函数⭐ 1. 常见日期函数⭐ 2. 日期函数使用示例⭐ 3. 日期函数综合案例 &#x1f308; 二、字符串函数⭐ 1. 常见字符串函数⭐ 2. 字符串函数使用示例⭐ 3. 字符串函数综合案例 &#x1f308; 三、数值函数⭐ 1. 常见数值函数⭐ 2. 数值函数使用…

探索GitHub的无限可能:从注册到Linux环境下的库分支链接

在这个数字化时代&#xff0c;GitHub已成为开发者们不可或缺的宝藏库。无论你是编程新手还是资深开发者&#xff0c;GitHub都能为你打开一扇通往无限创意与协作的大门。今天&#xff0c;就让我们一起踏上这段探索之旅&#xff0c;从GitHub的注册开始&#xff0c;再到如何在Linu…

google transalte api的使用,V2服务账户方式(google-cloud-java)

Google Cloud Translation API 有几个不同的使用方式&#xff0c;其中之一是使用最新的 Google Cloud Client Library。这些库提供了简化的 API&#xff0c;使得与 Google Cloud 服务的交互变得更加容易。 对于gcp平台的创建方式&#xff0c;我记得得绑定真信用卡了&#xff0c…

Debug-021-el-table实现分页多选的效果(切换分页,仍可以保持前一页的选中效果)

前情提要&#xff1a; 这个功能实现很久了&#xff0c;但是一直没有留意如何实现&#xff0c;今天想分享一下。具体就是我们展示table数据的时候&#xff0c;表格中的数据多数情况是分页展示&#xff0c;毕竟数据量太多&#xff0c;分页的确是有必要的。那么我们有业务需要给表…

portswigger的Exploiting DOM clobbering to enable XSS

目录 尝试一下看看可不可以XSS DOM破坏 查看源码确定DOM破坏漏洞点以及代码分析 首先查看/resources/labheader/js/labHeader.js&#xff0c;没有什么作用 然后domPurify这东西是一个过滤框架也没啥子用 看/resources/js/loadCommentsWithDomClobbering.js尝试分析代码(对…

使用Poi-tl对word模板生成动态报告

一、pom依赖问题&#xff1a; <dependency> <groupId>com.deepoove</groupId> <artifactId>poi-tl</artifactId> <version>1.12.2</version> </dependency> 使用 poi-tl 的 1.12.2版本&#xff0c;如果使用了poi依赖&#x…

【编程之路:在 Bug 的迷宫中寻找出口】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Mysql-linux通过rpm安装、linux离线安装mysql

新建用户 useradd mysql passwd mysqlmysql用户增加sudo权限 Linux-创建用户、给普通用户sudo权限、设置不需要密码执行sudo 卸载旧版本软件包 卸载mariadb --查询mariadb版本 rpm -qa|grep mariadb --控制台输出 mariadb-libs-5.5.68-1.el7.x86_64 --执行卸载 sudo rpm -…

系规学习第13天

1、规划设计的主要目的不包括() A、设计满足业务需求的IT服务 B、设计SLA、测量方法和指标。 C、设计服务过程及其控制方 D、设计实施规划所需要的进度管理过程 [答案] D [解析]本题考察的是规划设计的目的&#xff0c;建议掌握。 (1)设计满足业务需求的IT服务。 (2)设…

Python计算机视觉 第1章-基本的图像操作和处理

Python计算机视觉 第1章-基本的图像操作和处理 本章讲解操作和处理图像的基础知识&#xff0c;将通过大量示例介绍处理图像所需的Python工具包&#xff0c;并介绍用于读取图像、图像转换和缩放、计算导数、画图和保存结果等的基本工具。 1.1 PIL&#xff1a;Python图像处理类…

零基础学习Redis(4) -- 常用数据结构介绍

我们之前提到过&#xff0c;redis中key只能是字符串类型&#xff0c;而value有多种类型。 redis中的数据结构有自己独特的实现方式能根据特定的场景进行优化 1. string(字符串) 内部编码&#xff1a; raw&#xff1a;最基本的字符串&#xff0c;类比我们平常使用的Stringin…