【机器学习:逻辑回归】

作者:Keep__Fighting日期:2026/2/13

【逻辑回归】

1、简介

我们知道回归任务一般是处理线性问题的,预测结果是连续的,分类任务是结果是离散的。对于分类问题,在传统的机器学习算法中有很多解决方法,这里讲一下众多思想,其中之一——逻辑回归。
逻辑回归(Logistic Regression)通过将线性回归的输出映射到(0,1)区间,得到一个概率值,通过设定阈值的方式达到分类的效果,在此之中,使用Sigmoid函数将连续值转换为概率值,也即使用Sigmoid映射线性结果到(0,1)之间。

2、激活函数(概率映射)

在逻辑回归中,除了使用sigmoid函数用来激活,还有许多类似于sigmoid函数功能的其他函数。简单介绍一下:

  1. 阶跃函数:
    在这里插入图片描述
    阶跃函数是间断函数,它可以将大于0的值映射为1,小于0的值映射为0,达到分类的目的。
  2. Sigmoid:
    在这里插入图片描述
    sigmoid函数图像大致如上,他比阶跃函数更加的平滑,可以将任意的值,线性的映射到 [0, 1] 之间。sigmoid的函数表达式是:
    在这里插入图片描述
    这个函数求导之后形式非常简单:在这里插入图片描述
    这个导数公式在计算梯度下降等优化算法时非常有用,因此非常常用。
  3. Softmax 函数
    在这里插入图片描述
    Softmax 函数是多分类问题中常用的激活函数,尤其在逻辑回归扩展为多项式逻辑回归(Multinomial Logistic Regression)时。与 Sigmoid 相似,Softmax 也能将输出转换为概率,但它能处理多个类别。
    对于一个包含 kkk 个类别的模型,Softmax 函数的输出为:
    在这里插入图片描述
    其中,ziz_izi​是每个类别的原始预测值,kkk 是类别总数。Softmax 通过对每个类别的预测值应用指数函数,确保输出的概率之和为 1。
  4. ReLU 函数(Rectified Linear Unit)
    在这里插入图片描述
    ReLU 通常用于神经网络的隐藏层,但也可以在某些情况下作为激活函数。ReLU 的输出为输入值本身(对于正数)或者 0(对于负数),即:
    在这里插入图片描述
    虽然它不是逻辑回归的标准选择,ReLU 可用于回归任务或者在神经网络架构中使用。不过,如果用于逻辑回归,可能会导致输出没有界限,不再是概率值,且通常用于回归而非分类问题。
    在这里插入图片描述
  5. Tanh 函数(双曲正切函数)
    在这里插入图片描述

Tanh 函数是 Sigmoid 的一种变体,其输出范围是 [-1, 1],而 Sigmoid 的输出范围是 [0, 1],Tanh 函数将输入值压缩到更大的范围,对于输入较大的正负值,输出的梯度较小。
在这里插入图片描述

  1. Leaky ReLU
    在这里插入图片描述

与 ReLU 类似,但允许负数部分输出小的负值。
在这里插入图片描述
ααα 是一个较小的常数(通常取 0.01 或 0.02),表示在 xxx 为负时允许一部分梯度“泄露”通过。

3、交叉熵损失函数

对于分类问题,没办法像回归问题一样是数据的拟合,我们只是希望预测的结果正确的概率尽量的接近真实概率。分类问题的目标是让模型输出的概率分布接近真实标签的分布,回归问题则是直接让模型输出的数值接近目标值。交叉熵是度量两个概率分布之间差异的工具;而均方误差(MSE)是度量 两个数值之间距离 的工具。因此,从目标层面上看,交叉熵更符合分类问题的本质。所以对于分类问题,一般情况下都是使用交叉熵损失来衡量误差。

在这里先拿最简单的二分类问题来举例。对于独立同分布的伯努利分布来说,其随机变量只有两种取值:X = 1 (表示“成功”,概率为p);X = 0(表示“失败”,概率为 1 - p )
其概率质量函数为:
在这里插入图片描述
或简写:P(X=k)=pk(1−p)1−k,k∈{0,1}P(X=k) = p^k(1-p)^{1-k}, k\in\{0,1\}P(X=k)=pk(1−p)1−k,k∈{0,1}

假设:有样本[(𝑥1,𝑦1),(𝑥1,𝑦2)…,(𝑥𝑛,𝑦𝑛)][(𝑥_1, 𝑦_1), (𝑥_1, 𝑦_2) …, (𝑥_𝑛, 𝑦_𝑛) ][(x1​,y1​),(x1​,y2​)…,(xn​,yn​)],n个样本都预测正确的概率就是伯努利分布的似然函数:在这里插入图片描述
pip_ipi​表示每个样本被分类正确时的概率,yiy_iyi​ 表示每个样本的真实类别(0或1)。
问题转化为:让联合概率事件最大时,估计w、b的权重参数,这就是极大似然估计
极大似然估计(Maximum Likelihood Estimation, MLE) 用于从观测数据中估计概率分布的参数。其核心思想是:在已知观测数据的情况下,选择使得这些数据出现概率最大的参数值。
概率: 固定概率分布参数θθθ,研究随机变量 XXX 的分布。
似然: 固定观测数据 xxx,研究概率分布参数θθθ的可能性。

要让P最大,对其取负对数,直接得到交叉熵损失
在这里插入图片描述
所以,可以理解为伯努利分布的似然函数是逻辑回归交叉熵损失的来源。我们要最大化时间概率(进行极大似然估计),就等价于最小化交叉熵损失。这里为什么要取负对数,其实是为了方便计算,将累乘变成累加,并且实际的极值点位置是不变的。
在这里插入图片描述
更加简洁的对比例子:
假设已知一个事情发生了(抽到8次黑球,2次白球),求概率分布(箱子里黑球和白球的分布)。我们假设抽到黑球的概率为a,则抽到白球的概率为(1-a)。则抽到8次黑球,2次白球的似然函数为:L(a)=a8(1−a)2L(a)=a^8 (1−a) ^2L(a)=a8(1−a)2,注意这里抽到黑球的概率a为变量。a作为自变量,抽到8次黑球,2次白球事件的概率作为因变量。上式中的函数L(a)就是似然函数,我们可以绘制出这个函数的曲线:
在这里插入图片描述
因为a为概率,它的取值只能在0到1之间。所以上图我们只取了a在0到1之间似然函数的图像。上边我们列出了连续抽了10次,8次是黑球,2次是白球这个事件的似然函数,这个事件已经发生了,似然函数表达了不同的分布参数让这个事件发生的可能性。自然我们会想到,最有可能的参数必然是让事件发生可能性最大的那个参数。通过观察上图,我们可以看到当a取0.8时,似然函数取最大值。也就是说,基于观察结果,箱子里的球有80%是黑球,是最有可能让事件发生的。
现在我们对上式取对数得到:ln(L(a))=ln(a8(1−a)2)=8lna+2ln(1−a)ln(L(a)) = ln(a^8 (1-a)^2) = 8lna + 2ln(1-a)ln(L(a))=ln(a8(1−a)2)=8lna+2ln(1−a)。
图像为:
在这里插入图片描述
我们可以发现对原来的似然函数取对数,对数似然函数取得极值时的自变量并没有改变,还是0.8。

4、分类问题的模型评估指标

4.1 混淆矩阵

混淆矩阵是模型预测结果与实际标签的对比情况。
在这里插入图片描述
混淆矩阵的四个指标:

真实值是 正例 的样本中,被分类为 正例 的样本数量有多少,叫做真正例(TP,True Positive)
真实值是 正例 的样本中,被分类为 假例 的样本数量有多少,叫做伪反例(FN,False Negative)
真实值是 假例 的样本中,被分类为 正例 的样本数量有多少,叫做伪正例(FP,False Positive)
真实值是 假例 的样本中,被分类为 假例 的样本数量有多少,叫做真反例(TN,True Negative)

4.2 精确率

也叫查准率,对正例样本的预测准确率。计算方法为:
在这里插入图片描述
在这里插入图片描述

4.3 召回率

也叫查全率,指的是预测为真正例样本占所有真实正例样本的比重。计算方法:在这里插入图片描述
在这里插入图片描述

4.4 F1 Score

综合精确率、召回率的指标。计算公式:
在这里插入图片描述

4.5 ROC曲线、AUC指标

真正率TPR与假正率FPR:
1 正样本中被预测为正样本的概率TPR (True Positive Rate)
2 负样本中被预测为正样本的概率FPR (False Positive Rate)

ROC曲线以模型的真正率TPR为纵轴,假正率FPR为横轴,它将模型在不同阈值下的表现以曲线的形式展现出来。曲线越靠近 (0,1) 点则模型对正负样本的辨别能力就越强。ROC曲线的优劣可以通过曲线下的面积(AUC)来衡量,AUC越大表示分类器性能越好。
在这里插入图片描述
这里补充一点: ROC主要是对与判断模型阈值选择具有非常好的参考意义;AUC主要对模型之间的好坏进行一个评判,同一标准下面积大的当然是比面积小的模型效果更好。

另外,敏感性特异性也是选取模型的重要标准,他主要由目的决定。当我们需要准确的预测出正样本,那我们应当选取预测结果敏感性更高的模型,反之我们应当选择特异性更高的模型。

敏感性:
敏感性,亦称为 真阳性率(True Positive Rate,TPR),表示的是 测试正确识别正例的能力。举一个医学例子具体来说,它衡量的是所有实际患病者中,被测试正确判定为阳性(即患病)的比例。
计算方式为:
在这里插入图片描述

特异性:
特异性,亦称为 真阴性率(True Negative Rate,TNR),表示的是 测试正确识别出反例的能力。像医学例子中,它衡量的是所有实际未患病者中,被测试正确判定为阴性(即非患病)的比例。
计算公式为:
在这里插入图片描述

4.6 准确率

准确率就是模型预测正确的样本数占总样本数的比例。计算公式为:
在这里插入图片描述

5、API运用

5.1 API

逻辑回归API:

1sklearn.linear_model.LogisticRegression(solver='liblinear', penalty=‘l2’, C = 1.0)
2

参数:

1solver 损失函数优化方法:
2          1 liblinear 对小数据集场景训练速度更快,sag  saga 对大数据集更快一些。
3          2 正则化:
4	           1 sag、saga 支持 L2 正则化或者没有正则化
5	           2 liblinear  saga 支持 L1 正则化
6penalty:正则化的种类,l1 或者 l2
7C:正则化力度 
8

查看混淆矩阵API:

1sklearn.metrics.confusion_matrix()
2

分数API:

1from sklearn.metrics import ***
2accuracy_score() # 准确率
3precision_score()	# 精确率
4recall_score()	# 召回率
5f1_score()	# F1分数
6roc_auc_score(y_true, y_score)	# ROC、AUC
7sklearn.metrics.classification_report(y_true, y_pred, labels=[], target_names=None )	# 分类评估报告
8
5.2 案例

电信客户流失案例:

1import numpy as np
2import pandas as pd
3from sklearn.model_selection import train_test_split, GridSearchCV
4from sklearn.preprocessing import StandardScaler
5from sklearn.linear_model import LogisticRegression
6from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score, roc_auc_score, confusion_matrix, classification_report
7
8data = pd.read_csv('data/churn.csv')
9print(data.head())
10data_new = pd.get_dummies(data,drop_first=True)
11
12print(data_new.head())
13print(data_new.columns.values)
14Featrues = data_new[['Partner_att','Dependents_att','landline','internet_att',
15                     'StreamingTV','Contract_Month','Contract_1YR',
16                     'PaymentElectronic','MonthlyCharges']]
17
18labels = data_new['Churn_Yes']
19x_train, x_test, y_train, y_test = train_test_split(Featrues, labels, test_size=0.2, random_state=6, stratify=labels)
20
21ssm = StandardScaler()
22ssm.fit_transform(x_train)
23ssm.transform(x_test)
24
25lrm = LogisticRegression(solver='liblinear',penalty='l2', tol=1e-4, C=1.0, fit_intercept=True)
26lrm = GridSearchCV(lrm, param_grid={'C': np.arange(0.1, 1, 0.1)}, cv=6)
27lrm.fit(x_train, y_train)
28prediction = lrm.predict(x_test)
29
30# 逻辑回归模型评估
31print("准确率:", accuracy_score(y_test, prediction))
32print("精确率:", precision_score(y_test, prediction))
33print("召回率:", recall_score(y_test, prediction))
34print("F1:", f1_score(y_test, prediction))
35print("混淆矩阵", confusion_matrix(y_test, prediction, labels=[True, False]))
36print("ROC—AUC值:", roc_auc_score(y_test, prediction))
37print(classification_report(y_test, prediction))
38

【机器学习:逻辑回归】》 是转载文章,点击查看原文


相关推荐


Slidev:开发者专属的演示文稿神器
修己xj2026/2/5

最近我在逛GitHub时,发现了一个很有意思的项目——Slidev。如果用一句话来总结,那就是: 用 Markdown 写幻灯片,让技术分享更高效、更优雅。 今天就来给大家推荐一下这个项目。 ❓为什么选择 Slidev? 作为开发者,我们经常需要做技术分享、产品演示或会议报告。传统的演示工具(如 PowerPoint、Keynote)虽然功能强大,但对于代码展示和实时编程演示往往力不从心。这就是 Slidev 诞生的原因——专为开发者设计的演示文稿工具。 Slidev(Slide + de


机器学习特征选择:深入理解移除低方差特征与sklearn的VarianceThreshold
郝学胜-神的一滴2026/1/26

机器学习特征选择:深入理解移除低方差特征与sklearn的VarianceThreshold 引言:为什么特征选择如此重要?一、低方差特征为什么需要移除?1.1 低方差特征的问题1.2 低方差特征的典型场景1.3 数学表达 二、sklearn的VarianceThreshold详解2.1 基本用法2.2 关键参数说明2.3 重要属性 三、实战案例:电商用户行为分析3.1 数据集描述3.2 应用VarianceThreshold3.3 结果分析 四、进阶技巧与注意事项4.1 数据标准


用bhyve-webadmin来管理FreeBSD系统下的bhyve虚拟机(上)
skywalk81632026/1/17

BVCP((Bhyve Virtual-Machine Control Panel ,bhyve-webadmin )是一个图形化和安全的web控制面板,旨在管理FreeBSD bhyve虚拟机。BVCP专为数据中心级可靠性而设计,专为连续24/7运行而构建,专注于稳定性和性能。它是一个本机FreeBSD应用程序,具有简单的一键安装过程,确保快速轻松的部署。BVCP独立于系统配置运行,不修改现有设置,允许它在大多数环境中平稳运行。使用BVCP,管理员可以通过单个统一的界面管理多个物理主机,而不需


计算机视觉入门到实战系列(六)边缘检测sobel算子
_codemonster2026/1/9

边缘检测 一、核心原理:变化的度量二、核心步骤(传统方法)三、经典边缘检测算子sobel算子计算X轴方向梯度计算Y轴方向梯度聚合 一、核心原理:变化的度量 边缘的本质是图像函数(灰度值、颜色值)的突然变化或不连续性。在数学上,这种“变化”可以通过导数或梯度来度量。 一维信号类比:想象一个一维的灰度信号(一条扫描线)。在平坦区域,灰度值恒定,导数为 0。在斜坡(灰度渐变)区域,导数为一个非零常数。在阶跃(灰度突变,即边缘)处,导数会达到一个极值(峰值)。扩展到二维图像:对于二


redis常见问题分析
哈里谢顿2026/1/1

在高并发系统中,缓存(如 Redis)与数据库(如 MySQL)配合使用是提升性能的关键手段。但若设计不当,会引发四类经典问题:双写不一致、缓存穿透、缓存雪崩、缓存击穿。下面逐一详解其原理、危害及解决方案。 一、缓存与 DB 双写不一致(Cache-DB Inconsistency) 🔍 问题描述 当数据更新时,先更新数据库,再操作缓存(删除或更新),但由于网络延迟、程序异常或并发操作,导致 缓存与数据库中的数据短暂或长期不一致。 🧩 典型场景 线程 A 更新 DB → 删除缓存 线程


Python字典元素的增、删、改操作
咖啡の猫2025/12/22

一、前言 字典(dict)是 Python 中最灵活的数据结构之一,支持动态地增加、删除、修改键值对。 然而,看似简单的操作背后,却隐藏着引用共享、内存管理、安全边界等细节。 你是否遇到过这些问题? 修改一个字典,另一个变量也跟着变了?用 d[key] = value 覆盖了重要数据却没察觉?在遍历字典时删除元素,结果报错?想批量更新配置,但代码又长又难维护? 本文将带你: ✅ 掌握字典“增、删、改”的所有核心方法 ✅ 理解 update()、字典解包、| 合并等高级技巧 ✅ 避开引用共


Action和Func
林杜雨都2025/12/14

1. 为什么需要 Action 和 Func? 在 C# 中,我们经常需要将方法作为参数传递给其他方法,或者将方法存储在变量中以便稍后调用。传统上,我们需要先定义一个与目标方法签名完全匹配的委托类型,这非常繁琐。 例如,如果我们想传递一个没有返回值、有两个 int 参数的方法,我们需要这样写: // 1. 自定义委托类型 public delegate void MyCustomDelegate(int a, int b); // 2. 定义一个符合该签名的方法 public stati


【Claude Code】长时间运行 agents 的有效控制框架
是魔丸啊2025/12/6

转载 Harness原意是马具,从马具控制马匹,引申为一个控制和管理框架,用于封装、引导和监督AI代理的行为。后文为了保持原意,作为专有名词不翻译了。 文中提到的initializer agent / coding agent,并不是claude code已经内置的机制,而是一个最佳实践,需要自行配置。如果想要prompt,可以去这里寻找: github.com/anthropics/… 随着 AI agents 变得更加强大,开发者越来越多地要求它们承担需要跨越数小时甚至数天工作的复杂任务


《 Linux 修炼全景指南: 七 》 指尖下的利刃:深入理解 Vim 的高效世界
Lenyiin2025/11/28

摘要 本篇《Linux Vim 入门指南》从零开始,系统而全面地介绍了 Vim 的操作理念、基础模式、光标移动、文本编辑、搜索替换、可视化模式、多窗口与多文件协作等核心能力,并深入讲解 Vim 配置、插件体系与高效编辑技巧。文章不仅涵盖新手最容易踩的坑,还通过实战示例带你完成一次完整的编辑任务,使读者不但 “会用 Vim”,更真正理解 Vim 背后的高效思维方式。无论你是 Linux 新手,还是想进一步提升编辑效率的开发者,这篇指南都将成为你学习 Vim 的最佳起点。 1、引言:为什么学 Vi


AGENTS.md 真的对 AI Coding 有用吗?或许在此之前你没用对?
恋猫de小郭2026/2/22

AGENTS.md 相信大家应该不陌生,它们一般都是被放在根目录的典型 Context Files ,这些文件被默认作为 Coding Agnet 的 「README」,一般是用来提供仓库概览、工具链指令、编码规范或者设计模式等,不少 Agent 还提供 /init 之类命令自动生成这些文件。 实际上在此之前大家都是 GEMINI.md 、CLAUDE.md 、copilot-instructions.md 之类的各自为政,而 2025 之后,OpenAI、谷歌、Cursor 和 Source

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 XYZ博客