ML:逻辑回归的基本原理与实现

在机器学习中,分类任务关注的不是"某个目标值大约是多少",而是"一个样本应当属于哪一类"。例如,根据邮件内容判断是否为垃圾邮件,根据体检指标判断是否存在疾病风险,根据交易特征判断是否为欺诈行为,这些都属于典型的分类问题。逻辑回归(Logistic Regression)是最基础、最重要的分类方法之一。

一、逻辑回归的基本思想

逻辑回归的核心思想是:先用一个线性表达式刻画输入特征的综合作用,再把这个线性结果映射为一个介于 0 和 1 之间的概率值,最后依据概率大小进行分类。

如果先看最简单的二分类情形,输入是一个特征向量 x,那么模型会先计算一个线性组合:

这里的 z 并不是最终预测结果,而只是一个中间量。

逻辑回归接下来会把这个线性组合送入一个特殊函数,把它转化为概率。

从机器学习视角看,逻辑回归完成的是这样一件事:

• 输入:一组特征

• 输出:某个类别发生的概率

• 目标:找到一组参数,使正确类别的概率尽量高

图 1 逻辑回归的基本预测过程

因此,逻辑回归虽然使用的是线性表达式,但它解决的是分类问题,而不是回归问题。

二、逻辑回归的数学表达

1、线性部分

逻辑回归首先计算一个线性组合:

其中:

• x₁, x₂, ..., xₙ 是输入特征

• w₁, w₂, ..., wₙ 是各特征对应的系数

• b 是截距

• z 表示线性打分结果

这一部分与线性回归非常相似。不同之处在于,逻辑回归不会把 z 直接当作最终输出。

2、Sigmoid 函数与概率输出

在二分类逻辑回归中,模型通常使用Sigmoid 函数把 z 映射到 0 到 1 之间:

于是,某个样本属于正类的概率可以写成:

也可以写成:

这里:

• P(y=1 | x) 表示在给定输入 x 的条件下,样本属于正类的概率

• 概率越接近 1,模型越倾向于把样本判为正类

• 概率越接近 0,模型越倾向于把样本判为负类

3、"线性"究竟指什么

初学者很容易把逻辑回归误解为"模型一定画出一条直线"。更准确地说,逻辑回归中的"线性",主要是指模型对参数是线性的,也就是分类依据来自特征的线性组合。而概率输出本身则通过 Sigmoid 函数进行了非线性映射。

因此,逻辑回归的核心结构可以理解为:

• 先做线性打分

• 再把线性打分映射为概率

• 最后依据概率作出分类判断

4、多分类情形

虽然最基础的逻辑回归常从二分类出发,但 Scikit-learn 的 LogisticRegression 也支持多分类情形。它使用一组可选求解器实现正则化逻辑回归;多分类问题可由不同求解策略支持。

在多分类问题中,模型不再只输出"是否属于正类"的单一概率,而会输出对多个类别的概率估计,再选择概率最大的类别作为预测结果。

三、逻辑回归如何学习参数

模型形式确定之后,真正的问题就变成了:怎样找到最合适的系数和截距?

1、为什么不能用线性回归那一套直接做分类

如果直接把类别标签当成数值,用普通线性回归去拟合,会遇到至少两个问题:

• 输出值可能超出 0 到 1 的概率范围

• 分类边界与概率解释都不自然

因此,逻辑回归不是去最小化普通残差平方和,而是采用更适合概率分类的目标函数。

2、对数损失思想

逻辑回归的学习目标,是让正确类别的预测概率尽可能高。在实践中,这通常体现为最小化对数损失(log-loss)。

对二分类问题,如果真实标签 y ∈ {0,1},预测概率记为 p,则单个样本的对数损失可写为:

如果有很多样本,则总体损失可以写成:

其中:

• yᵢ 是第 i 个样本的真实标签

• pᵢ 是模型预测其属于正类的概率

• n 是样本数

这个损失函数的直观含义是:

• 如果真实标签为 1,而模型给出的 p 很小,则损失会很大

• 如果真实标签为 0,而模型给出的 p 很大,则损失也会很大

• 只有当正确类别概率足够高时,损失才会较小

3、正则化思想

在拟合分类边界时,模型不仅关注训练误差,还会约束参数不要过大。常用的方法称为"正则化"(Regularization),这样做的结果通常是:

• 模型更稳定

• 更不容易过拟合

• 在高维或相关特征情形下更稳健

Scikit-learn 的 LogisticRegression 默认带有正则化。

常见的正则化形式包括 L2 正则化,相关强度则通常由参数 C 控制。

• C 越小,正则化越强

• C 越大,模型越接近弱约束状态

四、模型参数与决策边界的解释

逻辑回归之所以常被视为"很适合入门的分类模型"之一,一个重要原因就在于它既能输出概率,也保留了一定可解释性。

1、系数的含义

在线性部分中,每个系数都可以理解为对应特征对线性打分 z 的影响方向与影响强度。

• 系数为正,说明该特征增大时,模型更倾向于判为正类

• 系数为负,说明该特征增大时,模型更倾向于判为负类

• 系数绝对值越大,通常表示该特征对线性打分影响更显著

Scikit-learn 的 LogisticRegression 训练后,会把学到的参数存储在 coef_ 属性中,截距存储在 intercept_ 属性中。

2、决策边界的含义

在二分类逻辑回归中,最常见的分类规则是:

• 若 P(y=1|x) ≥ 0.5,判为正类

• 若 P(y=1|x) < 0.5,判为负类

因为 Sigmoid 函数在 z = 0 时恰好输出 0.5,所以默认阈值下的决策边界可以理解为:

这说明,尽管逻辑回归输出的是概率,但它在特征空间中的分类边界本质上仍是一个线性边界。

3、概率输出的意义

与很多只直接输出类别的模型相比,逻辑回归的一大优点是能给出类别概率。

这意味着,模型不仅能说"它属于哪一类",还能说"它属于这一类的把握大约有多大"。

这在很多实际任务中非常重要,例如:

• 风险评分

• 医学筛查

• 欺诈检测

• 需要阈值调节的二分类问题

五、Python 实现:二分类逻辑回归示例

下面用一个简洁的二分类示例,说明逻辑回归的基本使用方式。

这里使用 make_classification 生成二维样本,并用 LogisticRegression 完成训练、预测与概率输出。

python 复制代码
# 导入所需模块from sklearn.datasets import make_classification   # 生成模拟分类数据集from sklearn.linear_model import LogisticRegression  # 逻辑回归分类器from sklearn.model_selection import train_test_split  # 划分训练集和测试集
# 1. 生成二分类数据# make_classification 创建一个用于二分类的随机数据集# 参数解释:#   n_samples=200: 生成200个样本#   n_features=2: 每个样本有2个特征(便于可视化)#   n_informative=2: 2个特征都是信息丰富的(都与分类相关)#   n_redundant=0: 没有冗余特征(由信息特征线性组合生成的特征)#   n_clusters_per_class=1: 每个类别的样本聚集在1个簇中,使数据线性可分或近似可分#   random_state=42: 随机种子,保证每次生成的数据相同,便于复现X, y = make_classification(    n_samples=200,    n_features=2,    n_informative=2,    n_redundant=0,    n_clusters_per_class=1,    random_state=42)
# 2. 划分训练集和测试集# train_test_split 将数据集随机划分为训练集和测试集# test_size=0.2: 测试集占总数据的20%(40个样本),训练集占80%(160个样本)# random_state=42: 固定划分方式,确保结果可复现X_train, X_test, y_train, y_test = train_test_split(    X, y, test_size=0.2, random_state=42)
# 3. 创建逻辑回归模型# LogisticRegression 使用逻辑函数(sigmoid)估计概率,默认使用 L2 正则化# 常用参数(此处使用默认值):#   penalty='l2': 正则化项,防止过拟合#   C=1.0: 正则化强度的倒数(C越小,正则化越强)#   solver='lbfgs': 优化算法,适用于小数据集#   max_iter=100: 最大迭代次数model = LogisticRegression()
# 4. 训练模型# fit 方法基于训练集学习逻辑回归模型:通过最大似然估计找到最优的系数(coef_)和截距(intercept_)model.fit(X_train, y_train)
# 5. 预测类别# predict 方法根据决策边界(默认阈值0.5)返回预测的类别标签(0或1)y_pred = model.predict(X_test)
# 6. 预测概率# predict_proba 方法返回每个样本属于每个类别的概率(第一列是类别0的概率,第二列是类别1的概率)y_prob = model.predict_proba(X_test)
# 打印前10个预测的类别print("前 10 个预测类别:", y_pred[:10])# 打印前5个样本的类别概率(每个样本的两个概率之和为1)print("前 5 个样本的类别概率:")print(y_prob[:5])
# coef_ 是模型的权重系数(特征对决策的影响程度),形状为 (1, n_features)(二分类时)print("系数 coef_ =", model.coef_)# intercept_ 是模型的截距(偏置项),形状为 (1,)print("截距 intercept_ =", model.intercept_)# score 返回测试集上的分类准确率(预测正确的样本数 / 总样本数)print("测试集得分:", model.score(X_test, y_test))

这段代码展示了逻辑回归最基本的工作流:

1、生成或加载数据

2、划分训练集与测试集

3、创建模型并训练

4、用 predict 输出类别

5、用 predict_proba 输出类别概率

6、查看系数、截距与默认评分

LogisticRegression 常被作为概率较好校准的基线模型,正是因为它直接优化了 log-loss,并提供 predict_proba 方法来输出类别概率。

score() 对分类器默认返回准确率。要提醒的是,不同模型和任务应结合具体指标来理解评估结果。

六、Python 实现:多分类逻辑回归示例

下面再用鸢尾花数据集给出一个多分类逻辑回归示例。

Scikit-learn 的逻辑回归示例与 API 文档都支持多分类使用方式。

python 复制代码
# 导入所需模块from sklearn.datasets import load_iris                # 加载鸢尾花数据集的函数from sklearn.linear_model import LogisticRegression   # 逻辑回归分类器from sklearn.model_selection import train_test_split  # 数据集划分函数
# 1. 加载数据iris = load_iris()            # 加载鸢尾花数据集,返回一个 Bunch 对象(类似字典)X = iris.data                 # 特征数据:150行4列的二维数组,4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)y = iris.target               # 标签数据:一维数组,长度为150,值0、1、2分别代表三种鸢尾花(山鸢尾、变色鸢尾、维吉尼亚鸢尾)
# 2. 划分训练集与测试集# train_test_split 将数据集随机划分为训练集和测试集# test_size=0.2: 测试集占总数据的20%(即30个样本),训练集占80%(120个样本)# random_state=42: 随机种子,固定划分方式,确保代码每次运行结果一致X_train, X_test, y_train, y_test = train_test_split(    X, y, test_size=0.2, random_state=42)
# 3. 创建模型# LogisticRegression 使用逻辑函数进行多分类(鸢尾花有3个类别)# max_iter=200: 设置最大迭代次数为200。逻辑回归通过迭代优化求解参数,默认100次有时不够收敛,增大迭代次数确保模型收敛# 其他参数使用默认值:penalty='l2'(L2正则化),C=1.0(正则化强度),solver='lbfgs'(适用于多分类的优化算法)model = LogisticRegression(max_iter=200)
# 4. 训练模型# fit 方法基于训练集学习逻辑回归模型:通过最大似然估计找到最优的权重矩阵(coef_)和截距向量(intercept_)# 由于是多分类,模型内部使用一对多(One-vs-Rest)策略,为每个类别训练一个二分类器model.fit(X_train, y_train)
# 5. 预测# predict 方法返回每个测试样本所属的类别(0、1或2),选择概率最高的类别作为预测结果y_pred = model.predict(X_test)
# 6. 输出前几个样本的预测概率# predict_proba 方法返回每个样本属于每个类别的概率,形状为 (n_samples, n_classes)# 每行代表一个样本,三个值分别对应于类别0、1、2的概率,三个概率之和为1y_prob = model.predict_proba(X_test)
# 输出前10个预测类别print("前 10 个预测结果:", y_pred[:10])# 输出前3个样本的类别概率(每个样本3个概率值)print("前 3 个样本的类别概率:")print(y_prob[:3])
# coef_ 是模型的权重系数矩阵,形状为 (n_classes, n_features)# 对于鸢尾花数据集:3个类别 × 4个特征,表示每个类别对应一组权重print("coef_.shape =", model.coef_.shape)# intercept_ 是截距向量,形状为 (n_classes,),每个类别对应一个截距print("intercept_ =", model.intercept_)# score 方法返回测试集上的分类准确率(预测正确的样本数 / 总样本数)print("测试集得分:", model.score(X_test, y_test))

在多分类情形中,predict_proba 会输出每个样本属于各个类别的概率分布。

这说明,逻辑回归并不只适用于最简单的二分类,它也可以扩展到多个类别的分类任务。

七、逻辑回归适用场景与主要局限

1、适用场景

逻辑回归较适合以下情况:

• 目标是分类标签

• 希望输出类别概率

• 希望模型相对简单、稳定、可解释

• 特征与类别之间可由线性边界近似区分

• 需要一个可靠的分类基线模型

在很多机器学习项目中,逻辑回归都常被作为第一个分类基线,因为它简单、稳健、训练效率高,并且概率输出常常具有良好实用价值。

Scikit-learn 的示例中也常把 LogisticRegression 用作概率分类与校准比较的基线模型。

2、主要局限

逻辑回归虽然重要,但并不是万能方法:

• 本质上仍是线性分类器:如果类别边界明显非线性,逻辑回归的表达能力可能不足

• 对特征尺度和求解器有实际影响:旧版与相关文档都提醒,某些求解器在特征尺度大致相近时收敛更稳,因此实践中常配合标准化使用。

• 参数解释依赖前提:当特征高度相关、尺度差异大时,系数大小不宜直接机械比较

• 默认分类阈值并不总最优:很多任务中需要依据业务目标调整概率阈值,而不是固定使用 0.5

• 多分类与正则化设置会影响结果:求解器、惩罚项与超参数选择都会影响模型行为。

📘 小结

逻辑回归先用线性组合刻画特征作用,再把结果映射为类别概率,并据此完成分类。它是理解分类概率、决策边界与正则化思想的重要入口。

"点赞有美意,赞赏是鼓励"

相关推荐
Carl_奕然2 小时前
【大模型】Agent 之:从 Context 到 Harness 的工程革命
人工智能·计算机视觉·自然语言处理
wayz112 小时前
Day 19:LSTM与时间序列预测
人工智能·深度学习·lstm
索木木2 小时前
Flash Attention反向梯度优化显存
人工智能·机器学习·大模型·attention·训练·显存优化·aiinfra
mit6.8242 小时前
[CS153]AI基础设施与技术栈
人工智能
量子-Alex2 小时前
【大模型智能体】AutoFlow:大型语言模型代理的自动化工作流生成
人工智能·语言模型·自动化
Wzx1980122 小时前
cozen平台开发智能体
人工智能
GISer_Jing2 小时前
AI原生前端工程化进阶实践:从流式交互架构到端云协同全链路落地
前端·人工智能·后端·学习
EnCi Zheng2 小时前
03ab-PyTorch安装教程 [特殊字符]
人工智能·pytorch·python
SmartBrain2 小时前
从Prompt工程到Harness工程:AI Agent落地之路
人工智能·python·华为·aigc