一、逻辑回归的概念

逻辑回归(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个。这样的数据集我们称为不平衡数据集,它可能导致模型偏向于多数类,从而影响少数类的预测性能。
那么我们该怎么解决这一问题呢?之后的两篇文章我们会采用两种不同方法来解决这类情况。