【经典算法】从0到1吃透逻辑回归:原理、实现与应用 - 教程
目录
五、逻辑回归的实现步骤(以 Python 和 scikit - learn 库为例)
一、逻辑回归是什么

1.1 定义
逻辑回归(Logistic Regression)是一种广泛应用于分类和预测分析的统计模型 ,别看它名字里有 “回归”,但它却是个实实在在的分类模型。它的主要作用是根据给定的自变量数据集来估算事件发生的概率。比如说,在预测明天是否会下雨这个问题上,我们可以把今天的湿度、温度、气压等作为自变量,通过逻辑回归模型来计算明天下雨的概率。在这种情况下,结果(明天下雨或不下雨)就是一个分类变量,而逻辑回归就是用来处理这种分类问题的有力工具。
在逻辑回归中,我们会对几率(即成功概率除以失败概率)应用 logit 变换,这个变换通常也称为对数几率或几率的自然对数。用数学公式来表示的话,逻辑函数为:
\(Logit(π)=\frac{1}{1 + exp( - π)}\)
\(ln(\frac{π}{1 - π}) = β_0 + β_1 * X_1 + … + β_k * X_k\)
在这个逻辑回归方程里,\(logit(π)\) 是因变量或响应变量,\(X\) 是自变量。模型中的\(β\)参数或系数,通常是通过最大似然估计(MLE)来进行估算的。最大似然估计的方法就像是在玩一个 “猜数字” 的游戏,它通过多次迭代测试不同的\(β\)值,不断地去尝试,直到找到那个能让对数几率达到最佳拟合的值。就好像我们要找到一把最适合的钥匙来打开锁,需要不断地尝试不同的钥匙,直到找到那把能打开锁的正确钥匙一样。当我们找到了最佳系数(如果存在多个自变量,那就会有多个系数),就可以计算、记录每个观测值的条件概率并将它们相加,从而产生预测概率。对于二元分类来说,如果预测概率小于 0.5,我们就预测结果为 0;如果大于 0.5,就预测结果为 1 。比如在预测一场足球比赛 A 队是否能获胜时,如果逻辑回归模型计算出 A 队获胜的概率是 0.6,那么我们就会预测 A 队会赢得这场比赛。
1.2 与线性回归的区别
虽然逻辑回归和线性回归听起来名字很相似,它们也都是数据科学中常用的模型,在 Python 和 R 等开源工具的帮助下,它们的计算都变得快速而简单。但它们之间存在着一些关键的区别。
线性回归主要是用于识别连续因变量与一个或多个自变量之间的关系。比如说,我们想要预测房价,房价就是连续的因变量,而房子的面积、房龄、周边配套设施等就是自变量。当只有一个自变量和一个因变量时,这就是简单线性回归;但如果自变量的数量增加,那就变成了多元线性回归。对于线性回归,我们通常会试图通过一组数据点绘制一条最佳拟合线,这条拟合线就像是一条 “趋势线”,它能帮助我们直观地看到数据之间的关系,拟合线通常使用最小二乘法来计算。简单来说,最小二乘法就是要找到一条直线,使得所有数据点到这条直线的距离的平方和最小。这就好像我们要在一群散点中画出一条最能代表这些点分布趋势的线,让这些点尽可能地靠近这条线。
而逻辑回归虽然也用于估计因变量与一个或多个自变量之间的关系,但它主要是用于对分类变量进行预测,像判断一封邮件是垃圾邮件还是正常邮件、一个客户是否会购买产品等这些问题。它的输出不是一个连续的数值,而是一个概率值,这个概率值介于 0 和 1 之间,通过一个阈值(通常是 0.5)来将概率转换为分类结果。另外,逻辑回归通过 logit 函数将 S 曲线转换为直线,这和线性回归的线性关系是不同的。比如说,线性回归就像是在一条平坦的道路上行驶,沿着直线前进;而逻辑回归则像是先在一条弯曲的道路(S 曲线)上行驶,然后通过 logit 函数把它 “拉直”,变成一条更容易理解和分析的直线。
从样本量的需求来看,线性回归通常不需要那么大的样本量,而逻辑回归需要足够的样本来表示所有响应类别的值。因为如果样本量不足,逻辑回归模型可能就没有足够的 “信息” 来准确地学习到不同类别之间的特征和差异,从而导致模型无法有效地检测出显著效应。这就好比我们要了解一个城市的居民喜好,如果只调查了几个人,那我们得到的结果肯定不能代表整个城市居民的喜好,样本量越大,我们得到的结果就越能反映真实情况 。
二、逻辑回归的类型
2.1 二元逻辑回归
二元逻辑回归是逻辑回归中最常用的一种类型 ,它的因变量只有两种可能的结果,通常用 0 和 1 来表示,也可以理解为 “是” 与 “否”“真” 与 “假”。比如说,在预测一封邮件是否为垃圾邮件时,我们就可以使用二元逻辑回归模型。模型会根据邮件的各种特征,像发件人、邮件主题、邮件内容中出现的关键词等自变量,来计算这封邮件是垃圾邮件的概率。如果计算出的概率大于 0.5,我们就可以预测这封邮件是垃圾邮件(标记为 1);如果概率小于 0.5,就预测这封邮件不是垃圾邮件(标记为 0)。在医学领域,判断一个肿瘤是良性还是恶性,也是二元逻辑回归的常见应用场景。通过患者的各项检查指标,如肿瘤大小、形状、边界清晰度等自变量,模型可以预测肿瘤为恶性的概率,从而帮助医生做出初步的诊断。
2.2 多元逻辑回归
多元逻辑回归适用于因变量有三个或更多无序结果的情况。举个例子,电影制片厂想要了解电影观众可能喜欢哪种类型的电影,以便更有针对性地进行电影宣传和推广。电影类型有很多种,像动作片、爱情片、科幻片、喜剧片等等,这些电影类型之间并没有特定的顺序关系 。此时,我们就可以使用多元逻辑回归模型。模型会考虑观众的年龄、性别、职业、收入水平等自变量,来预测观众对不同类型电影的喜好概率。比如,通过模型计算,可能会得出一位 25 岁的男性观众,喜欢动作片的概率是 0.4,喜欢爱情片的概率是 0.2,喜欢科幻片的概率是 0.3,喜欢喜剧片的概率是 0.1。这样电影制片厂就可以根据这些概率,针对不同特征的观众群体,制定相应的电影宣传策略,提高电影的票房收益。在市场调研中,当我们想要了解消费者对不同品牌的偏好时,也可以运用多元逻辑回归。例如,消费者在选择手机品牌时,可能会在苹果、华为、小米、三星等多个品牌之间进行选择,通过分析消费者的年龄、收入、消费习惯等因素,多元逻辑回归模型可以帮助我们预测消费者选择不同品牌手机的概率,为手机厂商制定市场策略提供有力的支持。
2.3 有序逻辑回归
有序逻辑回归用于因变量有三个或更多有序结果的情况。常见的例子就是各种评分量表,比如从 1 到 5 的满意度评分,1 代表非常不满意,2 代表不满意,3 代表一般,4 代表满意,5 代表非常满意,这里的评分是有顺序的 。在教育领域,评估学生的成绩等级时,也会用到有序逻辑回归。比如将学生的成绩划分为不及格、及格、中等、良好、优秀五个等级,通过分析学生的平时表现、作业完成情况、考试成绩等自变量,有序逻辑回归模型可以预测每个学生处于不同成绩等级的概率。又比如在电商平台上,消费者对商品的评价通常分为差评、中评、好评三个等级,这也是有序的。电商平台可以利用有序逻辑回归,根据商品的价格、质量、物流速度、售后服务等因素,来预测消费者给出不同评价等级的概率,从而帮助商家改进商品和服务,提高消费者的满意度。
三、逻辑回归的原理与公式推导
3.1 逻辑函数(sigmoid 函数)
在深入理解逻辑回归之前,我们先来认识一下它的核心 —— 逻辑函数,也就是常说的 sigmoid 函数 。sigmoid 函数的公式为:
\(σ(z)=\frac{1}{1 + e^{-z}}\)
其中,\(e\)是自然常数,约等于 2.71828,\(z\)则是输入值 。这个函数最大的特点就是它的图像呈现出独特的 S 形曲线。当我们把不同的\(z\)值代入函数中,会发现无论\(z\)是多大的正数或负数,输出值始终在 0 到 1 这个区间内。比如说,当\(z = 0\)时,\(σ(0)=\frac{1}{1 + e^{-0}} = 0.5\);当\(z\)趋向于正无穷时,\(e^{-z}\)趋向于 0,\(σ(z)\)就趋向于 1;当\(z\)趋向于负无穷时,\(e^{-z}\)趋向于正无穷,\(σ(z)\)就趋向于 0 。
为了更直观地感受 sigmoid 函数的特性,我们可以用 Python 来绘制它的图像。这里我们借助强大的matplotlib库和numpy库来完成这个任务 。具体代码如下:
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(z):
return 1 / (1 + np.exp(-z))
z = np.linspace(-10, 10, 100) # 在-10到10之间生成100个均匀分布的点
y = sigmoid(z)
plt.plot(z, y)
plt.xlabel('z')
plt.ylabel('σ(z)')
plt.title('Sigmoid Function')
plt.grid(True)
plt.show()
运行这段代码后,我们就能得到 sigmoid 函数的图像,从图像中可以清晰地看到它是如何将任意实数映射到 0 - 1 之间的。
在逻辑回归中,sigmoid 函数起着至关重要的作用。它就像是一座桥梁,将线性回归模型的输出值(可以是任意实数)巧妙地映射到 (0, 1) 区间,这样我们就可以把这个输出值看作是事件发生的概率 。比如在预测明天是否会下雨的例子中,线性回归模型可能会输出一个数值,这个数值经过 sigmoid 函数的转换后,得到的结果如果是 0.7,那就表示我们预测明天下雨的概率是 70% 。通过这种方式,逻辑回归就能够很好地完成分类任务,因为我们可以根据概率值与设定的阈值(通常是 0.5)进行比较,来判断样本属于哪个类别。
3.2 对数几率与模型公式
理解了 sigmoid 函数后,我们再来看看对数几率这个概念 。几率(odds)是指事件发生的概率与不发生的概率之比,用公式表示就是:
\(odds=\frac{p}{1 - p}\)
其中,\(p\)是事件发生的概率 。而对数几率(log odds),简单来说,就是对几率取自然对数,即:
\(logit(p)=\ln(\frac{p}{1 - p})\)
对数几率的取值范围是从负无穷到正无穷,这个特性使得我们可以用线性模型来拟合它。在逻辑回归中,我们假设对数几率与自变量之间存在线性关系,即:
\(\ln(\frac{p}{1 - p}) = \beta_0 + \beta_1x_1 + \beta_2x_2 + \cdots + \beta_nx_n\)
这里,\(\beta_0\)是截距,也可以理解为当所有自变量都为 0 时的对数几率;\(\beta_1,\beta_2,\cdots,\beta_n\)是自变量\(x_1,x_2,\cdots,x_n\)对应的系数,它们表示了每个自变量对对数几率的影响程度 。这个式子就是逻辑回归的基本方程,它描述了自变量是如何影响事件发生的概率的。
为了更清楚地说明逻辑回归模型中各参数的含义,我们以预测客户是否会购买产品为例 。假设我们有两个自变量,客户的年龄\(x_1\)和收入\(x_2\),通过逻辑回归模型得到的方程为:
\(\ln(\frac{p}{1 - p}) = - 2 + 0.05x_1 + 0.01x_2\)
在这个方程中,\(\beta_0 = - 2\),这意味着当客户年龄为 0 且收入为 0 时(当然,在实际情况中这可能没有实际意义,但从数学模型角度是这样),对数几率是 - 2 。\(\beta_1 = 0.05\)表示年龄每增加 1 岁,对数几率会增加 0.05;\(\beta_2 = 0.01\)表示收入每增加 1 元,对数几率会增加 0.01 。通过这个方程,我们可以根据客户的年龄和收入来计算他们购买产品的概率\(p\),进而预测客户是否会购买产品。
在实际应用中,我们需要求解逻辑回归方程中的参数\(\beta_0,\beta_1,\cdots,\beta_n\),常用的方法是最大似然估计法 。最大似然估计的基本思想是:假设我们有一组观测数据,我们要找到一组参数值,使得在这组参数下,观测数据出现的概率最大。就好像我们在玩一个 “猜数字” 游戏,已知一些线索(观测数据),我们要通过不断尝试(调整参数值),找到最符合这些线索的那个 “数字”(参数值)。在逻辑回归中,我们通过构建似然函数,对其取对数后得到对数似然函数,然后利用优化算法(如梯度上升法)来最大化对数似然函数,从而得到最优的参数值 。具体的数学推导过程比较复杂,这里就不详细展开了,但大致的思路就是这样。通过最大似然估计法求解出参数后,我们就可以使用逻辑回归模型进行预测了。
3.3 模型评估 - Hosmer–Lemeshow 检验
当我们构建好逻辑回归模型后,怎么知道这个模型好不好用呢?这就需要对模型进行评估 。Hosmer–Lemeshow 检验就是一种常用的评估逻辑回归模型拟合度的方法 。它主要用于判断模型预测因变量的准确程度,简单来说,就是看模型预测出来的概率与实际观测到的结果是否相符。
Hosmer–Lemeshow 检验的基本步骤如下:首先,根据模型预测的概率值将观测数据分成若干组,通常是 10 组;然后,对于每组数据,计算实际发生事件的观测数和根据模型预测的期望数;接着,基于这些观测数和期望数,构建一个统计量,这个统计量服从卡方分布;最后,根据卡方分布的临界值来判断模型的拟合度 。如果计算得到的统计量的值小于临界值,那就说明模型的拟合度较好,也就是说模型预测的结果与实际观测结果比较接近;反之,如果统计量的值大于临界值,就表示模型的拟合度不佳,模型可能需要进一步优化或者调整。
举个例子,在预测客户是否会流失的逻辑回归模型中,我们使用 Hosmer–Lemeshow 检验 。假设我们将客户按照预测的流失概率分成了 10 组,对于第一组客户,实际流失的客户有 10 个,而根据模型预测这组客户中应该流失的期望数是 8 个;对于第二组客户,实际流失客户数是 15 个,期望数是 13 个…… 以此类推,计算出所有组的观测数和期望数后,构建卡方统计量。如果这个统计量的值较小,比如小于某个显著性水平(通常是 0.05)下的卡方分布临界值,那就说明模型能够较好地预测客户是否流失,模型的拟合度是可以接受的;但如果统计量的值很大,大于临界值,那就表明模型在预测客户流失方面存在较大偏差,可能需要重新审视数据、调整模型参数或者考虑添加更多的自变量来提高模型的准确性。
四、逻辑回归在机器学习中的角色
4.1 监督式学习与判别模型
在机器学习的大框架下,逻辑回归属于监督式机器学习模型家族 。监督式学习就像是有一位老师在旁边指导的学习过程,在训练模型时,我们不仅有输入数据(自变量),还有对应的输出数据(因变量,也就是标签) 。比如在训练一个预测水果类别的模型时,我们会告诉模型,苹果的特征是红色、圆形、有果柄,标签是 “苹果”;香蕉的特征是黄色、长条形,标签是 “香蕉”。模型通过学习这些带有标签的数据,来建立输入特征和输出标签之间的关系,从而能够对新的、未知标签的数据进行预测。在逻辑回归中,我们也是利用已知的自变量和对应的分类标签数据来训练模型,让模型学习到如何根据自变量来预测分类结果 。
逻辑回归还是一种判别模型 。判别模型的目标很明确,就是直接对观测数据和标签之间的条件概率\(P(Y|X)\)进行建模,以实现分类任务,它关注的是如何找到一个决策边界,将不同类别的数据样本区分开来 。简单来说,判别模型就像是一个 “分类器”,它根据输入的数据特征,直接判断这个数据属于哪个类别 。比如在判断一封邮件是否为垃圾邮件时,判别模型会根据邮件的各种特征(发件人、主题、关键词等),直接给出这封邮件是垃圾邮件或者不是垃圾邮件的判断 。
与判别模型相对的是生成模型 。生成模型是基于概率分布的建模方法,它通过对观测数据和标签之间的联合概率分布\(P(X,Y)\)进行建模,来模拟数据的生成过程 。生成模型的目标是学习数据的概率分布,并能够从中采样生成新的数据样本 。举个例子,假如我们有一些猫和狗的图片数据,生成模型会学习这些图片的特征分布,比如猫的图片通常具有圆脸、尖耳朵、大眼睛等特征,狗的图片可能具有长脸、耷拉的耳朵等特征,然后它可以根据学习到的这些特征分布,生成新的猫或狗的图片 。生成模型虽然也可以用于分类任务,但它的重点在于模拟数据的生成,而判别模型更专注于直接分类 。在实际应用中,我们可以根据具体的任务需求来选择使用判别模型还是生成模型 。如果我们更关注数据的分类准确性,那么判别模型可能更合适;如果我们想要生成新的数据样本,或者对数据的生成过程感兴趣,那么生成模型会是更好的选择 。
4.2 损失函数与梯度下降
在机器学习中,我们需要一种方法来衡量模型预测结果与真实值之间的差异,这就用到了损失函数 。逻辑回归通常使用负对数似然作为损失函数 。为什么选择负对数似然呢?我们可以从概率的角度来理解 。在逻辑回归中,我们通过模型预测每个样本属于正类(比如判断邮件是垃圾邮件)的概率\(p\)。对于一个样本,如果它的真实标签是正类(\(y = 1\)),我们希望模型预测的概率\(p\)尽可能大;如果真实标签是负类(\(y = 0\)),我们希望\(1 - p\)尽可能大 。负对数似然函数能够很好地衡量这种差异 。它的公式为:
\(J(\theta)=-\frac{1}{m}\sum_{i = 1}^{m}[y^{(i)}\ln(h_{\theta}(x^{(i)}))+(1 - y^{(i)})\ln(1 - h_{\theta}(x^{(i)}))]\)
这里,\(m\)是样本的数量,\(y^{(i)}\)是第\(i\)个样本的真实标签,\(h_{\theta}(x^{(i)})\)是模型对于第\(i\)个样本的预测概率,\(\theta\)是模型的参数 。这个公式的含义是,对于每个样本,我们将其真实标签对应的概率取对数(如果是正类,就是\(\ln(h_{\theta}(x^{(i)}))\);如果是负类,就是\(\ln(1 - h_{\theta}(x^{(i)}))\)),然后乘以真实标签(\(y^{(i)}\)或\(1 - y^{(i)}\)),再对所有样本求和并取负 。通过最小化这个损失函数,我们可以让模型的预测概率尽可能接近真实标签 。
为了找到使损失函数最小化的模型参数\(\theta\),我们通常会使用梯度下降算法 。梯度下降算法就像是在一座山上寻找最低点的过程 。想象我们站在山上的某个位置,梯度就像是我们脚下山坡的坡度,它指示了上升最快的方向 。而我们要找的是最低点,所以我们沿着梯度的反方向(下降最快的方向)迈出一步,调整我们的位置 。然后不断重复这个过程,每次都根据当前位置的梯度来调整,直到我们找到一个足够低的点,认为这就是最低点(实际上可能是局部最低点,但在很多情况下,对于逻辑回归这种凸函数,我们能找到全局最低点) 。
在逻辑回归中,梯度下降的具体步骤如下:首先,我们初始化模型参数\(\theta\)为一些初始值(可以是随机值或者全零) 。然后,对于每个样本,我们计算模型的预测概率\(h_{\theta}(x)\),进而计算损失函数\(J(\theta)\)关于参数\(\theta\)的梯度 。梯度的计算公式为:
\(\frac{\partial J(\theta)}{\partial \theta_j}=\frac{1}{m}\sum_{i = 1}^{m}(h_{\theta}(x^{(i)}) - y^{(i)})x_j^{(i)}\)
这里,\(x_j^{(i)}\)是第\(i\)个样本的第\(j\)个特征值 。计算出梯度后,我们按照一定的步长(也称为学习率,用\(\alpha\)表示),沿着梯度的反方向更新参数\(\theta\),更新公式为:
\(\theta_j:=\theta_j-\alpha\frac{\partial J(\theta)}{\partial \theta_j}\)
我们不断重复计算梯度和更新参数的过程,直到损失函数收敛,也就是损失函数的值不再明显下降 。这个过程就像是我们在山上一步步朝着最低点走去,直到我们到达一个看起来不能再下降的地方 。在实际应用中,学习率\(\alpha\)的选择非常重要 。如果\(\alpha\)太大,模型可能会跳过最优解,导致无法收敛;如果\(\alpha\)太小,模型的收敛速度会非常慢,需要更多的迭代次数才能达到收敛 。所以通常需要通过实验来选择一个合适的学习率 。
4.3 过拟合与正则化
逻辑回归虽然是一种强大的分类模型,但它也容易出现过拟合的问题 。过拟合就像是一个学生在学习知识时,只记住了老师讲的每一个具体例子,而没有理解背后的普遍规律 。当遇到新的、和之前例子不完全一样的问题时,就无法正确解答 。在逻辑回归中,过拟合通常发生在模型过于复杂,或者训练数据量不足的情况下 。如果模型中有大量的自变量,并且这些自变量之间存在复杂的关系,模型就可能会过度学习训练数据中的细节和噪声,而忽略了数据的整体趋势 。这样的模型在训练集上可能表现得非常好,能够准确地预测每个样本的类别,但在测试集或新的数据上,表现就会很差 。
为了防止过拟合,我们可以采用正则化的方法 。正则化的基本思想是在损失函数中添加一个惩罚项,这个惩罚项与模型的参数有关 。通过惩罚大的参数系数,我们可以限制模型的复杂度,使模型更加简单和泛化 。在逻辑回归中,常用的正则化方法有 L1 正则化和 L2 正则化 。
L1 正则化也称为 Lasso 回归,它在损失函数中添加的惩罚项是参数的绝对值之和,即:
\(J(\theta)=-\frac{1}{m}\sum_{i = 1}^{m}[y^{(i)}\ln(h_{\theta}(x^{(i)}))+(1 - y^{(i)})\ln(1 - h_{\theta}(x^{(i)}))]+\lambda\sum_{j = 1}^{n}|\theta_j|\)
这里,\(\lambda\)是正则化参数,它控制着惩罚的强度 。当\(\lambda\)较大时,惩罚项的作用就更强,模型会更倾向于将一些不重要的参数压缩为 0,从而实现特征选择的效果 。这就像是在做决策时,我们只关注那些最重要的因素,忽略掉一些不太重要的细节 。比如在预测房价时,如果有很多自变量,L1 正则化可能会发现一些对房价影响很小的因素(比如房子周围是否有特定的一棵树),并将对应的参数设为 0,只保留那些真正对房价有显著影响的因素(比如房子面积、房间数量等) 。
L2 正则化也称为岭回归,它在损失函数中添加的惩罚项是参数的平方和,即:
\(J(\theta)=-\frac{1}{m}\sum_{i = 1}^{m}[y^{(i)}\ln(h_{\theta}(x^{(i)}))+(1 - y^{(i)})\ln(1 - h_{\theta}(x^{(i)}))]+\lambda\sum_{j = 1}^{n}\theta_j^2\)
L2 正则化不会像 L1 正则化那样将参数压缩为 0,但它会使参数的值变小 。这就像是在保持所有因素都参与决策的同时,限制每个因素的影响力 。比如在预测股票价格时,所有的市场因素(如宏观经济数据、公司财务状况等)都可能对股票价格有影响,但 L2 正则化会让那些影响较小的因素的影响力变得更小,避免模型过度依赖这些因素 。
正则化参数\(\lambda\)的选择也很关键 。如果\(\lambda\)太小,正则化的效果不明显,模型还是可能会过拟合;如果\(\lambda\)太大,模型可能会过于简单,导致欠拟合,也就是模型无法学习到数据中的重要模式,在训练集和测试集上的表现都不好 。通常我们会通过交叉验证等方法来选择一个合适的\(\lambda\)值,以平衡模型的复杂度和拟合能力 。
五、逻辑回归的实现步骤(以 Python 和 scikit - learn 库为例)
5.1 数据准备
数据准备是构建逻辑回归模型的基础,它就像是盖房子前的打地基工作,只有地基打得牢固,房子才能盖得又高又稳 。在这一步,我们需要完成数据收集、清洗、划分训练集和测试集以及特征缩放等关键任务。
首先是数据收集,这一步需要我们从各种数据源获取相关数据。比如,我们要预测客户是否会购买某产品,就可以从公司的客户数据库中获取客户的年龄、性别、购买历史、浏览记录等数据,这些数据将作为我们模型的自变量 。获取数据后,我们要进行数据清洗,因为原始数据往往存在各种问题,比如缺失值、重复值、异常值等。缺失值就像是拼图中缺少的几块,会影响我们对整体数据的理解和使用 。对于缺失值,我们可以根据数据的特点选择合适的处理方法。如果是数值型数据,我们可以用均值、中位数来填充缺失值;如果是分类数据,我们可以用出现频率最高的类别来填充 。比如在客户年龄数据中,如果有个别缺失值,我们可以计算其他客户年龄的均值,然后用这个均值来填充缺失的年龄值 。重复值就像是多余的 “累赘”,会增加计算量,我们需要将其删除 。异常值则像是数据中的 “怪胎”,可能是由于数据录入错误或者其他原因导致的,我们需要仔细检查并决定是修正还是删除这些异常值 。
接下来,我们要把清洗好的数据划分为训练集和测试集 。训练集就像是学生学习知识的课本,模型通过在训练集上进行学习,掌握数据中的特征和规律;测试集则像是考试试卷,用于评估模型在未见过的数据上的表现 。通常,我们会按照一定的比例来划分,常见的比例有 70% 作为训练集,30% 作为测试集;或者 80% 作为训练集,20% 作为测试集 。在 Python 中,我们可以使用 scikit - learn 库中的train_test_split函数来轻松完成这个任务 。示例代码如下:
from sklearn.model_selection import train_test_split
import pandas as pd
# 假设我们从CSV文件中读取数据
data = pd.read_csv('data.csv')
X = data.drop('target', axis=1) # 特征数据,假设'target'是目标变量列
y = data['target'] # 目标变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
在这段代码中,test_size=0.3表示将 30% 的数据作为测试集,random_state=42是为了确保每次运行代码时划分的结果是一致的,这样方便我们进行调试和比较不同模型的性能 。
最后,我们还需要对数据进行特征缩放 。这是因为不同特征的取值范围可能差异很大,比如客户的年龄可能在 18 - 80 之间,而客户的收入可能在几千到几十万之间 。如果不进行特征缩放,模型在训练时可能会更关注取值范围大的特征,而忽略取值范围小的特征 。特征缩放就像是把不同尺寸的物品都统一调整到相同的尺寸,让它们在模型训练中能够 “公平竞争” 。常见的特征缩放方法有标准化(Standardization)和归一化(Normalization) 。标准化是将数据转换为均值为 0,标准差为 1 的分布,公式为:\(z = \frac{x - \mu}{\sigma}\),其中\(x\)是原始数据,\(\mu\)是均值,\(\sigma\)是标准差 。在 scikit - learn 库中,我们可以使用StandardScaler来实现标准化 。归一化是将数据缩放到 0 - 1 之间,公式为:\(x' = \frac{x - x_{min}}{x_{max} - x_{min}}\),其中\(x_{min}\)和\(x_{max}\)分别是数据的最小值和最大值 。我们可以使用MinMaxScaler来实现归一化 。以下是标准化的代码示例:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
在这段代码中,我们首先创建了一个StandardScaler对象,然后使用fit_transform方法对训练集进行拟合和转换,最后使用transform方法对测试集进行转换 。这样,我们就完成了数据准备的所有步骤,可以进入模型训练阶段了 。
5.2 模型训练
数据准备好后,就可以开始模型训练了 。在 Python 中,借助强大的 scikit - learn 库,我们可以很方便地使用逻辑回归模型 。这里我们主要使用LogisticRegression类来进行模型训练 。
首先,我们需要导入相关的库和模块:
from sklearn.linear_model import LogisticRegression
然后,创建LogisticRegression类的实例,在创建实例时,我们可以设置一些关键参数 。比如:
log_reg = LogisticRegression(penalty='l2', C=1.0, solver='lbfgs', max_iter=100, random_state=42)
下面来详细解释一下这些参数的含义:
- penalty:用于指定应用在模型复杂度上的正则化类型,可选的值包括'l1'(Lasso 回归)、'l2'(Ridge 回归)以及'none'(无正则化) 。默认值通常是'l2' 。如前文所述,正则化可以防止模型过拟合,l1正则化会使一些不重要的参数变为 0,实现特征选择的效果;l2正则化会使参数变小,但不会变为 0 。
- C:该参数是正则化强度的逆,值越小,正则化强度越大 。较大的C值表示较弱的正则化,反之亦然 。通常需要通过交叉验证来选择最优的C值 。比如C值设为 1.0 是一个常见的初始设置,如果模型出现过拟合,可以尝试减小C值;如果模型欠拟合,可以尝试增大C值 。
- solver:用于指定优化算法,不同的优化算法适应不同的数据和问题规模 。常用的求解器包括'liblinear'、'newton - cg'、'lbfgs' 、'sag'和'saga' 。其中'liblinear'适用于小数据集且效果通常不错;'lbfgs'是拟牛顿法的一种,收敛速度较快,适用于大多数情况;'sag'和'saga'适用于大数据集,它们的计算效率较高 。这里我们选择'lbfgs'求解器 。
- max_iter:指定算法的最大迭代次数 。由于逻辑回归中优化算法的收敛速度可能较慢,因此有时候需要设置较高的迭代次数 。如果迭代次数设置得过小,模型可能还没有收敛就停止训练了,导致模型效果不佳;如果设置得过大,虽然能保证模型收敛,但会增加训练时间 。这里设置为 100 次迭代 。
- random_state:指定伪随机数生成器的种子,以便模型的结果可复现 。设置一个固定的值可以保证每次运行代码时,模型的初始化和数据的划分是一致的 。这在调试和比较不同模型时非常重要,确保我们得到的结果是由于模型本身的差异,而不是随机因素导致的 。
设置好参数后,就可以使用训练集数据来训练模型了,代码如下:
log_reg.fit(X_train, y_train)
在这行代码中,fit方法会根据传入的训练集特征数据X_train和目标变量y_train来训练逻辑回归模型,模型会在训练过程中不断调整参数,以最小化损失函数,从而找到最优的模型参数 。经过训练,模型就学会了如何根据输入的特征来预测目标变量 。
5.3 模型预测与评估
模型训练完成后,我们就可以用它来进行预测了 。使用训练好的模型对测试集进行预测非常简单,只需要调用模型的predict方法即可,代码如下:
y_pred = log_reg.predict(X_test)
在这行代码中,X_test是测试集的特征数据,y_pred就是模型对测试集的预测结果 。y_pred中的每个元素都是模型预测的类别标签,比如在二分类问题中,可能是 0 或 1 。
预测完成后,我们需要评估模型的性能,看看模型预测得准不准 。这就需要用到一些评估指标,常见的评估指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)和 F1 值(F1 - score) 。
准确率是指预测正确的结果占总样本的百分比,公式为:\(Accuracy = \frac{TP + TN}{TP + TN + FP + FN}\),其中\(TP\)(True Positive)表示实际为正类且预测为正类的样本数,\(TN\)(True Negative)表示实际为负类且预测为负类的样本数,\(FP\)(False Positive)表示实际为负类但预测为正类的样本数,\(FN\)(False Negative)表示实际为正类但预测为负类的样本数 。比如在预测邮件是否为垃圾邮件的问题中,如果有 100 封邮件,模型正确预测了 80 封,那么准确率就是\(\frac{80}{100} = 0.8\) 。
精确率是指所有被预测为正类的样本中实际为正类的样本的概率,公式为:\(Precision = \frac{TP}{TP + FP}\) 。它反映了模型预测为正类的样本中,真正是正类的比例 。还是以垃圾邮件预测为例,如果模型预测了 50 封邮件为垃圾邮件,其中实际是垃圾邮件的有 40 封,那么精确率就是\(\frac{40}{50} = 0.8\) 。
召回率是指实际为正类的样本中被预测为正类样本的概率,公式为:\(Recall = \frac{TP}{TP + FN}\) 。它衡量了模型能够正确识别出的正类样本的比例 。比如实际有 60 封垃圾邮件,模型正确识别出了 40 封,那么召回率就是\(\frac{40}{60} \approx 0.67\) 。
F1 值是精确率和召回率的调和平均数,它综合考虑了精确率和召回率,公式为:\(F1 = \frac{2 \times Precision \times Recall}{Precision + Recall}\) 。当精确率和召回率都很高时,F1 值也会很高 。在实际应用中,F1 值可以帮助我们更全面地评估模型的性能 。
在 scikit - learn 库中,我们可以使用classification_report函数来方便地计算这些评估指标,代码如下:
from sklearn.metrics import classification_report
report = classification_report(y_test, y_pred)
print(report)
运行这段代码后,会输出一个详细的分类报告,其中包含了精确率、召回率、F1 值以及支持数(每个类别的样本数)等信息 。通过这些评估指标,我们可以清楚地了解模型的性能,判断模型是否满足我们的需求 。如果模型性能不理想,我们可以尝试调整模型参数、重新进行数据预处理或者选择其他模型来提高模型的性能 。
六、逻辑回归的应用案例
6.1 欺诈检测
在金融领域,欺诈行为犹如隐藏在暗处的 “毒瘤”,时刻威胁着金融机构和客户的资金安全 。逻辑回归在欺诈检测中发挥着关键作用,就像是一位敏锐的 “侦探”,帮助金融机构识别潜在的欺诈交易。
以银行信用卡交易为例,银行每天都会处理海量的交易数据 。逻辑回归模型可以通过分析这些交易数据中的各种特征,如交易金额、交易时间、交易地点、持卡人的消费习惯等,来判断一笔交易是否存在欺诈风险 。假设一位持卡人平时的消费金额大多在几百元到几千元之间,且交易地点主要集中在其常住城市 。突然有一天,银行系统检测到一笔来自国外、金额高达数万元的交易 。逻辑回归模型会根据这些异常的交易特征,结合历史数据中欺诈交易的模式,计算出这笔交易为欺诈的概率 。如果概率超过设定的阈值,银行就可以及时采取措施,如冻结账户、联系持卡人进行确认等,从而有效地防止欺诈行为的发生 。
在实际应用中,逻辑回归模型还可以与其他技术相结合,进一步提高欺诈检测的准确性 。比如,将逻辑回归与深度学习中的神经网络相结合,利用神经网络强大的特征提取能力,为逻辑回归提供更丰富、更有价值的特征 。这样的组合模型能够更好地捕捉到欺诈交易的复杂模式,提高对欺诈行为的识别能力 。通过逻辑回归进行欺诈检测,不仅可以降低金融机构的损失,还能增强客户对金融机构的信任,维护金融市场的稳定和健康发展 。
6.2 疾病诊断
在医疗领域,逻辑回归就像是医生的得力 “助手”,为疾病诊断提供了重要的支持 。医生可以借助逻辑回归模型,根据患者的各种症状、检查指标等信息,预测患者患某种疾病的概率,从而辅助诊断和制定治疗方案 。
以糖尿病诊断为例,糖尿病是一种常见的慢性疾病,早期诊断和治疗对于控制病情发展至关重要 。逻辑回归模型可以分析患者的年龄、性别、家族病史、体重指数(BMI)、血糖水平、胰岛素水平等多个因素 。年龄较大、有家族糖尿病史、BMI 较高、血糖和胰岛素水平异常的患者,患糖尿病的风险通常会增加 。逻辑回归模型会根据这些因素与糖尿病之间的关系,计算出患者患糖尿病的概率 。比如,一位 45 岁的男性患者,家族中有糖尿病患者,BMI 为 28(超重),空腹血糖值为 7.5mmol/L(高于正常范围),通过逻辑回归模型计算出他患糖尿病的概率可能达到 70% 。医生在诊断时,就可以参考这个概率,结合其他临床症状和检查结果,做出更准确的诊断 。
除了糖尿病,逻辑回归在心脏病、癌症等多种疾病的诊断中也有广泛应用 。在心脏病诊断中,模型可以根据患者的血压、血脂、心电图数据等因素来预测心脏病发作的风险;在癌症诊断中,通过分析肿瘤的大小、形状、细胞特征等指标,预测肿瘤是良性还是恶性 。逻辑回归为疾病诊断提供了一种客观、量化的方法,帮助医生更科学地评估患者的病情,提高诊断的准确性和效率,为患者的治疗争取宝贵的时间 。
6.3 广告点击率预测
在互联网广告领域,广告点击率(CTR)是衡量广告效果的关键指标之一 。逻辑回归就像是广告投放的 “指南针”,通过预测用户对广告的点击率,帮助广告商优化广告投放策略,提高广告的效果和投资回报率 。
广告商在投放广告时,希望将广告展示给最有可能点击的用户 。逻辑回归模型可以根据用户的各种特征,如年龄、性别、地理位置、浏览历史、搜索记录、兴趣爱好等,分析用户与广告之间的相关性,从而预测用户点击广告的概率 。例如,一位年轻的女性用户,经常浏览时尚类网站,搜索时尚品牌和服装搭配等关键词,当她浏览网页时,逻辑回归模型会根据她的这些特征,预测她对时尚类广告的点击率较高 。广告商就可以针对这类用户,精准地投放时尚类广告,提高广告的曝光效果和点击率 。
为了提高广告点击率预测的准确性,逻辑回归模型还可以考虑广告的各种特征,如广告的文案、图片、视频内容、展示位置等 。一个吸引人的广告文案和精美的图片,往往能够吸引用户的注意力,提高点击率 。逻辑回归模型会综合考虑这些因素,更准确地预测用户对广告的反应 。通过逻辑回归进行广告点击率预测,广告商可以避免盲目投放广告,节省广告成本,将资源集中在最有潜力的用户群体上,从而实现广告效果的最大化 。
七、逻辑回归的优缺点
7.1 优点
- 计算简单,训练速度快:逻辑回归的模型形式基于线性回归和 sigmoid 函数,其训练过程主要涉及线性代数运算和 sigmoid 函数计算,这些操作相对高效,在小到中等规模数据集上表现尤为出色。比如在处理客户购买行为数据时,能快速完成模型训练,为业务决策提供及时支持。并且,像 scikit-learn 等机器学习库都提供了逻辑回归的高效实现,使其可以处理大规模数据集。
- 结果可解释性强:逻辑回归模型的结果可以通过权重系数进行解释,有助于理解不同特征对分类结果的影响。以医疗领域预测疾病发生概率为例,通过模型权重系数,医生能清晰了解年龄、性别、病史等不同风险因素对疾病发生概率的影响,从而做出更合理决策。
- 能处理线性可分和部分线性不可分问题:虽然逻辑回归基于线性模型,但在一定程度上也能处理线性不可分的数据。通过引入正则化项,如 L1 和 L2 正则化,可以调整模型复杂度,使其在一定程度上适应数据的非线性特征。并且在特征工程中,通过合理的特征转换,如将原始特征进行多项式变换,能将一些原本线性不可分的问题转化为线性可分,让逻辑回归可以处理。
- 输出概率值,便于后续处理:逻辑回归输出的是一个概率值,表示样本属于某个类别的概率。这种概率输出方式便于理解模型预测结果,也便于进行后续处理。在广告推荐系统中,根据用户点击广告的概率决定是否展示广告;在信用评估领域,依据用户违约的概率决定是否给予贷款。
7.2 缺点
- 假设特征线性关系:逻辑回归基于线性模型进行预测,假设特征与结果之间存在线性关系。然而,在实际问题中,很多数据特征与结果之间的关系是非线性的。如预测股票价格走势,股票价格受众多复杂因素影响,这些因素与价格之间并非简单线性关系,此时逻辑回归预测性能会受影响。若要处理非线性关系,需进行特征转换,如多项式回归、核方法等,但这会增加模型复杂度和计算代价。
- 对不平衡数据敏感:当样本数据存在类别不平衡现象,即某一类别的样本远远多于另一类别时,逻辑回归可能会倾向于预测样本多的类别,导致少数类别被误判。在信用卡欺诈检测中,正常交易数量远多于欺诈交易,模型可能更多将交易预测为正常,忽略欺诈交易,造成严重后果。为处理不平衡数据,可采取过采样、欠采样、生成合成样本、调整阈值或使用类别权重等策略。
- 对异常值敏感:逻辑回归使用最大似然估计法优化参数,数据集中存在的异常值可能对模型训练产生较大影响,导致模型性能下降。在房价预测数据中,若存在个别价格异常高或低的样本,可能使模型对房价的预测产生偏差。为减轻异常值影响,需在数据预处理阶段进行异常值检测和处理,如删除异常值、填充异常值或使用鲁棒性更强的损失函数。
- 容易欠拟合或过拟合:逻辑回归模型形式相对简单,可能无法捕捉数据中的复杂模式或非线性关系,导致在训练集上表现良好,但在测试集上泛化能力较差,出现欠拟合现象。在手写数字识别中,简单逻辑回归模型可能无法准确识别复杂手写体数字。另一方面,若模型复杂度设置不合理,或训练数据量不足,逻辑回归也可能出现过拟合,过度学习训练数据中的噪声和细节,而忽略数据整体趋势 。为避免欠拟合或过拟合,可尝试增加模型复杂度、使用正则化技术、增加数据训练量等方法。
八、总结与展望
8.1 回顾重点内容
在本文中,我们深入剖析了逻辑回归这一强大的统计模型和机器学习算法。逻辑回归虽名为 “回归”,实则主要用于分类任务,它通过逻辑函数(sigmoid 函数)将线性回归的结果映射到 (0, 1) 区间,从而输出事件发生的概率,实现对样本的分类预测。
逻辑回归主要分为二元逻辑回归、多元逻辑回归和有序逻辑回归三种类型 ,分别适用于不同的分类场景。其核心原理基于对数几率与自变量的线性关系,通过最大似然估计法求解模型参数 。在机器学习的范畴内,逻辑回归属于监督式学习的判别模型,通过最小化负对数似然损失函数,利用梯度下降等优化算法来寻找最优参数 。为了防止过拟合,我们引入了正则化方法,如 L1 和 L2 正则化 。
在实际实现逻辑回归时,我们以 Python 和 scikit - learn 库为例,详细介绍了从数据准备(包括数据收集、清洗、划分训练集和测试集以及特征缩放)、模型训练(设置关键参数并训练模型)到模型预测与评估(使用模型进行预测,并通过准确率、精确率、召回率和 F1 值等指标评估模型性能)的完整步骤 。逻辑回归在欺诈检测、疾病诊断、广告点击率预测等众多领域都有着广泛的应用,为解决实际问题提供了有效的工具 。当然,它也有自身的优缺点,计算简单、可解释性强,但也存在对数据分布假设严格、对不平衡数据敏感等不足 。
8.2 未来发展趋势
随着大数据和人工智能技术的不断发展,逻辑回归也将迎来新的机遇和挑战 。在大数据时代,数据量和数据维度不断增加,如何在大规模数据上高效地训练逻辑回归模型,以及如何处理高维稀疏数据,将是未来研究的重要方向 。例如,研究更高效的分布式计算框架,结合云计算技术,实现逻辑回归模型在海量数据上的快速训练;探索新的特征选择和降维方法,以应对高维数据带来的计算复杂性和过拟合风险 。
在人工智能领域,逻辑回归有望与深度学习等其他先进技术进一步融合 。比如,将深度学习强大的特征提取能力与逻辑回归的可解释性相结合,先通过深度学习模型从复杂的数据中提取高级特征,再利用逻辑回归进行分类和解释,这样既能提高模型的准确性,又能保持模型的可解释性 。此外,针对逻辑回归在处理复杂数据和复杂任务时的局限性,研究新型的逻辑回归变体或改进算法,以适应不断变化的应用需求 。
逻辑回归作为一种经典而实用的模型,在未来的数据科学和机器学习领域仍将发挥重要作用 。希望读者通过本文对逻辑回归有了更深入的理解,并能够在实际工作和研究中灵活运用这一工具,不断探索和创新,为解决实际问题贡献自己的智慧和力量 。如果你对逻辑回归还有其他疑问或者想要进一步深入研究,欢迎在评论区留言交流,让我们一起在数据科学的道路上不断前行 。

浙公网安备 33010602011771号