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

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

📘 小结

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

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

相关推荐
卷福同学4 小时前
不用服务器,不用配环境,我10分钟上线了一个AI Agent
人工智能·后端·算法
码兄科技5 小时前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
Zik----5 小时前
CCswitch-code
人工智能
至乐活着6 小时前
深入解析跳表SkipList:原理、实现与性能优化实战
数据结构·算法·跳表·skiplist·java实现
AI科技星6 小时前
全域谱分析:无穷维超复数信息场分形统一场论 ——自然、量子、金融多重分形第一性原理完整体系(中英双语终稿)
人工智能·机器学习·金融·乖乖数学·全域数学
stormzhangV7 小时前
为什么你的 AI 像智障
人工智能
Jerry7 小时前
LeetCode 383. 赎金信
算法
ai产品老杨7 小时前
H264 H265视频分析常见问题和排查清单
人工智能·算法·音视频
项目经理老王7 小时前
OpenClaw无捆绑安装包,安全纯净版AI助手部署
人工智能·安全
Jerry7 小时前
LeetCode 454. 四数相加 II
算法