Advertisement

机器学习——逻辑回归(Logistic Regression)

阅读量:

逻辑回归

本节主要阐述线性回归模型的基本原理及相关数学推导过程。其中,在模型构建阶段(Section~\ref{sec:linear-regression}), 我们将探讨如何通过最小化目标函数来求解参数\mathbf{w}(Equation~\ref{eq:weight-estimation})。具体而言,在损失函数( subsection )框架下, 我们将介绍并对比两种常见的优化方法及其适用场景( subsection )

复制代码
  * 1.2 Sigmoid函数
  * * 1.2.1 Sigmoid函数的原理
* 1.2.2 数学公式解释

1.3 逻辑回归
1.3.1 逻辑回归的基本概念
1.3.2 逻辑回归的工作原理
1.3.3 逻辑回归的数学模型建立过程
1.3.3.1 Sigmoid函数的作用机制
1.3.3.2 条件概率模型
1.3.3.3 似然度计算方法
1.3.3.4 对数似然计算流程
1.3.3.5 参数优化的方法

复制代码
* 1.3.4 逻辑回归的算法流程
* 1.3.5 正则化
* * 1.3.5.1 正则化的数学原理
  * 1.3.5.2 正则化公式推导

* 1.3.6 逻辑回归的优缺点
* 1.3.7 逻辑回归的应用场景

第二部分:代码实现

复制代码
  * 2.4 训练模型
  * 2.5 评估模型

* 三、结果分析
* * 3.1 结果展示
  * 3.2 结果分析

一、理论

logit模型(Logistic Regression)是一种基于Sigmoid函数广义线性回归模型。它通过应用逻辑函数将连续输出值转换为介于0和1之间的概率值,并用于解决二分类问题

1.1 线性回归

1.1.1 线性回归的原理

该种方法是一种基于数理统计中的回归分析技术

1.1.2 线性回归的数学推导
1.1.2.1 模型设定

线性回归模型可以表示为:

\ Y = w_1X_1 + w_2X_2 + ... + w_nX_n + b

其中:

  1. \ Y是因变量;
  2. \ X_1, X_2, ..., X_n是自变量
  3. \ w_1, w_2, ..., w_n是回归系数
  4. \ b是截距项

为了简化表示,我们可以引入一个额外的特征\ X_0=1,并将截距项\ b视为\ w_0,这样模型就可以表示为:

\ Y = w_0X_0 + w_1X_1 + w_2X_2 + ... + w_nX_n

进一步地,我们可以将上式写为矩阵形式:

\ Y = \mathbf{w}^T\mathbf{X}

其中:

  1. \ \mathbf{w} = [w_0, w_1, w_2, ..., w_n]^T
  2. \ \mathbf{X} = [X_0, X_1, X_2, ..., X_n]^T
1.1.2.2 求解参数\ \mathbf{w}

从上述公式可以看出,在线性回归模型中参数\ \mathbf{w}是我们需要求解的核心变量;其中参数\ \mathbf{w}是我们需要求解的核心变量;为了达到这一目的,则采取以下步骤。

1.1.2.2.1 损失函数

在线性回归模型中,默认采用均方误差(Mean Squared Error, MSE)这一指标作为评估标准,在量化预测结果准确性方面具有显著优势。该指标能够有效度量预测值与观测数据之间的偏离程度,并通过其计算结果帮助优化回归模型的参数估计过程。其数学表达式为:

MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2

\ J(\mathbf{w}) = \frac{1}{2m}\sum_{i=1}^{m}(y^{(i)} - \mathbf{w}^T\mathbf{x}^{(i)})^2

其中:

  1. $\ m$ 表示样本数量
  2. \ y^{(i)}\$ 代表第 \ i$ 个实际观测值
  3. \ x^{(i)}\$ 被用来描述第 \ i$ 个样本的特征信息
1.1.2.2.2 优化算法

显而易见的是, 为了使模型能够适应某个特定的数据集, 我们希望损失函数能够达到最低水平时最为理想, 而寻找使得损失函数达到最低水平时所需的参数\ \mathbf{w}则是我们通常采用的方法——梯度下降法(Gradient Descent)。此外, 还有很多其他的优化算法, 其中还包括牛顿法(Newton’s Method)。

梯度下降法(Gradient Descent)

首先,我们需要计算损失函数 \ J(\mathbf{w})关于参数\ \mathbf{w}的梯度。

对于参数 \ \mathbf{w}的第 \ j个分量 \ w_j,其梯度为:

该偏导数表示为:\frac{\partial J(\mathbf{w})}{\partial w_j} 等于 \frac{1}{m} 乘以 summation 对所有样本 i1m 的求和项:(h_{\mathbf{w}}(x^{(i)}) - y^{(i)}) 与 respect 到 \mathbf{w}_j 的 partial gradient of \mathbf{w}^T x^{(i)}

由于
\ \mathbf{w}^T\mathbf{x}^{(i)} = \sum_{k=1}^{n} w_k x_k^{(i)}

其中:

  1. \ n是特征数量

所以:

\ \frac{\partial}{\partial w_j}(\mathbf{w}^T\mathbf{x}^{(i)}) = x_j^{(i)}

因此,梯度为:

\ \nabla J(\mathbf{w}) = \frac{1}{m}\sum_{i=1}^{m}(h_{\mathbf{w}}(x^{(i)}) - y^{(i)})\mathbf{x}^{(i)}

梯度下降法的参数更新公式为:

\ \mathbf{w} := \mathbf{w} - \alpha \nabla J(\mathbf{w})
其中 :

  1. \ \alpha是学习率。

牛顿法(Newton’s Method)

牛顿法是一种二阶优化技术,在机器学习中被广泛采用以加快收敛速度。该方法利用损失函数的第二导数(即Hessian矩阵)来计算更新方向,并通过这一特性实现了更快的收敛过程。

首先,我们需要计算\ J(\mathbf{w})的Hessian矩阵 \ H,其元素为:

\ H_{jk} = \frac{\partial^2 J(\mathbf{w})}{\partial w_j \partial w_k} = \frac{1}{m}\sum_{i=1}^{m}(h_{\mathbf{w}}(x^{(i)}) - y^{(i)})\left(\frac{\partial}{\partial w_j}\mathbf{x}^{(i)}\right)^T\left(\frac{\partial}{\partial w_k}\mathbf{x}^{(i)}\right) + \frac{1}{m}\sum_{i=1}^{m}\mathbf{x}^{(i)}_j\mathbf{x}^{(i)}_k
由于
\ \frac{\partial}{\partial w_j}\mathbf{x}^{(i)} = \mathbf{e}_j
其中:

  1. \ \mathbf(e)_j是第 \ j个分量为 1,其余为 0 的单位向量

所以:

\ H_{jk} = \frac{1}{m}\sum_{i=1}^{m}(h_{\mathbf{w}}(x^{(i)}) - y^{(i)})x_j^{(i)}x_k^{(i)} + \frac{1}{m}\sum_{i=1}^{m}x_j^{(i)}x_k^{(i)}

牛顿法的参数更新公式为:

\ \mathbf{w} := \mathbf{w} - H^{-1}\nabla J(\mathbf{w})

其中 :

  1. \ H^{-1}是Hessian矩阵的逆。
1.1.2.2.3 两个优化算法的对比

梯度下降法是一种简明且实用的优化方法,在处理不同规模的数据集时表现突出。然而,在选择学习率方面较为敏感,并通常需要经过多次迭代才能接近最优解。

牛顿法则以其拥有二阶收敛性的特点,在很多情况下能够以更快的速度达到最优点。然而,在处理大规模数据集时需计算目标函数的二阶导数(即Hessian矩阵),这可能非常耗时;此外,在某些情况下(如当Hessian矩阵不正定时),该方法可能会导致其无法收敛至最优点。

1.2 Sigmoid函数

当我们进行逻辑回归分析时,在线性回归模型的基础上(即我们已经建立了线性回归模型),为了将模型的输出转换为表示事件发生可能性的概率值(即预测某个事件发生的可能性),我们引入了sigmoid函数来实现这一转换。

1.2.1 Sigmoid函数的原理

The sigmoid function, also referred to as the logistic function or a sigmoidal function, is a mathematical function that is capable of mapping any real number to a range between 0 and 1. Within logistic regression, this mathematical tool serves to transform the output of a linear model into a probability value between 0 and 1, thereby enabling us to ascertain whether a given sample belongs to the positive class (for instance, when its label is assigned as 1).

1.2.2 数学公式解释

Sigmoid函数的数学公式为:

\ \sigma(z) = \frac{1}{1 + e^{-z}}

其中:

  1. \ z 是线性模型的输出,即 \ z = \theta^T x
  2. \ \theta 是参数向量,\ x是特征向量

以下是sigmoid函数展示的python代码和sigmoid函数图

复制代码
    import numpy as np
    import matplotlib.pyplot as plt
    
    # 定义sigmoid函数
    def sigmoid(z):
    return 1 / (1 + np.exp(-z))
    
    # 创建一个z值的范围
    z = np.linspace(-10, 10, 500)  # 从-10到10,总共500个点
    
    # 计算对应的sigmoid值
    sigmoid_values = sigmoid(z)
    
    # 绘制图像
    plt.plot(z, sigmoid_values, label='Sigmoid Function')
    
    # 添加标题和标签
    plt.title('Sigmoid Function')
    plt.xlabel('z')
    plt.ylabel('σ(z)')
    
    # 显示图例
    plt.legend()
    
    # 显示图像
    plt.grid(True)
    plt.show()
sigmoid函数

Sigmoid函数特性

  1. \ z 趋于正无穷时,\ e^{-z}趋于0,因此\ \sigma(z) 趋于1。
  2. \ z 趋于负无穷时,\ e^{-z}趋于正无穷,但 \ 1 + e^{-z}也趋于正无穷,因此 \ \sigma(z)趋于0。
  3. \ z = 0时,\ \sigma(z) = 0.5

这些特性使得sigmoid函数特别适合用作逻辑回归的输出函数;这是因为该函数能够将任何实数映射到区间[0,1]内的概率数值

1.3 逻辑回归

1.3.1 逻辑回归的概念

逻辑回归(Logistic Regression)是一种专门用于解决二分类问题的统计学习方法。它通过Sigmoid函数将线性模型的结果转换为概率值,并以此推断出分类结果。

1.3.2 逻辑回归的原理

逻辑回归基于数据遵循伯努利分布这一假设,并利用最大似然估计的方法,在借助梯度下降等优化算法的作用下,计算出参数的具体数值。其输出结果始终保持在0到1之间作为一个概率值来表示样本属于正例的可能性。

1.3.3 逻辑回归的数学推导
1.3.3.1Sigmoid函数

在逻辑回归模型中,我们应用Sigmoid函数(有时也称为logistic function)来将线性模型的输出结果转换为概率值。其数学表达式如下:

\ g(z) = \frac{1}{1 + e^{-z}}

其中:

  1. \ z = \theta^T X\ \theta是参数向量
  2. \ X是特征向量
1.3.3.2 预测函数(或称为条件概率)

逻辑回归的预测函数表示样本为正例的概率,数学表达式为:

\ h_{\theta}(x) = P(y=1|x;\theta) = g(\theta^T x) = \frac{1}{1 + e^{-\theta^T x}}

同样地,样本为负例的概率为:

\ P(y=0|x;\theta) = 1 - h_{\theta}(x)

1.3.3.3 似然函数

在给定的数据集中寻求寻找一组参数 θ,在这些参数的作用下所有样本均被正确分类的概率达到最大值。这一目标可通过求取最大似然函数来实现。其数学表达式为:L(\theta) = \prod_{i=1}^{N} P(y_i|x_i, \theta)

\ L(\theta) = \prod_{i=1}^{m} P(y_i|x_i;\theta)

其中:

  1. \ m 是样本数量
  2. \ y_i是第\ i 个样本的真实标签
  3. \ x_i是第 \ i 个样本的特征向量

\ h_{\theta}(x) 的表达式代入似然函数中,得到:

\ L(\theta) = \prod_{i=1}^{m} [h_{\theta}(x_i)]^{y_i} [1 - h_{\theta}(x_i)]^{1-y_i}

1.3.3.4 对数似然函数

考虑到直接优化该似然函数较为复杂的问题存在,在实际应用中我们通常会选择其对应的对数似然函数来进行优化操作。而对数似然函数的数学表达式则定义为:

\ l(\theta) = \log L(\theta) = \sum_{i=1}^{m} [y_i \log h_{\theta}(x_i) + (1-y_i) \log (1-h_{\theta}(x_i))]

1.3.3.5 梯度下降

为了确定使对数似然函数达到最大值的参数 \ \theta ,我们可以采用梯度下降等优化算法。梯度下降算法通过迭代更新参数 \ \theta 以最小化损失函数(其中损失函数定义为 \ - l(\theta))。

梯度下降算法的参数更新公式为:

\ \theta_j := \theta_j - \alpha \frac{\partial (-l(\theta))}{\partial \theta_j}

其中:

  1. \ \alpha是学习率,控制参数更新的步长。

\ -l(\theta)求偏导,得到:

该损失函数对参数θ_j的偏导数等于负号乘以从i=1到m的求和项中括号内的内容:其中第一部分为y_i乘以h_θ(x_i)的倒数再乘以h_θ对x_i关于θ_j的偏导数;第二部分则为(1−y_i)乘以(1−h_θ(x_i))的倒数再乘以h_θ对x_i关于θ_j的偏导数,并取两者的差值。

由于
\ h_{\theta}(x_i) = g(\theta^T x_i)

基于链式法则,在此基础上我们能够进一步求导出 \frac{\partial h_{\theta}(x_i)}{\partial \theta_j} 的值。

h_{\theta}(x_i)关于\θ_j的偏导数等于对g(θ^Tx_i)关于θ_的偏导数,并且这等于乘积项乘以x_ i ^ j

将上述结果带入梯度下降的参数更新公式后,则可完成θ值的迭代更新,在达到收敛标准时停止运算。

1.3.4 逻辑回归的算法流程

算法过程主要包括以下几个步骤:

  1. 初始化参数\ \theta(可以随机初始化或设为零向量)。
  2. 计算当前参数下每个样本的预测概率\ h_{\theta}(x_i)
  3. 根据预测概率和真实标签计算对数似然函数的值\ l(\theta)
  4. 计算对数似然函数对参数\ \theta 的梯度 \ \frac{\partial (-l(\theta))}{\partial \theta_j}
  5. 使用梯度下降算法更新参数\ \theta
  6. 重复步骤2-5,直到满足收敛条件(如损失函数值的变化小于某个阈值,或达到最大迭代次数等)。
1.3.5 正则化

一种常见的防止过拟合的方法就是应用正则化的技术。这种技术的核心在于在目标函数中加入一个能够限制Model复杂度的惩罚项。其中L1范数与L2范数的组合构成了最常用的两种Regularization方式;这些Regularization策略通常基于不同的概率分布假设;调节Regularization超参数有助于调节Regularization的程度进而优化Model在Complexity与Generalization之间的平衡。

1.3.5.1 正则化的数学原理

正则化的数学原理本质上在于在目标函数(例如损失函数)中加入一个惩罚项以防止过拟合现象的发生。这个惩罚项通常与其形式上常与模型的参数(例如权重系数)的具体数值及其分布特征相关联。具体而言,在深度学习框架中这一过程通常会采用L1范数或L2范数等特定类型的数学度量作为基础构建正则化机制。其主要作用在于约束模型参数的空间范围从而提升算法稳定性并降低对训练数据的高度敏感性。

引入先验信息

从贝叶斯理论的视角看去,在构建模型时引入正则化项等同于注入了先验知识。具体而言,在假设模型参数服从某种特定的概率分布(例如拉普拉斯或高斯)的基础上,在数据集上进行负对数似然估计的结果即可视作一种正则化项的形式。这样一来,则可以通过逐步更新这些初始假设来实现对模型参数的有效约束与优化。

限定参数范围

正则化的主要影响在于约束模型参数的取值范围。采用这种技术措施后,在优化过程中会引入额外的目标函数项(即所谓的正则项),这一做法使得模型参数趋向于接近零或变得更为平滑。其中,在L1范式下参数趋向于零,在L2范式下趋于平滑。这不仅降低了对单一特征的高度依赖性,并且显著提升了模型的整体泛化性能。

奥卡姆剃刀原理

正则化也遵循奥卡姆剃刀原理,在无必要时不应增加实体的概念下文中所指的就是‘如无必要勿增实体’这一原则指导我们对模型进行约束以降低其复杂度具体而言我们可以通过减少模型参数的数量或限定参数的变化范围来实现这一目标从而使得模型结构更加简洁进而有效防止过拟合现象的发生

1.3.5.2 正则化公式推导

L1正则化

L1正则化假设模型参数服从拉普拉斯分布。其公式可以表示为:

\ J_{\text{L1}}(\theta; X, y) = J(\theta; X, y) + \alpha \sum_{i=1}^{n} |w_i|

其中:

  1. \ J(\theta; X, y)是一个核心目标函数(例如损失函数)
  2. \ \alpha是一个正则化参数(用于调节正则化的强度)
  3. \ w_i是模型中的变量(类似于权重系数)

L2正则化

L2正则化假设模型参数服从高斯分布。其公式可以表示为:

\ J_{\text{L2}}(\theta; X, y) = J(\theta; X, y) + \frac{\alpha}{2} \sum_{i=1}^{n} w_i^2

其中:

  1. \ J(\theta; X, y)是原始的目标函数
  2. \ \alpha是正则化参数
  3. \ w_i是模型的参数
1.3.6 逻辑回归的优缺点

优点

  1. 具有良好的可解释性:逻辑回归模型能够提供清晰的特征重要性评估。
  2. 计算效率较高:相比其他算法,在处理高维数据时依然保持较快的运行速度。
  3. 实现较为简便:逻辑回归模型结构简单,在编程实现上非常便捷,并且已有许多成熟的库可供直接调用。
  4. 常用于解决二分类问题:作为机器学习领域中的基础算法之一,在分类任务中有着广泛的应用。
  5. 具有较强的稳定性:相比其他算法,在面对异常数据时表现出较好的鲁棒性。

缺点

  1. 难以有效建模:逻辑回归方法基于线性关系进行建模假设,在面对非线性问题时可能会出现较大误差。
  2. 高度敏感于多重共线性:当模型中的特征变量间存在显著的相关关系时(即高度相关),可能导致参数估计不稳定。
  3. 容易出现欠拟合现象:由于逻辑回归模型具有较强的参数约束能力,在训练数据高度复杂且存在较大噪声的情况下容易导致欠拟合。
  4. 较为敏感于异常值的影响:尽管相比部分其他算法具有一定的鲁棒性但在数据集中存在极端异常值时仍可能会影响预测效果。
  5. 不适合直接应用于多分类场景:虽然可以通过扩展方法将二分类的逻辑回归应用至多分类问题但这种做法本质上属于二分类框架的范畴并不适合作为首选方案用于多分类问题分析。
1.3.7 逻辑回归的应用场景

二分类问题 :逻辑回归常用于解决二分类问题,在实际应用中广泛应用于判断一封邮件是否为垃圾邮件、用户是否会点击特定广告以及肿瘤性质的判断等问题。

风险预估:在金融市场中,逻辑回归被用来预估贷款违约风险及信用评分等指标。基于客户的过往数据, 模型能够预测客户是否会违约。

疾病风险评估 :在医学领域中,基于逻辑回归模型的方法能够计算出患者患某病的风险程度。这些分析通常基于病史数据和症状观察进行,并结合其他相关因素来提高诊断的准确性。

市场营销:在市场营销领域中,逻辑回归分析工具被广泛应用于评估客户的购买意向以及对促销活动的反应情况等关键指标,并以此为基础优化营销策略以实现更好的客户转化效果。

文档分类:在文本挖掘和自然语言处理领域中, 逻辑回归模型被广泛应用于各种文档分类任务中, 包括情感分析任务(正向/负向评价)以及主题识别等多种任务。

电子商务:在电子商务领域中,在线逻辑回归模型可被用来分析并预测潜在客户的行为模式。除了用于预测客户是否会对特定商品产生兴趣外,在线逻辑回归分析还可以被用来预测客户是否会再次访问网站或平台。这种分析方法有助于提升用户体验并促进销售额的增长

社会科学:在社会科学研究领域中, logit模型被用于考察不同变量(如年龄, 性别以及受教育程度等)对某种社会现象(如投票倾向和满意度水平)的影响。

二、代码实现

2.1 导入库

导入所需的库

复制代码
    # 导入库
    import numpy as np
    from sklearn.datasets import load_breast_cancer
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import roc_curve, precision_recall_curve, auc
    import matplotlib.pyplot as plt

2.2 数据准备和划分

逻辑回归是一种用于分类的机器学习算法,在本研究中采用了乳腺癌数据集作为分析对象;因此,在本研究中采用了乳腺癌数据集作为分析对象;随后将该数据集划分为训练集和测试集两部分进行模型训练与评估

复制代码
    # 加载数据集
    cancer = load_breast_cancer()
    X = cancer.data
    y = cancer.target
    
    # 划分数据集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

2.3 添加偏置项

在当前步骤中,在代码块中使用 np.ones 函数生成了一个二维数组(即 shape 为 (n_samples, 1) 的一列全为1的数据)。随后利用 np.hstack 函数将该全1列数组与原始训练数据 X_train 进行横向拼接(即将该全1列作为前缀附加到 X_train 的右侧),从而实现向模型中加入一个全局偏置截距项的目的。这一截距项的作用是当所有输入特征变量均为零时(即 X_test 样本对应的特征全部取零值),模型仍能输出合理的预测结果。同样的,在测试集上也执行了这一操作

复制代码
    # 添加偏置项
    X_train = np.hstack((np.ones((X_train.shape[0], 1)), X_train))
    X_test = np.hstack((np.ones((X_test.shape[0], 1)), X_test))

2.4 初始化参数

n_features :计算了X_train所具有的特征数量(现包含所有新增加的偏置项)。随后生成了一个与上述特征数量等长的零向量 theta。
learning_rate :这是一个优化算法的学习率参数...它决定了每次迭代中参数更新的具体步长大小。
reg_param :此正则化参数用于防止模型出现过拟合现象...它会将theta向量的整体大小或L2范数作为惩罚项加入到损失函数中。
epochs :表示模型在训练过程中完整遍历数据集多少次。每次 epoch 中模型都会遍历整个数据集并使用梯度下降或其他优化算法来更新其参数。

复制代码
    # 初始化参数
    n_features = X_train.shape[1]
    theta = np.zeros(n_features)
    
    # 学习率和正则化参数
    learning_rate = 0.01
    reg_param = 0.1
    epochs = 1000

2.4 逻辑回归的函数

2.4.1 Sigmoid函数

为了限制z的最大值和最小值以避免数值溢出,这边选定了-700,700作为界限。

复制代码
    def sigmoid(z):
    z = np.clip(z,-700,700)
    return 1 / (1 + np.exp(-z))
2.4.2 逻辑回归模型

通过一个单一的数学函数实现逻辑回归中的线性预测,并完成 sigmoid 激活函数的结果计算。这里采用了 NumPy 的矩阵乘法来计算 X 和 theta 的内积运算作为线性预测结果,并最终输出每个样本属于正例的概率值。

复制代码
    # 逻辑回归模型
    def logistic_regression(X, theta):
    z = np.dot(X, theta)
    return sigmoid(z)
2.4.3 损失函数

该函数用于计算逻辑回归模型的成本(也称为损失)函数,并且其包含L2正则化项。

首先根据y的长度计算样本数量m。接着调用logistic_regression函数来计算预测概率h(即样本属于正类的概率)。随后计算未正则化的损失函数cost(交叉熵损失),为了避免在h或1-h接近0时导致的数值不稳定问题,在对数运算前加入1e-15修正项。这个损失函数衡量了预测结果与真实标签之间的差异程度。然后计算L2范数作为正则化项(仅对theta向量中的特征权重元素施加正则化处理),具体方法是先对theta[1:]元素取平方并求和后再乘以(reg_param/(2*m))得到正则化项值。最后求得总损失值(将未正则化的损失cost与正则化项reg_term相加),该总损失将用于后续模型优化过程。

复制代码
    # 损失函数(包括L2正则化)
    def compute_cost(X, y, theta, reg_param):
    m = len(y)
    h = logistic_regression(X, theta)
    cost = (-1 / m) * np.sum(y * np.log(h + 1e-15) + (1 - y) * np.log(1 - h + 1e-15))
    reg_term = (reg_param / (2 * m)) * np.sum(np.square(theta[1:]))  # 不对偏置项进行正则化
    return cost + reg_term
2.4.4 梯度下降

gradient_descent函数 是用于实现逻辑回归的梯度下降算法。

在初始化阶段,在线性回归模型中设置样本数量m作为变量y的数量基础,并定义一个长度为epochs的目标成本数组cost_history 。在此基础上,在线性回归模型中采用批量梯度下降算法对参数向量θ进行优化训练,在每一次迭代过程中都要完成一系列关键步骤:首先使用当前参数向量θ以及输入数据X生成假设函数hθ(x),其次计算预测结果hθ(x)与真实目标变量y之间的差异即误差项error;随后根据误差项error与输入数据X之间的关系求取参数向量θ的方向导数即梯度grad;接着针对模型中的正则化项参数λ应用L2范数惩罚机制生成正则化后的梯度估计量reg_grad;之后将原始估计得到的梯度grad与正则化后的梯度reg_grad按照逐元素相加的方式融合在一起形成最终更新方向;最后根据预设的学习率α对参数向量θ沿着负方向更新步长来进行参数优化操作;在整个训练过程中都需要记录每次迭代所对应的损失函数值并将其存储在预定义的目标成本数组cost_history 中对应索引位置处;当所有迭代操作完成后返回最终优化后的参数向量θ以及完整的成本变化轨迹数组cost_history

复制代码
    # 梯度下降
    def gradient_descent(X, y, theta, learning_rate, reg_param, epochs):
    m = len(y)
    cost_history = np.zeros(epochs)
    
    for it in range(epochs):
        h = logistic_regression(X, theta)
        error = h - y
        grad = (1 / m) * np.dot(X.T, error)
        reg_grad = (reg_param / m) * theta[1:]  # 不对偏置项进行正则化
        grad[1:] += reg_grad
        theta -= learning_rate * grad
        cost_history[it] = compute_cost(X, y, theta, reg_param)
    
    return theta, cost_history

2.4 训练模型

在对训练集输入至模型后完成训练流程,在经过模型参数优化后继续下一步骤,在对测试数据执行预测操作后得到概率值的基础上通过逻辑回归算法生成相应的二元分类结果

复制代码
    # 训练模型
    theta, cost_history = gradient_descent(X_train, y_train, theta, learning_rate, reg_param, epochs)
    
    # 预测概率
    y_pred_prob = logistic_regression(X_test, theta)
    
    # 将预测概率转换为预测标签(假设概率大于0.5为1,否则为0)
    y_pred = (y_pred_prob > 0.5).astype(int)

2.5 评估模型

在完成了所有学习任务之后, 最后对训练好的模型进行了详细的验证与测试, 并在此过程中记录下了准确率等关键指标的具体数值. 此外, 为了全面分析模型的表现, 系统性地绘制并分析了包括损失曲线、ROC曲线下面积以及PR曲线下面积在内的多条关键指标变化趋势图.

复制代码
    # 计算准确率
    accuracy = np.mean(y_pred == y_test)
    print(f"模型在测试集上的准确率为:{accuracy:.4f}")
    
    # 绘制损失曲线
    plt.plot(cost_history)
    plt.xlabel('Epochs')
    plt.ylabel('Cost')
    plt.title('Logistic Regression - Cost History')
    plt.show()
    
    # 绘制ROC曲线
    fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)
    roc_auc = auc(fpr, tpr)
    plt.figure(figsize=(10, 6))
    plt.plot(fpr, tpr, label=f'ROC curve (area = {roc_auc:.2f})')
    plt.plot([0, 1], [0, 1], 'k--', label='Random Guess')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('False Positive Rate')
    plt.ylabel('True Positive Rate')
    plt.title('Receiver Operating Characteristic (ROC) Curve')
    plt.legend(loc="lower right")
    plt.show()
    
    # 绘制PR曲线
    precision, recall, _ = precision_recall_curve(y_test, y_pred_prob)
    pr_auc = auc(recall, precision)
    plt.figure(figsize=(10, 6))
    plt.plot(recall, precision,label=f'PR curve (area = {pr_auc:.2f})')
    plt.xlim([0.0, 1.0])
    plt.ylim([0.0, 1.05])
    plt.xlabel('Recall')
    plt.ylabel('Precision')
    plt.title('Precision-Recall Curves')
    plt.legend(loc="lower left")
    plt.show()

三、结果分析

3.1 结果展示

以下是准确率、损失曲线、ROC曲线、PR曲线结果图。

准确率以及损失曲线
ROC曲线
PR曲线

3.2 结果分析

首先,在‘Logistic Regression - Cost History’图表中可以看出,在训练过程中随着训练次数(即epochs)的增加,训练集的成本逐渐降低这一现象表明模型正在学习数据中的特征并提升性能。而验证集的成本保持稳定且无明显上升趋势这一特点反映出模型未出现过拟合现象,并具有良好的泛化能力。
其次,在测试集上该模型达到了94.74%的准确率这一显著结果表明其在实际应用中表现优异且具备较强的分类能力。
再次,在对比训练集与验证集的成本曲线时可以观察到尽管模型在训练集中表现出色但并未因成本下降而引起验证集成本的相应下降这进一步证明了模型具有良好的稳定性与有效性。
接着,在分析其ROC曲线时可以发现该分类器表现优异因为其ROC曲线几乎紧贴左上角坐标点这意味着当假阳性率(FPR)极低时真阳性率(TPR)也很高这表明所使用的分类器能够有效识别正样本的同时显著减少负样本误报的可能性。
最后,在研究其Precision-Recall曲线时可以发现该曲线从左上方开始随着阈值降低精度逐步下降而召回率也随之提升最终当精度降至0.8水平时召回率同样达到0.8这一平衡点表明分类器在提高误报可能性的同时仍能有效识别80%的真实正样本。此外该Precision-Recall曲线下面积(AUC-PR)为1.00这一理想值充分证明了分类器在不同阈值下的最优性能平衡。

整体而言,该实验结果展示了所训练的逻辑回归模型具有优秀的性能表现和广泛的适用性,在多个数据集上表现出较高的预测准确性。此外,在训练过程中未出现过拟合现象,这证明了模型参数设置及训练策略的有效性。

全部评论 (0)

还没有任何评论哟~