目录
一、逻辑回归简介
逻辑回归的基本原理
线性组合:
Sigmoid函数:
二、实战案例
1.导入数据
2.准备环境
混淆矩阵的基本概念
混淆矩阵的作用
3.加载数据
4.数据预处理
什么是标准化?
标准化的计算公式
划分数据集
5.逻辑回归模型训练与参数选择
召回率的概念
召回率公式:
正则化参数 C
8折交叉验证的概念
在代码中的应用
6.模型评估
7.调整概率阈值
在本文中,我们将探讨如何使用逻辑回归算法来预测银行贷款申请人的违约风险。首先,我们简要介绍逻辑回归的基础知识,然后通过一个具体的例子来展示如何利用Python中的sklearn
库来实现这一过程。
一、逻辑回归简介
逻辑回归是一种广泛应用于二分类问题的统计方法。尽管它的名字中包含“回归”,但它主要用于分类任务,特别是当因变量(目标)只有两种可能的结果时。
逻辑回归的基本原理
线性组合:
首先,逻辑回归通过给定的数据特征计算一个线性组合。如果用数学语言来说,就是使用特征的加权和。例如,如果我们想预测一个人是否会购买某个产品,我们可以考虑年龄、收入等因素,并给这些因素分配权重。
逻辑回归模型的线性组合部分可以表示为:
- z 是线性组合的结果。
- β0 是截距。
- β1,β2,…,βn 是各自变量 x1,x2,…,xn的系数。
- x1,x2,…,xn是输入特征。
-
Sigmoid函数:
- 计算出线性组合之后,逻辑回归会使用一个特殊的函数叫做Sigmoid函数(也称为Logistic函数),将这个线性组合转换成一个介于0到1之间的概率值。Sigmoid函数的形状像一个S形,它的公式是
- 计算出线性组合之后,逻辑回归会使用一个特殊的函数叫做Sigmoid函数(也称为Logistic函数),将这个线性组合转换成一个介于0到1之间的概率值。Sigmoid函数的形状像一个S形,它的公式是
-
决策边界:
- 通过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折交叉验证。以下是具体的:
- 定义模型:创建一个逻辑回归模型实例,并设置参数如
C
值、正则化类型等。 - 执行交叉验证:使用
cross_val_score
函数,传入模型、训练数据x_train
和y_train
、交叉验证的折数cv=8
以及评估指标scoring='recall'
。 - 获取结果:
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))
每个阈值对应的召回率:
以上就是使用逻辑回归进行银行贷款预测的一个完整示例。通过这些步骤,您可以有效地评估申请人的违约风险,并据此做出决策。