文章目录
一、逻辑回归的概念
逻辑回归(Logistic回归)又称Logistic回归分析,是机器学习中的一种分类模型,虽然名字中带有回归,但其是用来解决分类问题的。常用于数据挖掘,疾病自动诊断,经济预测等领域。 逻辑回归根据给定的自变量数据集来估计事件的发生概率,由于结果是一个概率,因此因变量的范围在 0 和 1 之间。logistic回归的因变量可以是二分类的,也可以是多分类的,但是二分类的更为常用,也更加容易解释。
二、线性回归和逻辑回归的基本区别:
- 因变量处理方式不同:线性回归中,因变量y处于被解释的特殊地位,由自变量x解释;而逻辑回归中,因变量表示某种事件发生与否的概率,不直接由自变量解释。
- 对应数据类型不同:线性回归自变量和因变量都可以是随机变量,而逻辑回归的因变量是概率,通常取值范围在0和1之间,表示事件发生概率。
- 研究目的和对象不同:线性回归适用于预测因变量的数值结果,可以量化影响大小;而逻辑回归更适用于解决分类问题,如二分类问题中的“是”或“否”。
三、逻辑回归对于二分类任务的数学公式
逻辑回归是一个经典的二分类算法,所以我们在讲解数学公式时以二分类任务为例。说到二分类任务,我们能想到Sigmoid函数,下面我们来介绍一下Sigmoid函数。
1.Sigmoid函数
表达式:
函数图像:
特点:
- 自变量为负无穷到正无穷。
- 值域为(0,1)
- 在逻辑回归中的本质:
将线性回归的结果映射到(0,1)区间上,这样就完成了连续变量到概率的转换。大于阈值(0.5)的类别是1,小于阈值的类别是0。(实质上就是完成了二分类任务)。
下图我们来解释:
这是我在画图软件上画的图,以便帮助大家更好的理解逻辑回归在sigmoid上的映射。
首先我们看到图中分为两块区域:红点所在的区域与绿点所在的区域。此时我们要做的任务就是寻找一条直线将两个区域分隔开来,直线的方程为y=kx+b。
此时我们将坐标轴通过翻转得到下方这一图形,此时横着的坐标轴为y轴,竖着的坐标轴为x轴,接着我们再将sigmoid函数的图像画在坐标轴上。这时我们可以分别在红点和绿点区域找一个X1和X2点,先得到两点的x轴坐标,然后此时将X1和X2点在直线上进行映射,得到y轴坐标,接着通过y轴坐标载映射到sigmoid图像上,此时我们可以发现红点会映射到sigmoid上半部分,也就是(0.5,1)这个区域中,而绿点会映射到(0,0.5)这个区域上。
所以综上所得,这是一个二分类问题。
2.数学公式
(1)线性回归的结果

(2)带入sigmoid函数

(3)对于二分类任务

(4)整合

四、逻辑回归案例
下面我们介绍一下逻辑回归的一个案例。
1.导入库
import pandas as pd
import matplotlib.pyplot as plt
- pandas:用于数据处理和分析。
- matplotlib.pyplot:用于绘制图形,这里主要用于绘制散点图来直观展示数据之间的关系。
2.数据预处理
data = pd.read_csv(r"./creditcard.csv")
print(data.head())#前5行的数据
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler() #实例化 标准化 对象scaler
a = data[['Amount']]
b = data['Amount']
data['Amount'] = scaler.fit_transform(data[['Amount']])
print(data.head()) #打印data这个表格数据的前5行
data = data.drop(['Time'],axis = 1)
- 读取数据:使用pandas库读取creditcard.csv文件。数据集在下方链接中。
- 查看数据:通过data.head()查看数据的前5行。
- 数据标准化:使用StandardScaler对Amount列进行标准化处理,使其符合正态分布。
- data[[‘Amount’]] 返回的是一个 DataFrame(二维结构),而 data[‘Amount’] 返回的是一个 Series(一维结构)。
- data[‘Amount’] = scaler.fit_transform(data[[‘Amount’]]):对 Amount 列进行标准化处理,fit_transform 方法会计算 Amount 列的均值和标准差,并将其转换为标准正态分布(均值为 0,标准差为 1)。转换后的结果会覆盖原始的 Amount 列。
- 删除无用列:删除Time列,因为它对欺诈检测不是很有用。
- 数据集链接: creditcard.csv
3.绘制图形,查看正负样本个数
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei']
mpl.rcParams['axes.unicode_minus'] = False
labels_count = pd.value_counts(data['Class'])
print(labels_count)
plt.title("正负例样本数") #设置标题
plt.xlabel("类别") #设置x轴标题
plt.ylabel("频数") #设置y轴标题
labels_count.plot(kind='bar') #设置图像类型为bar
plt.show()
pylab:matplotlib不能显示中文,借助于pylab实现中文显示。
pd.value_counts:统计data[‘class’]中每类的个数。
kind=‘bar’:设置图像为直方图。
样本个数为:

正负样本数图像展示如下:

4.划分数据集
from sklearn.model_selection import train_test_split
#对原始数据集进行切分
x_whole = data.drop('Class',axis=1)
y_whole = data.Class
x_train_w,x_test_w,y_train_w,y_test_w = \
train_test_split(x_whole,y_whole,test_size = 0.3,random_state=1000)
- train_test_split:对数据集进行划分
- x_whole:删除’Class’这一列。
- axis=1:表示一列,若axis=0表示一行。
- y_whole:保留Class 这一列
- 将数据划分为这四部分:
x_train_w:训练集特征
x_test_w:测试集特征
y_train_w:训练集标签
y_test_w:测试集标签
5.建立模型并训练
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=0.01)
lr.fit(x_train_w,y_train_w)
- LogisticRegression:回归模型
- fit:对模型进行训练
6.预测结果
from sklearn import metrics
train_predicted = lr.predict(x_train_w)
print(metrics.classification_report(y_train_w,train_predicted))
test_predicted = lr.predict(x_test_w)
print(metrics.classification_report(y_test_w,test_predicted))
- metrics:评估模型性能,提供了一系列指标(如准确率、精确率、召回率、F1 分数等)
- train_predicted = lr.predict(x_train_w):对训练集特征进行预测,与训练集标签进行对比。
- test_predicted = lr.predict(x_test_w):对测试集特征进行预测,与测试集标签进行对比。
五、总结

本模型要查看的评估指标为recall(召回率)。由结果发现,模型训练集和测试集上的recall值都不是很高,原因是为什么呢?
我们发现数据集中正负样本个数相差太大,标签为0的样本有284315个,标签为1的样本数仅仅只有492个。这样的数据集我们称为不平衡数据集,它可能导致模型偏向于多数类,从而影响少数类的预测性能。
那么我们该怎么解决这一问题呢?之后的两篇文章我们会采用两种不同方法来解决这类情况。
浙公网安备 33010602011771号